Re: [PATCH RFC] mm: vmalloc: do not allow kzalloc to fail

From: David Rientjes
Date: Fri Dec 21 2018 - 16:58:44 EST


On Thu, 20 Dec 2018, Nicholas Mc Guire wrote:

> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> index 871e41c..1c118d7 100644
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -1258,7 +1258,7 @@ void __init vmalloc_init(void)
>
> /* Import existing vmlist entries. */
> for (tmp = vmlist; tmp; tmp = tmp->next) {
> - va = kzalloc(sizeof(struct vmap_area), GFP_NOWAIT);
> + va = kzalloc(sizeof(*va), GFP_NOWAIT | __GFP_NOFAIL);
> va->flags = VM_VM_AREA;
> va->va_start = (unsigned long)tmp->addr;
> va->va_end = va->va_start + tmp->size;

Hi Nicholas,

You're right that this looks wrong because there's no guarantee that va is
actually non-NULL. __GFP_NOFAIL won't help in init, unfortunately, since
we're not giving the page allocator a chance to reclaim so this would
likely just end up looping forever instead of crashing with a NULL pointer
dereference, which would actually be the better result.

You could do

BUG_ON(!va);

to make it obvious why we crashed, however. It makes it obvious that the
crash is intentional rather than some error in the kernel code.