Message ID | 20130627093917.GQ7171@linux-mips.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 27 Jun 2013 11:39:17 +0200 Ralf Baechle <ralf@linux-mips.org> wrote: > Imho de7d2b567d040e3b67fe7121945982f14343213d [mm/vmalloc.c: report more > vmalloc failures] is overly strict in that it also reports zero-sized > allocations. I consider such allocations stupid but legitimiate and often > better preferrable over having to scatter checks for zero size all over > place. So maybe something like below patch? > > ... > > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -1679,7 +1679,10 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align, > unsigned long real_size = size; > > size = PAGE_ALIGN(size); > - if (!size || (size >> PAGE_SHIFT) > totalram_pages) > + if (unlikely(!size)) > + return NULL; > + > + if ((size >> PAGE_SHIFT) > totalram_pages) > goto fail; > > area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNLIST, > @@ -1711,6 +1714,7 @@ fail: > warn_alloc_failed(gfp_mask, 0, > "vmalloc: allocation failure: %lu bytes\n", > real_size); > + > return NULL; > } If the caller actually dereferences the returned pointer the kernel will go oops, which should provide adequate notification of a programming error ;) But all callers should be checking the return value. So I worry about the by-far-most-common case where code does size = some_screwed_up_calculation(); p = vmalloc(size); if (!p) return -ENOMEM; So the mistake gets propagated back to who-knows-where as memory exhaustion and thereby becomes a lot harder to diagnose. How many callsites really truly need to be edited to avoid the warning? Veli-Pekka's original patch would be neater if we were to add a new void *__vmalloc_node_range_zero_size_ok(<args>) { if (size == 0) return NULL; return __vmalloc_node_range(<args>); } (with a better name than __vmalloc_node_range_zero_size_ok!)
On Thu, 2013-06-27 at 15:23 -0700, Andrew Morton wrote: > On Thu, 27 Jun 2013 11:39:17 +0200 Ralf Baechle <ralf@linux-mips.org> wrote: [] > Veli-Pekka's original patch would be neater if we were to add a new > > void *__vmalloc_node_range_zero_size_ok(<args>) > { > if (size == 0) > return NULL; I believe you mean return ZERO_SIZE_PTR;
Joe Perches <joe@perches.com> writes: > On Thu, 2013-06-27 at 15:23 -0700, Andrew Morton wrote: >> On Thu, 27 Jun 2013 11:39:17 +0200 Ralf Baechle <ralf@linux-mips.org> wrote: > [] >> Veli-Pekka's original patch would be neater if we were to add a new >> >> void *__vmalloc_node_range_zero_size_ok(<args>) >> { >> if (size == 0) >> return NULL; > > I believe you mean > return ZERO_SIZE_PTR; Yes, this is the Right Fix. Thanks, Rusty.
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index d365724..e58ca10 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -1679,7 +1679,10 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align, unsigned long real_size = size; size = PAGE_ALIGN(size); - if (!size || (size >> PAGE_SHIFT) > totalram_pages) + if (unlikely(!size)) + return NULL; + + if ((size >> PAGE_SHIFT) > totalram_pages) goto fail; area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNLIST, @@ -1711,6 +1714,7 @@ fail: warn_alloc_failed(gfp_mask, 0, "vmalloc: allocation failure: %lu bytes\n", real_size); + return NULL; }