linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: linux-mm@kvack.org, Andrew Morton <akpm@linux-foundation.org>,
	David Rientjes <rientjes@google.com>
Cc: linux-kernel@vger.kernel.org, Vlastimil Babka <vbabka@suse.cz>,
	Minchan Kim <minchan@kernel.org>, Mel Gorman <mgorman@suse.de>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Michal Nazarewicz <mina86@mina86.com>,
	Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>,
	Christoph Lameter <cl@linux.com>, Rik van Riel <riel@redhat.com>,
	Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Subject: [PATCH V4 03/15] mm, compaction: do not count compact_stall if all zones skipped compaction
Date: Wed, 16 Jul 2014 15:48:11 +0200	[thread overview]
Message-ID: <1405518503-27687-4-git-send-email-vbabka@suse.cz> (raw)
In-Reply-To: <1405518503-27687-1-git-send-email-vbabka@suse.cz>

The compact_stall vmstat counter counts the number of allocations stalled by
direct compaction. It does not count when all attempted zones had deferred
compaction, but it does count when all zones skipped compaction. The skipping
is decided based on very early check of compaction_suitable(), based on
watermarks and memory fragmentation. Therefore it makes sense not to count
skipped compactions as stalls. Moreover, compact_success or compact_fail is
also already not being counted when compaction was skipped, so this patch
changes the compact_stall counting to match the other two.

Additionally, restructure __alloc_pages_direct_compact() code for better
readability.

Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Michal Nazarewicz <mina86@mina86.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: David Rientjes <rientjes@google.com>
---
 mm/page_alloc.c | 75 +++++++++++++++++++++++++++++++--------------------------
 1 file changed, 41 insertions(+), 34 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 963dacd..69a14b7 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2251,6 +2251,7 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
 	unsigned long *did_some_progress)
 {
 	struct zone *last_compact_zone = NULL;
+	struct page *page;
 
 	if (!order)
 		return NULL;
@@ -2262,49 +2263,55 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
 						&last_compact_zone);
 	current->flags &= ~PF_MEMALLOC;
 
-	if (*did_some_progress > COMPACT_DEFERRED)
-		count_vm_event(COMPACTSTALL);
-	else
+	switch (*did_some_progress) {
+	case COMPACT_DEFERRED:
 		*deferred_compaction = true;
+		/* fall-through */
+	case COMPACT_SKIPPED:
+		return NULL;
+	default:
+		break;
+	}
 
-	if (*did_some_progress > COMPACT_SKIPPED) {
-		struct page *page;
+	/*
+	 * At least in one zone compaction wasn't deferred or skipped, so let's
+	 * count a compaction stall
+	 */
+	count_vm_event(COMPACTSTALL);
 
-		/* Page migration frees to the PCP lists but we want merging */
-		drain_pages(get_cpu());
-		put_cpu();
+	/* Page migration frees to the PCP lists but we want merging */
+	drain_pages(get_cpu());
+	put_cpu();
 
-		page = get_page_from_freelist(gfp_mask, nodemask,
-				order, zonelist, high_zoneidx,
-				alloc_flags & ~ALLOC_NO_WATERMARKS,
-				preferred_zone, classzone_idx, migratetype);
+	page = get_page_from_freelist(gfp_mask, nodemask,
+			order, zonelist, high_zoneidx,
+			alloc_flags & ~ALLOC_NO_WATERMARKS,
+			preferred_zone, classzone_idx, migratetype);
 
-		if (page) {
-			struct zone *zone = page_zone(page);
+	if (page) {
+		struct zone *zone = page_zone(page);
 
-			zone->compact_blockskip_flush = false;
-			compaction_defer_reset(zone, order, true);
-			count_vm_event(COMPACTSUCCESS);
-			return page;
-		}
+		zone->compact_blockskip_flush = false;
+		compaction_defer_reset(zone, order, true);
+		count_vm_event(COMPACTSUCCESS);
+		return page;
+	}
 
-		/*
-		 * last_compact_zone is where try_to_compact_pages thought
-		 * allocation should succeed, so it did not defer compaction.
-		 * But now we know that it didn't succeed, so we do the defer.
-		 */
-		if (last_compact_zone && mode != MIGRATE_ASYNC)
-			defer_compaction(last_compact_zone, order);
+	/*
+	 * last_compact_zone is where try_to_compact_pages thought allocation
+	 * should succeed, so it did not defer compaction. But here we know
+	 * that it didn't succeed, so we do the defer.
+	 */
+	if (last_compact_zone && mode != MIGRATE_ASYNC)
+		defer_compaction(last_compact_zone, order);
 
-		/*
-		 * It's bad if compaction run occurs and fails.
-		 * The most likely reason is that pages exist,
-		 * but not enough to satisfy watermarks.
-		 */
-		count_vm_event(COMPACTFAIL);
+	/*
+	 * It's bad if compaction run occurs and fails. The most likely reason
+	 * is that pages exist, but not enough to satisfy watermarks.
+	 */
+	count_vm_event(COMPACTFAIL);
 
-		cond_resched();
-	}
+	cond_resched();
 
 	return NULL;
 }
