linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Mel Gorman <mgorman@techsingularity.net>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Vlastimil Babka <vbabka@suse.cz>, Linux-MM <linux-mm@kvack.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Mel Gorman <mgorman@techsingularity.net>
Subject: [PATCH 17/22] mm, page_alloc: Reduce cost of fair zone allocation policy retry
Date: Mon, 11 Apr 2016 09:13:40 +0100	[thread overview]
Message-ID: <1460362424-26369-18-git-send-email-mgorman@techsingularity.net> (raw)
In-Reply-To: <1460362424-26369-1-git-send-email-mgorman@techsingularity.net>

The fair zone allocation policy is not without cost but it can be reduced
slightly. This patch removes an unnecessary local variable, checks the
likely conditions of the fair zone policy first, uses a bool instead of
a flags check and falls through when a remote node is encountered instead
of doing a full restart. The benefit is marginal but it's there

                                           4.6.0-rc2                  4.6.0-rc2
                                       decstat-v1r11              optfair-v1r12
Min      alloc-odr0-1               382.00 (  0.00%)           370.00 (  3.14%)
Min      alloc-odr0-2               275.00 (  0.00%)           271.00 (  1.45%)
Min      alloc-odr0-4               228.00 (  0.00%)           227.00 (  0.44%)
Min      alloc-odr0-8               199.00 (  0.00%)           197.00 (  1.01%)
Min      alloc-odr0-16              186.00 (  0.00%)           182.00 (  2.15%)
Min      alloc-odr0-32              178.00 (  0.00%)           175.00 (  1.69%)
Min      alloc-odr0-64              174.00 (  0.00%)           171.00 (  1.72%)
Min      alloc-odr0-128             172.00 (  0.00%)           169.00 (  1.74%)
Min      alloc-odr0-256             181.00 (  0.00%)           179.00 (  1.10%)
Min      alloc-odr0-512             193.00 (  0.00%)           192.00 (  0.52%)
Min      alloc-odr0-1024            200.00 (  0.00%)           201.00 ( -0.50%)
Min      alloc-odr0-2048            206.00 (  0.00%)           205.00 (  0.49%)
Min      alloc-odr0-4096            212.00 (  0.00%)           211.00 (  0.47%)
Min      alloc-odr0-8192            215.00 (  0.00%)           214.00 (  0.47%)
Min      alloc-odr0-16384           215.00 (  0.00%)           214.00 (  0.47%)

