Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753500AbaFKBKR (ORCPT ); Tue, 10 Jun 2014 21:10:17 -0400 Received: from lgeamrelo04.lge.com ([156.147.1.127]:59289 "EHLO lgeamrelo04.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751633AbaFKBKP (ORCPT ); Tue, 10 Jun 2014 21:10:15 -0400 X-Original-SENDERIP: 10.177.220.169 X-Original-MAILFROM: minchan@kernel.org Date: Wed, 11 Jun 2014 10:10:19 +0900 From: Minchan Kim To: Vlastimil Babka Cc: David Rientjes , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton , Greg Thelen , Mel Gorman , Joonsoo Kim , Michal Nazarewicz , Naoya Horiguchi , Christoph Lameter , Rik van Riel Subject: Re: [PATCH 02/10] mm, compaction: report compaction as contended only due to lock contention Message-ID: <20140611011019.GC15630@bbox> References: <1402305982-6928-1-git-send-email-vbabka@suse.cz> <1402305982-6928-2-git-send-email-vbabka@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1402305982-6928-2-git-send-email-vbabka@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jun 09, 2014 at 11:26:14AM +0200, Vlastimil Babka wrote: > Async compaction aborts when it detects zone lock contention or need_resched() > is true. David Rientjes has reported that in practice, most direct async > compactions for THP allocation abort due to need_resched(). This means that a > second direct compaction is never attempted, which might be OK for a page > fault, but hugepaged is intended to attempt a sync compaction in such case and > in these cases it won't. > > This patch replaces "bool contended" in compact_control with an enum that > distinguieshes between aborting due to need_resched() and aborting due to lock > contention. This allows propagating the abort through all compaction functions > as before, but declaring the direct compaction as contended only when lock > contantion has been detected. > > As a result, hugepaged will proceed with second sync compaction as intended, > when the preceding async compaction aborted due to need_resched(). You said "second direct compaction is never attempted, which might be OK for a page fault" and said "hugepagd is intented to attempt a sync compaction" so I feel you want to handle khugepaged so special unlike other direct compact (ex, page fault). By this patch, direct compaction take care only lock contention, not rescheduling so that pop questions. Is it okay not to consider need_resched in direct compaction really? We have taken care of it in direct reclaim path so why direct compaction is so special? Why does khugepaged give up easily if lock contention/need_resched happens? khugepaged is important for success ratio as I read your description so IMO, khugepaged should do synchronously without considering early bail out by lock/rescheduling. If it causes problems, user should increase scan_sleep_millisecs/alloc_sleep_millisecs, which is exactly the knob for that cases. So, my point is how about making khugepaged doing always dumb synchronous compaction thorough PG_KHUGEPAGED or GFP_SYNC_TRANSHUGE? > > Reported-by: David Rientjes > Signed-off-by: Vlastimil Babka > Cc: Minchan Kim > Cc: Mel Gorman > Cc: Joonsoo Kim > Cc: Michal Nazarewicz > Cc: Naoya Horiguchi > Cc: Christoph Lameter > Cc: Rik van Riel > --- > mm/compaction.c | 20 ++++++++++++++------ > mm/internal.h | 15 +++++++++++---- > 2 files changed, 25 insertions(+), 10 deletions(-) > > diff --git a/mm/compaction.c b/mm/compaction.c > index b73b182..d37f4a8 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -185,9 +185,14 @@ static void update_pageblock_skip(struct compact_control *cc, > } > #endif /* CONFIG_COMPACTION */ > > -static inline bool should_release_lock(spinlock_t *lock) > +enum compact_contended should_release_lock(spinlock_t *lock) > { > - return need_resched() || spin_is_contended(lock); > + if (need_resched()) > + return COMPACT_CONTENDED_SCHED; > + else if (spin_is_contended(lock)) > + return COMPACT_CONTENDED_LOCK; > + else > + return COMPACT_CONTENDED_NONE; > } > > /* > @@ -202,7 +207,9 @@ static inline bool should_release_lock(spinlock_t *lock) > static bool compact_checklock_irqsave(spinlock_t *lock, unsigned long *flags, > bool locked, struct compact_control *cc) > { > - if (should_release_lock(lock)) { > + enum compact_contended contended = should_release_lock(lock); > + > + if (contended) { > if (locked) { > spin_unlock_irqrestore(lock, *flags); > locked = false; > @@ -210,7 +217,7 @@ static bool compact_checklock_irqsave(spinlock_t *lock, unsigned long *flags, > > /* async aborts if taking too long or contended */ > if (cc->mode == MIGRATE_ASYNC) { > - cc->contended = true; > + cc->contended = contended; > return false; > } > > @@ -236,7 +243,7 @@ static inline bool compact_should_abort(struct compact_control *cc) > /* async compaction aborts if contended */ > if (need_resched()) { > if (cc->mode == MIGRATE_ASYNC) { > - cc->contended = true; > + cc->contended = COMPACT_CONTENDED_SCHED; > return true; > } > > @@ -1095,7 +1102,8 @@ static unsigned long compact_zone_order(struct zone *zone, int order, > VM_BUG_ON(!list_empty(&cc.freepages)); > VM_BUG_ON(!list_empty(&cc.migratepages)); > > - *contended = cc.contended; > + /* We only signal lock contention back to the allocator */ > + *contended = cc.contended == COMPACT_CONTENDED_LOCK; > return ret; > } > > diff --git a/mm/internal.h b/mm/internal.h > index 7f22a11f..4659e8e 100644 > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -117,6 +117,13 @@ extern int user_min_free_kbytes; > > #if defined CONFIG_COMPACTION || defined CONFIG_CMA > > +/* Used to signal whether compaction detected need_sched() or lock contention */ > +enum compact_contended { > + COMPACT_CONTENDED_NONE = 0, /* no contention detected */ > + COMPACT_CONTENDED_SCHED, /* need_sched() was true */ > + COMPACT_CONTENDED_LOCK, /* zone lock or lru_lock was contended */ > +}; > + > /* > * in mm/compaction.c > */ > @@ -144,10 +151,10 @@ struct compact_control { > int order; /* order a direct compactor needs */ > int migratetype; /* MOVABLE, RECLAIMABLE etc */ > struct zone *zone; > - bool contended; /* True if a lock was contended, or > - * need_resched() true during async > - * compaction > - */ > + enum compact_contended contended; /* Signal need_sched() or lock > + * contention detected during > + * compaction > + */ > }; > > unsigned long > -- > 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: email@kvack.org -- Kind regards, Minchan Kim -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/