Skip to content

Commit

Permalink
mm: consolidate warn_alloc_failed users
Browse files Browse the repository at this point in the history
warn_alloc_failed is currently used from the page and vmalloc
allocators.  This is a good reuse of the code except that vmalloc would
appreciate a slightly different warning message.  This is already
handled by the fmt parameter except that

  "%s: page allocation failure: order:%u, mode:%#x(%pGg)"

is printed anyway.  This might be quite misleading because it might be a
vmalloc failure which leads to the warning while the page allocator is
not the culprit here.  Fix this by always using the fmt string and only
print the context that makes sense for the particular context (e.g.
order makes only very little sense for the vmalloc context).

Rename the function to not miss any user and also because a later patch
will reuse it also for !failure cases.

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Michal Hocko <[email protected]>
Acked-by: Vlastimil Babka <[email protected]>
Cc: Tetsuo Handa <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Mel Gorman <[email protected]>
Cc: Dave Hansen <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Michal Hocko authored and torvalds committed Oct 8, 2016
1 parent c2a9737 commit 7877cdc
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 26 deletions.
5 changes: 2 additions & 3 deletions include/linux/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1916,9 +1916,8 @@ extern void si_meminfo_node(struct sysinfo *val, int nid);
extern unsigned long arch_reserved_kernel_pages(void);
#endif

extern __printf(3, 4)
void warn_alloc_failed(gfp_t gfp_mask, unsigned int order,
const char *fmt, ...);
extern __printf(2, 3)
void warn_alloc(gfp_t gfp_mask, const char *fmt, ...);

extern void setup_per_cpu_pageset(void);

Expand Down
27 changes: 12 additions & 15 deletions mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2979,9 +2979,11 @@ static DEFINE_RATELIMIT_STATE(nopage_rs,
DEFAULT_RATELIMIT_INTERVAL,
DEFAULT_RATELIMIT_BURST);

void warn_alloc_failed(gfp_t gfp_mask, unsigned int order, const char *fmt, ...)
void warn_alloc(gfp_t gfp_mask, const char *fmt, ...)
{
unsigned int filter = SHOW_MEM_FILTER_NODES;
struct va_format vaf;
va_list args;

if ((gfp_mask & __GFP_NOWARN) || !__ratelimit(&nopage_rs) ||
debug_guardpage_minorder() > 0)
Expand All @@ -2999,22 +3001,16 @@ void warn_alloc_failed(gfp_t gfp_mask, unsigned int order, const char *fmt, ...)
if (in_interrupt() || !(gfp_mask & __GFP_DIRECT_RECLAIM))
filter &= ~SHOW_MEM_FILTER_NODES;

if (fmt) {
struct va_format vaf;
va_list args;
pr_warn("%s: ", current->comm);

va_start(args, fmt);
va_start(args, fmt);
vaf.fmt = fmt;
vaf.va = &args;
pr_cont("%pV", &vaf);
va_end(args);

vaf.fmt = fmt;
vaf.va = &args;
pr_cont(", mode:%#x(%pGg)\n", gfp_mask, &gfp_mask);

pr_warn("%pV", &vaf);

va_end(args);
}

pr_warn("%s: page allocation failure: order:%u, mode:%#x(%pGg)\n",
current->comm, order, gfp_mask, &gfp_mask);
dump_stack();
if (!should_suppress_show_mem())
show_mem(filter);
Expand Down Expand Up @@ -3680,7 +3676,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
}

nopage:
warn_alloc_failed(gfp_mask, order, NULL);
warn_alloc(gfp_mask,
"page allocation failure: order:%u", order);
got_pg:
return page;
}
Expand Down
14 changes: 6 additions & 8 deletions mm/vmalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1601,7 +1601,6 @@ static void *__vmalloc_node(unsigned long size, unsigned long align,
static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
pgprot_t prot, int node)
{
const int order = 0;
struct page **pages;
unsigned int nr_pages, array_size, i;
const gfp_t nested_gfp = (gfp_mask & GFP_RECLAIM_MASK) | __GFP_ZERO;
Expand Down Expand Up @@ -1629,9 +1628,9 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
struct page *page;

if (node == NUMA_NO_NODE)
page = alloc_pages(alloc_mask, order);
page = alloc_page(alloc_mask);
else
page = alloc_pages_node(node, alloc_mask, order);
page = alloc_pages_node(node, alloc_mask, 0);

if (unlikely(!page)) {
/* Successfully allocated i pages, free them in __vunmap() */
Expand All @@ -1648,8 +1647,8 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
return area->addr;

fail:
warn_alloc_failed(gfp_mask, order,
"vmalloc: allocation failure, allocated %ld of %ld bytes\n",
warn_alloc(gfp_mask,
"vmalloc: allocation failure, allocated %ld of %ld bytes",
(area->nr_pages*PAGE_SIZE), area->size);
vfree(area->addr);
return NULL;
Expand Down Expand Up @@ -1710,9 +1709,8 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align,
return addr;

fail:
warn_alloc_failed(gfp_mask, 0,
"vmalloc: allocation failure: %lu bytes\n",
real_size);
warn_alloc(gfp_mask,
"vmalloc: allocation failure: %lu bytes", real_size);
return NULL;
}

Expand Down

0 comments on commit 7877cdc

Please sign in to comment.