| From: Lorenzo Stoakes <lstoakes@gmail.com> |
| Subject: mm/vmalloc: do not output a spurious warning when huge vmalloc() fails |
| Date: Mon, 5 Jun 2023 21:11:07 +0100 |
| |
| In __vmalloc_area_node() we always warn_alloc() when an allocation |
| performed by vm_area_alloc_pages() fails unless it was due to a pending |
| fatal signal. |
| |
| However, huge page allocations instigated either by vmalloc_huge() or |
| __vmalloc_node_range() (or a caller that invokes this like kvmalloc() or |
| kvmalloc_node()) always falls back to order-0 allocations if the huge page |
| allocation fails. |
| |
| This renders the warning useless and noisy, especially as all callers |
| appear to be aware that this may fallback. This has already resulted in |
| at least one bug report from a user who was confused by this (see link). |
| |
| Therefore, simply update the code to only output this warning for order-0 |
| pages when no fatal signal is pending. |
| |
| Link: https://bugzilla.suse.com/show_bug.cgi?id=1211410 |
| Link: https://lkml.kernel.org/r/20230605201107.83298-1-lstoakes@gmail.com |
| Fixes: 80b1d8fdfad1 ("mm: vmalloc: correct use of __GFP_NOWARN mask in __vmalloc_area_node()") |
| Signed-off-by: Lorenzo Stoakes <lstoakes@gmail.com> |
| Acked-by: Vlastimil Babka <vbabka@suse.cz> |
| Reviewed-by: Baoquan He <bhe@redhat.com> |
| Acked-by: Michal Hocko <mhocko@suse.com> |
| Reviewed-by: Uladzislau Rezki (Sony) <urezki@gmail.com> |
| Reviewed-by: David Hildenbrand <david@redhat.com> |
| Cc: Christoph Hellwig <hch@infradead.org> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/vmalloc.c | 17 +++++++++++++---- |
| 1 file changed, 13 insertions(+), 4 deletions(-) |
| |
| --- a/mm/vmalloc.c~mm-vmalloc-do-not-output-a-spurious-warning-when-huge-vmalloc-fails |
| +++ a/mm/vmalloc.c |
| @@ -3098,11 +3098,20 @@ static void *__vmalloc_area_node(struct |
| * allocation request, free them via vfree() if any. |
| */ |
| if (area->nr_pages != nr_small_pages) { |
| - /* vm_area_alloc_pages() can also fail due to a fatal signal */ |
| - if (!fatal_signal_pending(current)) |
| + /* |
| + * vm_area_alloc_pages() can fail due to insufficient memory but |
| + * also:- |
| + * |
| + * - a pending fatal signal |
| + * - insufficient huge page-order pages |
| + * |
| + * Since we always retry allocations at order-0 in the huge page |
| + * case a warning for either is spurious. |
| + */ |
| + if (!fatal_signal_pending(current) && page_order == 0) |
| warn_alloc(gfp_mask, NULL, |
| - "vmalloc error: size %lu, page order %u, failed to allocate pages", |
| - area->nr_pages * PAGE_SIZE, page_order); |
| + "vmalloc error: size %lu, failed to allocate pages", |
| + area->nr_pages * PAGE_SIZE); |
| goto fail; |
| } |
| |
| _ |