Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751683AbcDUGjm (ORCPT ); Thu, 21 Apr 2016 02:39:42 -0400 Received: from out4133-34.mail.aliyun.com ([42.120.133.34]:50916 "EHLO out4133-34.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751172AbcDUGjl (ORCPT ); Thu, 21 Apr 2016 02:39:41 -0400 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R171e4;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e02c03277;MF=hillf.zj@alibaba-inc.com;NM=1;PH=DS;RN=12;SR=0;TI=SMTPD_----4j0mpl2_1461220749; Reply-To: "Hillf Danton" From: "Hillf Danton" To: "'Michal Hocko'" , "'Andrew Morton'" Cc: "'Linus Torvalds'" , "'Johannes Weiner'" , "'Mel Gorman'" , "'David Rientjes'" , "'Tetsuo Handa'" , "'Joonsoo Kim'" , "'Vlastimil Babka'" , , "'LKML'" , "'Michal Hocko'" References: <1461181647-8039-1-git-send-email-mhocko@kernel.org> <1461181647-8039-6-git-send-email-mhocko@kernel.org> In-Reply-To: <1461181647-8039-6-git-send-email-mhocko@kernel.org> Subject: Re: [PATCH 05/14] mm, compaction: distinguish between full and partial COMPACT_COMPLETE Date: Thu, 21 Apr 2016 14:39:09 +0800 Message-ID: <02cb01d19b98$82e9cdf0$88bd69d0$@alibaba-inc.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-Index: AQG1HgS+iScJ1ld6BkmHPkLx52RrNAHbombun74XS5A= Content-Language: zh-cn Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4900 Lines: 125 > > From: Michal Hocko > > COMPACT_COMPLETE now means that compaction and free scanner met. This is > not very useful information if somebody just wants to use this feedback > and make any decisions based on that. The current caller might be a poor > guy who just happened to scan tiny portion of the zone and that could be > the reason no suitable pages were compacted. Make sure we distinguish > the full and partial zone walks. > > Consumers should treat COMPACT_PARTIAL_SKIPPED as a potential success > and be optimistic in retrying. > > The existing users of COMPACT_COMPLETE are conservatively changed to > use COMPACT_PARTIAL_SKIPPED as well but some of them should be probably > reconsidered and only defer the compaction only for COMPACT_COMPLETE > with the new semantic. > > This patch shouldn't introduce any functional changes. > > Acked-by: Vlastimil Babka > Signed-off-by: Michal Hocko > --- Acked-by: Hillf Danton > include/linux/compaction.h | 10 +++++++++- > include/trace/events/compaction.h | 1 + > mm/compaction.c | 14 +++++++++++--- > mm/internal.h | 1 + > 4 files changed, 22 insertions(+), 4 deletions(-) > > diff --git a/include/linux/compaction.h b/include/linux/compaction.h > index 7e177d111c39..7c4de92d12cc 100644 > --- a/include/linux/compaction.h > +++ b/include/linux/compaction.h > @@ -21,7 +21,15 @@ enum compact_result { > * pages > */ > COMPACT_PARTIAL, > - /* The full zone was compacted */ > + /* > + * direct compaction has scanned part of the zone but wasn't successfull > + * to compact suitable pages. > + */ > + COMPACT_PARTIAL_SKIPPED, > + /* > + * The full zone was compacted scanned but wasn't successfull to compact > + * suitable pages. > + */ > COMPACT_COMPLETE, > /* For more detailed tracepoint output */ > COMPACT_NO_SUITABLE_PAGE, > diff --git a/include/trace/events/compaction.h b/include/trace/events/compaction.h > index 6ba16c86d7db..36e2d6fb1360 100644 > --- a/include/trace/events/compaction.h > +++ b/include/trace/events/compaction.h > @@ -14,6 +14,7 @@ > EM( COMPACT_DEFERRED, "deferred") \ > EM( COMPACT_CONTINUE, "continue") \ > EM( COMPACT_PARTIAL, "partial") \ > + EM( COMPACT_PARTIAL_SKIPPED, "partial_skipped") \ > EM( COMPACT_COMPLETE, "complete") \ > EM( COMPACT_NO_SUITABLE_PAGE, "no_suitable_page") \ > EM( COMPACT_NOT_SUITABLE_ZONE, "not_suitable_zone") \ > diff --git a/mm/compaction.c b/mm/compaction.c > index 13709e33a2fc..e2e487cea5ea 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -1304,7 +1304,10 @@ static enum compact_result __compact_finished(struct zone *zone, struct compact_ > if (cc->direct_compaction) > zone->compact_blockskip_flush = true; > > - return COMPACT_COMPLETE; > + if (cc->whole_zone) > + return COMPACT_COMPLETE; > + else > + return COMPACT_PARTIAL_SKIPPED; > } > > if (is_via_compact_memory(cc->order)) > @@ -1463,6 +1466,10 @@ static enum compact_result compact_zone(struct zone *zone, struct compact_contro > zone->compact_cached_migrate_pfn[0] = cc->migrate_pfn; > zone->compact_cached_migrate_pfn[1] = cc->migrate_pfn; > } > + > + if (cc->migrate_pfn == start_pfn) > + cc->whole_zone = true; > + > cc->last_migrated_pfn = 0; > > trace_mm_compaction_begin(start_pfn, cc->migrate_pfn, > @@ -1693,7 +1700,8 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, > goto break_loop; > } > > - if (mode != MIGRATE_ASYNC && status == COMPACT_COMPLETE) { > + if (mode != MIGRATE_ASYNC && (status == COMPACT_COMPLETE || > + status == COMPACT_PARTIAL_SKIPPED)) { > /* > * We think that allocation won't succeed in this zone > * so we defer compaction there. If it ends up > @@ -1939,7 +1947,7 @@ static void kcompactd_do_work(pg_data_t *pgdat) > cc.classzone_idx, 0)) { > success = true; > compaction_defer_reset(zone, cc.order, false); > - } else if (status == COMPACT_COMPLETE) { > + } else if (status == COMPACT_PARTIAL_SKIPPED || status == COMPACT_COMPLETE) { > /* > * We use sync migration mode here, so we defer like > * sync direct compaction does. > diff --git a/mm/internal.h b/mm/internal.h > index e9aacea1a0d1..4423dfe69382 100644 > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -182,6 +182,7 @@ struct compact_control { > enum migrate_mode mode; /* Async or sync migration mode */ > bool ignore_skip_hint; /* Scan blocks even if marked skip */ > bool direct_compaction; /* False from kcompactd or /proc/... */ > + bool whole_zone; /* Whole zone has been scanned */ > int order; /* order a direct compactor needs */ > const gfp_t gfp_mask; /* gfp mask of a direct compactor */ > const int alloc_flags; /* alloc flags of a direct compactor */ > -- > 2.8.0.rc3