From: David Rientjes <rientjes@google.com> To: Vlastimil Babka <vbabka@suse.cz> Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>, Greg Thelen <gthelen@google.com>, 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> Subject: Re: [PATCH 02/10] mm, compaction: report compaction as contended only due to lock contention Date: Mon, 9 Jun 2014 16:50:18 -0700 (PDT) [thread overview] Message-ID: <alpine.DEB.2.02.1406091647140.17705@chino.kir.corp.google.com> (raw) In-Reply-To: <1402305982-6928-2-git-send-email-vbabka@suse.cz> On Mon, 9 Jun 2014, 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(). > s/hugepaged/khugepaged/ on the changelog. > Reported-by: David Rientjes <rientjes@google.com> > 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> > --- > 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; > } > > /* I think eventually we're going to remove the need_resched() heuristic entirely and so enum compact_contended might be overkill, but do we need to worry about spin_is_contended(lock) && need_resched() reporting COMPACT_CONTENDED_SCHED here instead of COMPACT_CONTENDED_LOCK? > @@ -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; > } > Hmm, since the only thing that matters for cc->contended is COMPACT_CONTENDED_LOCK, it may make sense to just leave this as a bool within struct compact_control instead of passing the actual reason around when it doesn't matter. > 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
WARNING: multiple messages have this Message-ID (diff)
From: David Rientjes <rientjes@google.com> To: Vlastimil Babka <vbabka@suse.cz> Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>, Greg Thelen <gthelen@google.com>, 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> Subject: Re: [PATCH 02/10] mm, compaction: report compaction as contended only due to lock contention Date: Mon, 9 Jun 2014 16:50:18 -0700 (PDT) [thread overview] Message-ID: <alpine.DEB.2.02.1406091647140.17705@chino.kir.corp.google.com> (raw) In-Reply-To: <1402305982-6928-2-git-send-email-vbabka@suse.cz> On Mon, 9 Jun 2014, 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(). > s/hugepaged/khugepaged/ on the changelog. > Reported-by: David Rientjes <rientjes@google.com> > 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> > --- > 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; > } > > /* I think eventually we're going to remove the need_resched() heuristic entirely and so enum compact_contended might be overkill, but do we need to worry about spin_is_contended(lock) && need_resched() reporting COMPACT_CONTENDED_SCHED here instead of COMPACT_CONTENDED_LOCK? > @@ -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; > } > Hmm, since the only thing that matters for cc->contended is COMPACT_CONTENDED_LOCK, it may make sense to just leave this as a bool within struct compact_control instead of passing the actual reason around when it doesn't matter. > 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 -- 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>
next prev parent reply other threads:[~2014-06-09 23:50 UTC|newest] Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-06-09 9:26 [PATCH 01/10] mm, compaction: do not recheck suitable_migration_target under lock Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-09 9:26 ` [PATCH 02/10] mm, compaction: report compaction as contended only due to lock contention Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-09 23:50 ` David Rientjes [this message] 2014-06-09 23:50 ` David Rientjes 2014-06-10 7:11 ` Vlastimil Babka 2014-06-10 7:11 ` Vlastimil Babka 2014-06-10 23:40 ` David Rientjes 2014-06-10 23:40 ` David Rientjes 2014-06-11 1:10 ` Minchan Kim 2014-06-11 1:10 ` Minchan Kim 2014-06-11 12:22 ` Vlastimil Babka 2014-06-11 12:22 ` Vlastimil Babka 2014-06-11 23:49 ` Minchan Kim 2014-06-11 23:49 ` Minchan Kim 2014-06-12 14:02 ` Vlastimil Babka 2014-06-12 14:02 ` Vlastimil Babka 2014-06-13 2:40 ` Minchan Kim 2014-06-13 2:40 ` Minchan Kim 2014-06-20 11:47 ` Vlastimil Babka 2014-06-20 11:47 ` Vlastimil Babka 2014-06-09 9:26 ` [PATCH 03/10] mm, compaction: periodically drop lock and restore IRQs in scanners Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-09 23:58 ` David Rientjes 2014-06-09 23:58 ` David Rientjes 2014-06-10 7:15 ` Vlastimil Babka 2014-06-10 7:15 ` Vlastimil Babka 2014-06-10 23:41 ` David Rientjes 2014-06-10 23:41 ` David Rientjes 2014-06-11 1:32 ` Minchan Kim 2014-06-11 1:32 ` Minchan Kim 2014-06-11 11:24 ` Vlastimil Babka 2014-06-11 11:24 ` Vlastimil Babka 2014-06-09 9:26 ` [PATCH 04/10] mm, compaction: skip rechecks when lock was already held Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-10 0:00 ` David Rientjes 2014-06-10 0:00 ` David Rientjes 2014-06-11 1:50 ` Minchan Kim 2014-06-11 1:50 ` Minchan Kim 2014-06-09 9:26 ` [PATCH 05/10] mm, compaction: remember position within pageblock in free pages scanner Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-10 0:07 ` David Rientjes 2014-06-10 0:07 ` David Rientjes 2014-06-11 2:12 ` Minchan Kim 2014-06-11 2:12 ` Minchan Kim 2014-06-11 8:16 ` Joonsoo Kim 2014-06-11 8:16 ` Joonsoo Kim 2014-06-11 11:41 ` Vlastimil Babka 2014-06-11 11:41 ` Vlastimil Babka 2014-06-11 11:33 ` Vlastimil Babka 2014-06-11 11:33 ` Vlastimil Babka 2014-06-11 3:29 ` Zhang Yanfei 2014-06-11 3:29 ` Zhang Yanfei 2014-06-09 9:26 ` [PATCH 06/10] mm, compaction: skip buddy pages by their order in the migrate scanner Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-10 0:08 ` David Rientjes 2014-06-10 0:08 ` David Rientjes 2014-06-09 9:26 ` [PATCH 07/10] mm: rename allocflags_to_migratetype for clarity Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-11 2:41 ` Minchan Kim 2014-06-11 2:41 ` Minchan Kim 2014-06-11 3:38 ` Zhang Yanfei 2014-06-11 3:38 ` Zhang Yanfei 2014-06-09 9:26 ` [PATCH 08/10] mm, compaction: pass gfp mask to compact_control Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-11 2:48 ` Minchan Kim 2014-06-11 2:48 ` Minchan Kim 2014-06-11 11:46 ` Vlastimil Babka 2014-06-11 11:46 ` Vlastimil Babka 2014-06-12 0:24 ` David Rientjes 2014-06-12 0:24 ` David Rientjes 2014-06-09 9:26 ` [RFC PATCH 09/10] mm, compaction: try to capture the just-created high-order freepage Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-11 14:56 ` Vlastimil Babka 2014-06-11 14:56 ` Vlastimil Babka 2014-06-12 2:20 ` Minchan Kim 2014-06-12 2:20 ` Minchan Kim 2014-06-12 8:21 ` Vlastimil Babka 2014-06-12 8:21 ` Vlastimil Babka 2014-06-09 9:26 ` [RFC PATCH 10/10] mm, compaction: do not migrate pages when that cannot satisfy page fault allocation Vlastimil Babka 2014-06-09 9:26 ` Vlastimil Babka 2014-06-09 23:41 ` [PATCH 01/10] mm, compaction: do not recheck suitable_migration_target under lock David Rientjes 2014-06-09 23:41 ` David Rientjes 2014-06-11 0:33 ` Minchan Kim 2014-06-11 0:33 ` Minchan Kim 2014-06-11 2:45 ` Zhang Yanfei 2014-06-11 2:45 ` Zhang Yanfei
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=alpine.DEB.2.02.1406091647140.17705@chino.kir.corp.google.com \ --to=rientjes@google.com \ --cc=akpm@linux-foundation.org \ --cc=cl@linux.com \ --cc=gthelen@google.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=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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.