mirror of https://gitee.com/openkylin/linux.git
oom: suppress show_mem() for many nodes in irq context on page alloc failure
When a page allocation failure occurs, show_mem() is called to dump the state of the VM so users may understand what happened to get into that condition. This output, however, can be extremely verbose. In irq context, it may result in significant delays that incur NMI watchdog timeouts when the machine is large (we use CONFIG_NODES_SHIFT > 8 here to define a "large" machine since the length of the show_mem() output is proportional to the number of possible nodes). This patch suppresses the show_mem() call in irq context when the kernel has CONFIG_NODES_SHIFT > 8. Signed-off-by: David Rientjes <rientjes@google.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ddd588b5dd
commit
29423e77c0
|
@ -1714,6 +1714,20 @@ get_page_from_freelist(gfp_t gfp_mask, nodemask_t *nodemask, unsigned int order,
|
|||
return page;
|
||||
}
|
||||
|
||||
/*
|
||||
* Large machines with many possible nodes should not always dump per-node
|
||||
* meminfo in irq context.
|
||||
*/
|
||||
static inline bool should_suppress_show_mem(void)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
#if NODES_SHIFT > 8
|
||||
ret = in_interrupt();
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
should_alloc_retry(gfp_t gfp_mask, unsigned int order,
|
||||
unsigned long pages_reclaimed)
|
||||
|
@ -2161,7 +2175,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
|
|||
" order:%d, mode:0x%x\n",
|
||||
current->comm, order, gfp_mask);
|
||||
dump_stack();
|
||||
show_mem();
|
||||
if (!should_suppress_show_mem())
|
||||
show_mem();
|
||||
}
|
||||
return page;
|
||||
got_pg:
|
||||
|
|
Loading…
Reference in New Issue