One of the most important benefits -- avoiding a second search when
falling back to another node is not triggered by this particular test so
the benefit for some corner cases is understated.

Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
---
 mm/page_alloc.c | 32 ++++++++++++++------------------
 1 file changed, 14 insertions(+), 18 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 219e0d05ed88..25a8ab07b287 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2675,12 +2675,10 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
 {
 	struct zoneref *z;
 	struct zone *zone;
-	bool fair_skipped;
-	bool zonelist_rescan;
+	bool fair_skipped = false;
+	bool apply_fair = (alloc_flags & ALLOC_FAIR);
 
 zonelist_scan:
-	zonelist_rescan = false;
-
 	/*
 	 * Scan zonelist, looking for a zone with enough free.
 	 * See also __cpuset_node_allowed() comment in kernel/cpuset.c.
@@ -2700,13 +2698,16 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
 		 * page was allocated in should have no effect on the
 		 * time the page has in memory before being reclaimed.
 		 */
-		if (alloc_flags & ALLOC_FAIR) {
-			if (!zone_local(ac->preferred_zone, zone))
-				break;
+		if (apply_fair) {
 			if (test_bit(ZONE_FAIR_DEPLETED, &zone->flags)) {
 				fair_skipped = true;
 				continue;
 			}
+			if (!zone_local(ac->preferred_zone, zone)) {
+				if (fair_skipped)
+					goto reset_fair;
+				apply_fair = false;
+			}
 		}
 		/*
 		 * When allocating a page cache page for writing, we
@@ -2795,18 +2796,13 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
 	 * include remote zones now, before entering the slowpath and waking
 	 * kswapd: prefer spilling to a remote zone over swapping locally.
 	 */
-	if (alloc_flags & ALLOC_FAIR) {
-		alloc_flags &= ~ALLOC_FAIR;
-		if (fair_skipped) {
-			zonelist_rescan = true;
-			reset_alloc_batches(ac->preferred_zone);
-		}
-		if (nr_online_nodes > 1)
-			zonelist_rescan = true;
-	}
-
-	if (zonelist_rescan)
+	if (fair_skipped) {
+reset_fair:
+		apply_fair = false;
+		fair_skipped = false;
+		reset_alloc_batches(ac->preferred_zone);
 		goto zonelist_scan;
+	}
 
 	return NULL;
 }
-- 
2.6.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2016-04-11  8:15 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-11  8:13 [PATCH 00/21] Optimise page alloc/free fast paths Mel Gorman
2016-04-11  8:13 ` [PATCH 01/22] mm, page_alloc: Only check PageCompound for high-order pages Mel Gorman
2016-04-11  8:13 ` [PATCH 02/22] mm, page_alloc: Use new PageAnonHead helper in the free page fast path Mel Gorman
2016-04-11  8:13 ` [PATCH 03/22] mm, page_alloc: Reduce branches in zone_statistics Mel Gorman
2016-04-11  8:13 ` [PATCH 04/22] mm, page_alloc: Inline zone_statistics Mel Gorman
2016-04-11  8:13 ` [PATCH 05/22] mm, page_alloc: Inline the fast path of the zonelist iterator Mel Gorman
2016-04-11  8:13 ` [PATCH 06/22] mm, page_alloc: Use __dec_zone_state for order-0 page allocation Mel Gorman
2016-04-11  8:13 ` [PATCH 07/22] mm, page_alloc: Avoid unnecessary zone lookups during pageblock operations Mel Gorman
2016-04-11  8:13 ` [PATCH 08/22] mm, page_alloc: Convert alloc_flags to unsigned Mel Gorman
2016-04-11  8:13 ` [PATCH 09/22] mm, page_alloc: Convert nr_fair_skipped to bool Mel Gorman
2016-04-11  8:13 ` [PATCH 10/22] mm, page_alloc: Remove unnecessary local variable in get_page_from_freelist Mel Gorman
2016-04-11  8:13 ` [PATCH 11/22] mm, page_alloc: Remove unnecessary initialisation " Mel Gorman
2016-04-11  8:13 ` [PATCH 12/22] mm, page_alloc: Remove unnecessary initialisation from __alloc_pages_nodemask() Mel Gorman
2016-04-11  8:13 ` [PATCH 13/22] mm, page_alloc: Remove redundant check for empty zonelist Mel Gorman
2016-04-11  8:13 ` [PATCH 14/22] mm, page_alloc: Simplify last cpupid reset Mel Gorman
2016-04-11  8:13 ` [PATCH 15/22] mm, page_alloc: Move might_sleep_if check to the allocator slowpath Mel Gorman
2016-04-11  8:13 ` [PATCH 16/22] mm, page_alloc: Move __GFP_HARDWALL modifications out of the fastpath Mel Gorman
2016-04-11  8:13 ` Mel Gorman [this message]
2016-04-11  8:13 ` [PATCH 18/22] mm, page_alloc: Shortcut watermark checks for order-0 pages Mel Gorman
2016-04-11  8:13 ` [PATCH 19/22] mm, page_alloc: Avoid looking up the first zone in a zonelist twice Mel Gorman
2016-04-11  8:13 ` [PATCH 20/22] mm, page_alloc: Check multiple page fields with a single branch Mel Gorman
2016-04-11  8:13 ` [PATCH 21/22] cpuset: use static key better and convert to new API Mel Gorman
2016-04-11  8:18 ` [PATCH 00/21] Optimise page alloc/free fast paths Mel Gorman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1460362424-26369-18-git-send-email-mgorman@techsingularity.net \
    --to=mgorman@techsingularity.net \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=vbabka@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).