aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMel Gorman <mgorman@suse.de>2014-06-04 19:10:14 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-04 19:54:09 -0400
commit5dab29113ca56335c78be3f98bf5ddf2ef8eb6a6 (patch)
tree337e4f57205a98200e1c34675aa404f5301b6736
parenta6e21b14f22041382e832d30deda6f26f37b1097 (diff)
mm: page_alloc: take the ALLOC_NO_WATERMARK check out of the fast path
ALLOC_NO_WATERMARK is set in a few cases. Always by kswapd, always for __GFP_MEMALLOC, sometimes for swap-over-nfs, tasks etc. Each of these cases are relatively rare events but the ALLOC_NO_WATERMARK check is an unlikely branch in the fast path. This patch moves the check out of the fast path and after it has been determined that the watermarks have not been met. This helps the common fast path at the cost of making the slow path slower and hitting kswapd with a performance cost. It's a reasonable tradeoff. Signed-off-by: Mel Gorman <mgorman@suse.de> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Reviewed-by: Rik van Riel <riel@redhat.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Jan Kara <jack@suse.cz> Cc: Michal Hocko <mhocko@suse.cz> Cc: Hugh Dickins <hughd@google.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Theodore Ts'o <tytso@mit.edu> Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/page_alloc.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 30f327a720fd..485932c577e7 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1937,9 +1937,6 @@ zonelist_scan:
1937 (alloc_flags & ALLOC_CPUSET) && 1937 (alloc_flags & ALLOC_CPUSET) &&
1938 !cpuset_zone_allowed_softwall(zone, gfp_mask)) 1938 !cpuset_zone_allowed_softwall(zone, gfp_mask))
1939 continue; 1939 continue;
1940 BUILD_BUG_ON(ALLOC_NO_WATERMARKS < NR_WMARK);
1941 if (unlikely(alloc_flags & ALLOC_NO_WATERMARKS))
1942 goto try_this_zone;
1943 /* 1940 /*
1944 * Distribute pages in proportion to the individual 1941 * Distribute pages in proportion to the individual
1945 * zone size to ensure fair page aging. The zone a 1942 * zone size to ensure fair page aging. The zone a
@@ -1986,6 +1983,11 @@ zonelist_scan:
1986 classzone_idx, alloc_flags)) { 1983 classzone_idx, alloc_flags)) {
1987 int ret; 1984 int ret;
1988 1985
1986 /* Checked here to keep the fast path fast */
1987 BUILD_BUG_ON(ALLOC_NO_WATERMARKS < NR_WMARK);
1988 if (alloc_flags & ALLOC_NO_WATERMARKS)
1989 goto try_this_zone;
1990
1989 if (IS_ENABLED(CONFIG_NUMA) && 1991 if (IS_ENABLED(CONFIG_NUMA) &&
1990 !did_zlc_setup && nr_online_nodes > 1) { 1992 !did_zlc_setup && nr_online_nodes > 1) {
1991 /* 1993 /*