Messages in this thread | | | Subject | Re: [PATCH 2] mm/kvmalloc: do not call kmalloc for size > KMALLOC_MAX_SIZE | From | Konstantin Khlebnikov <> | Date | Thu, 1 Nov 2018 19:42:48 +0300 |
| |
On 01.11.2018 15:55, Michal Hocko wrote: > On Thu 01-11-18 13:48:17, Konstantin Khlebnikov wrote: >> >> >> On 01.11.2018 13:24, Michal Hocko wrote: >>> On Thu 01-11-18 13:09:16, Konstantin Khlebnikov wrote: >>>> Allocations over KMALLOC_MAX_SIZE could be served only by vmalloc. >>> >>> I would go on and say that allocations with sizes too large can actually >>> trigger a warning (once you have posted in the previous version outside >>> of the changelog area) because that might be interesting to people - >>> there are deployments to panic on warning and then a warning is much >>> more important. >> >> It seems that warning isn't completely valid. >> >> >> __alloc_pages_slowpath() handles this more gracefully: >> >> /* >> * In the slowpath, we sanity check order to avoid ever trying to >> * reclaim >= MAX_ORDER areas which will never succeed. Callers may >> * be using allocators in order of preference for an area that is >> * too large. >> */ >> if (order >= MAX_ORDER) { >> WARN_ON_ONCE(!(gfp_mask & __GFP_NOWARN)); >> return NULL; >> } >> >> >> Fast path is ready for order >= MAX_ORDER >> >> >> Problem is in node_reclaim() which is called earlier than __alloc_pages_slowpath() >> from surprising place - get_page_from_freelist() >> >> >> Probably node_reclaim() simply needs something like this: >> >> if (order >= MAX_ORDER) >> return NODE_RECLAIM_NOSCAN; > > Maybe but the point is that triggering this warning is possible. Even if > the warning is bogus it doesn't really make much sense to even try > kmalloc if the size is not supported by the allocator. >
But __GFP_NOWARN allocation (like in this case) should just fail silently without warnings regardless of reason because caller can deal with that.
Without __GFP_NOWARN allocator should print standard warning.
Caller anyway must handle NULL\ENOMEM result - this error path should be used for handling impossible sizes too. Of course it could check size first, just as optimization.
| |