-- 
1.8.4.5

--
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:[~2014-07-16 13:48 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-16 13:48 [PATCH V4 00/15] compaction: balancing overhead and success rates Vlastimil Babka
2014-07-16 13:48 ` [PATCH V4 01/15] mm, THP: don't hold mmap_sem in khugepaged when allocating THP Vlastimil Babka
2014-07-25 12:18   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 02/15] mm, compaction: defer each zone individually instead of preferred zone Vlastimil Babka
2014-07-25 12:20   ` Mel Gorman
2014-07-16 13:48 ` Vlastimil Babka [this message]
2014-07-25 12:22   ` [PATCH V4 03/15] mm, compaction: do not count compact_stall if all zones skipped compaction Mel Gorman
2014-07-16 13:48 ` [PATCH V4 04/15] mm, compaction: do not recheck suitable_migration_target under lock Vlastimil Babka
2014-07-25 12:23   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 05/15] mm, compaction: move pageblock checks up from isolate_migratepages_range() Vlastimil Babka
2014-07-25 12:28   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 06/15] mm, compaction: reduce zone checking frequency in the migration scanner Vlastimil Babka
2014-07-25 12:29   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 07/15] mm, compaction: khugepaged should not give up due to need_resched() Vlastimil Babka
2014-07-25 12:31   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 08/15] mm, compaction: periodically drop lock and restore IRQs in scanners Vlastimil Babka
2014-07-25 12:32   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 09/15] mm, compaction: skip rechecks when lock was already held Vlastimil Babka
2014-07-25 12:34   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 10/15] mm, compaction: remember position within pageblock in free pages scanner Vlastimil Babka
2014-07-25 12:35   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 11/15] mm, compaction: skip buddy pages by their order in the migrate scanner Vlastimil Babka
2014-07-25 12:36   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 12/15] mm: rename allocflags_to_migratetype for clarity Vlastimil Babka
2014-07-25 12:37   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 13/15] mm, compaction: pass gfp mask to compact_control Vlastimil Babka
2014-07-25 12:38   ` Mel Gorman
2014-07-16 13:48 ` [PATCH V4 14/15] mm, compaction: try to capture the just-created high-order freepage Vlastimil Babka
2014-07-25 12:56   ` Mel Gorman
2014-07-25 15:49     ` Vlastimil Babka
2014-07-16 13:48 ` [RFC PATCH V4 15/15] mm, compaction: do not migrate pages when that cannot satisfy page fault allocation Vlastimil Babka

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=1405518503-27687-4-git-send-email-vbabka@suse.cz \
    --to=vbabka@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=cl@linux.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=mina86@mina86.com \
    --cc=minchan@kernel.org \
    --cc=n-horiguchi@ah.jp.nec.com \
    --cc=riel@redhat.com \
    --cc=rientjes@google.com \
    --cc=zhangyanfei@cn.fujitsu.com \
    /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