From: Vlastimil Babka <vbabka@suse.cz>
To: Minchan Kim <minchan@kernel.org>
Cc: David Rientjes <rientjes@google.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Greg Thelen <gthelen@google.com>, Mel Gorman <mgorman@suse.de>,
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 03/10] mm, compaction: periodically drop lock and restore IRQs in scanners
Date: Wed, 11 Jun 2014 13:24:43 +0200 [thread overview]
Message-ID: <53983C7B.8040705@suse.cz> (raw)
In-Reply-To: <20140611013218.GD15630@bbox>
On 06/11/2014 03:32 AM, Minchan Kim wrote:
>> >+ if (cc->mode == MIGRATE_ASYNC) {
>> >+ if (need_resched()) {
>> >+ cc->contended = COMPACT_CONTENDED_SCHED;
>> >+ return true;
>> > }
>> >-
>> >+ if (spin_is_locked(lock)) {
> Why do you use spin_is_locked instead of spin_is_contended?
Because I know I have dropped the lock. AFAIK spin_is_locked() means
somebody else is holding it, which would be a contention for me if I
would want to take it back. spin_is_contended() means that somebody else
#1 is holding it AND somebody else #2 is already waiting for it.
Previously in should_release_lock() the code assumed that it was me who
holds the lock, so I check if somebody else is waiting for it, hence
spin_is_contended().
But note that the assumption was not always true when
should_release_lock() was called from compact_checklock_irqsave(). So it
was another subtle suboptimality. In async compaction when I don't have
the lock, I should be deciding if I take it based on if somebody else is
holding it. Instead it was deciding based on if somebody else #1 is
holding it and somebody else #2 is waiting.
Then there's still a chance of race between this check and call to
spin_lock_irqsave, so I could spin on the lock even if I don't want to.
Using spin_trylock_irqsave() instead is like checking spin_is_locked()
and locking, without this race.
So even though I will probably remove the spin_is_locked() check per
David's objection, the trylock will still nicely prevent waiting on the
lock in async compaction.
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Vlastimil Babka <vbabka@suse.cz>
To: Minchan Kim <minchan@kernel.org>
Cc: David Rientjes <rientjes@google.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Greg Thelen <gthelen@google.com>, Mel Gorman <mgorman@suse.de>,
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 03/10] mm, compaction: periodically drop lock and restore IRQs in scanners
Date: Wed, 11 Jun 2014 13:24:43 +0200 [thread overview]
Message-ID: <53983C7B.8040705@suse.cz> (raw)
In-Reply-To: <20140611013218.GD15630@bbox>
On 06/11/2014 03:32 AM, Minchan Kim wrote:
>> >+ if (cc->mode == MIGRATE_ASYNC) {
>> >+ if (need_resched()) {
>> >+ cc->contended = COMPACT_CONTENDED_SCHED;
>> >+ return true;
>> > }
>> >-
>> >+ if (spin_is_locked(lock)) {
> Why do you use spin_is_locked instead of spin_is_contended?
Because I know I have dropped the lock. AFAIK spin_is_locked() means
somebody else is holding it, which would be a contention for me if I
would want to take it back. spin_is_contended() means that somebody else
#1 is holding it AND somebody else #2 is already waiting for it.
Previously in should_release_lock() the code assumed that it was me who
holds the lock, so I check if somebody else is waiting for it, hence
spin_is_contended().
But note that the assumption was not always true when
should_release_lock() was called from compact_checklock_irqsave(). So it
was another subtle suboptimality. In async compaction when I don't have
the lock, I should be deciding if I take it based on if somebody else is
holding it. Instead it was deciding based on if somebody else #1 is
holding it and somebody else #2 is waiting.
Then there's still a chance of race between this check and call to
spin_lock_irqsave, so I could spin on the lock even if I don't want to.
Using spin_trylock_irqsave() instead is like checking spin_is_locked()
and locking, without this race.
So even though I will probably remove the spin_is_locked() check per
David's objection, the trylock will still nicely prevent waiting on the
lock in async compaction.
next prev parent reply other threads:[~2014-06-11 11:24 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
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 [this message]
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=53983C7B.8040705@suse.cz \
--to=vbabka@suse.cz \
--cc=akpm@linux-foundation.org \
--cc=cl@linux.com \
--cc=gthelen@google.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 \
/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 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.