aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorDavid Rientjes <rientjes@google.com>2011-03-22 19:30:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-22 20:44:01 -0400
commit29423e77c06cee7d4e335ef4a7cbd949da978c91 (patch)
tree4020036f36a8fb93d4c1010f59caa36742ff5c25 /mm/page_alloc.c
parentddd588b5dd55f14320379961e47683db4e4c1d90 (diff)
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>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 36be3ba4bbed..2aaafe82f513 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1714,6 +1714,20 @@ try_next_zone:
1714 return page; 1714 return page;
1715} 1715}
1716 1716
1717/*
1718 * Large machines with many possible nodes should not always dump per-node
1719 * meminfo in irq context.
1720 */
1721static inline bool should_suppress_show_mem(void)
1722{
1723 bool ret = false;
1724
1725#if NODES_SHIFT > 8
1726 ret = in_interrupt();
1727#endif
1728 return ret;
1729}
1730
1717static inline int 1731static inline int
1718should_alloc_retry(gfp_t gfp_mask, unsigned int order, 1732should_alloc_retry(gfp_t gfp_mask, unsigned int order,
1719 unsigned long pages_reclaimed) 1733 unsigned long pages_reclaimed)
@@ -2161,7 +2175,8 @@ nopage:
2161 " order:%d, mode:0x%x\n", 2175 " order:%d, mode:0x%x\n",
2162 current->comm, order, gfp_mask); 2176 current->comm, order, gfp_mask);
2163 dump_stack(); 2177 dump_stack();
2164 show_mem(); 2178 if (!should_suppress_show_mem())
2179 show_mem();
2165 } 2180 }
2166 return page; 2181 return page;
2167got_pg: 2182got_pg: