From: Avi Kivity <avi@redhat.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Gregory Haskins <ghaskins@novell.com>,
Matthew Wilcox <matthew@wil.cx>, Andi Kleen <andi@firstfloor.org>,
Chris Mason <chris.mason@oracle.com>,
Andrew Morton <akpm@linux-foundation.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
linux-btrfs <linux-btrfs@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Nick Piggin <npiggin@suse.de>,
Peter Morreale <pmorreale@novell.com>,
Sven Dietrich <SDietrich@novell.com>,
Dmitry Adamushko <dmitry.adamushko@gmail.com>
Subject: Re: [PATCH -v8][RFC] mutex: implement adaptive spinning
Date: Mon, 12 Jan 2009 18:13:23 +0200 [thread overview]
Message-ID: <496B6C23.8000808@redhat.com> (raw)
In-Reply-To: <1231774622.4371.96.camel@laptop>
Peter Zijlstra wrote:
> Subject: mutex: implement adaptive spinning
> From: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Date: Mon Jan 12 14:01:47 CET 2009
>
> Change mutex contention behaviour such that it will sometimes busy wait on
> acquisition - moving its behaviour closer to that of spinlocks.
>
> This concept got ported to mainline from the -rt tree, where it was originally
> implemented for rtmutexes by Steven Rostedt, based on work by Gregory Haskins.
>
> Testing with Ingo's test-mutex application (http://lkml.org/lkml/2006/1/8/50)
> gave a 345% boost for VFS scalability on my testbox:
>
> # ./test-mutex-shm V 16 10 | grep "^avg ops"
> avg ops/sec: 296604
>
> # ./test-mutex-shm V 16 10 | grep "^avg ops"
> avg ops/sec: 85870
>
> The key criteria for the busy wait is that the lock owner has to be running on
> a (different) cpu. The idea is that as long as the owner is running, there is a
> fair chance it'll release the lock soon, and thus we'll be better off spinning
> instead of blocking/scheduling.
>
> Since regular mutexes (as opposed to rtmutexes) do not atomically track the
> owner, we add the owner in a non-atomic fashion and deal with the races in
> the slowpath.
>
> Furthermore, to ease the testing of the performance impact of this new code,
> there is means to disable this behaviour runtime (without having to reboot
> the system), when scheduler debugging is enabled (CONFIG_SCHED_DEBUG=y),
> by issuing the following command:
>
> # echo NO_OWNER_SPIN > /debug/sched_features
>
> This command re-enables spinning again (this is also the default):
>
> # echo OWNER_SPIN > /debug/sched_features
>
One thing that worries me here is that the spinners will spin on a
memory location in struct mutex, which means that the cacheline holding
the mutex (which is likely to be under write activity from the owner)
will be continuously shared by the spinners, slowing the owner down when
it needs to unshare it. One way out of this is to spin on a location in
struct mutex_waiter, and have the mutex owner touch it when it schedules
out.
So:
- each task_struct has an array of currently owned mutexes, appended to
by mutex_lock()
- mutex waiters spin on mutex_waiter.wait, which they initialize to zero
- when switching out of a task, walk the mutex list, and for each mutex,
bump each waiter's wait variable, and clear the owner array
- when unlocking a mutex, bump the nearest waiter's wait variable, and
remove from the owner array
Something similar might be done to spinlocks to reduce cacheline
contention from spinners and the owner.
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2009-01-12 16:13 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-12 15:37 [PATCH -v8][RFC] mutex: implement adaptive spinning Peter Zijlstra
2009-01-12 16:04 ` Linus Torvalds
2009-01-12 16:20 ` Linus Torvalds
2009-01-12 16:45 ` Chris Mason
2009-01-12 16:50 ` Peter Zijlstra
2009-01-12 17:14 ` Chris Mason
2009-01-12 17:24 ` Peter Zijlstra
2009-01-12 17:30 ` Chris Mason
2009-01-12 17:16 ` Peter Zijlstra
2009-01-12 17:33 ` Boaz Harrosh
2009-01-12 18:07 ` Peter Zijlstra
2009-01-12 16:13 ` Avi Kivity [this message]
2009-01-12 17:13 ` Peter Zijlstra
2009-01-12 17:23 ` Avi Kivity
2009-01-12 17:32 ` Avi Kivity
2009-01-14 16:46 ` Peter Zijlstra
2009-01-14 17:04 ` Nick Piggin
2009-01-14 17:23 ` Avi Kivity
2009-01-15 0:50 ` Nick Piggin
2009-01-13 15:15 ` [PATCH -v9][RFC] " Peter Zijlstra
2009-01-13 16:16 ` Linus Torvalds
2009-01-13 16:21 ` Peter Zijlstra
2009-01-13 16:39 ` Ingo Molnar
2009-01-13 16:40 ` Peter Zijlstra
2009-01-13 16:49 ` Linus Torvalds
2009-01-13 17:21 ` Peter Zijlstra
2009-01-13 18:33 ` Ingo Molnar
2009-01-13 18:40 ` Linus Torvalds
2009-01-13 19:01 ` Ingo Molnar
2009-01-14 2:58 ` Chris Mason
2009-01-14 11:18 ` Dmitry Adamushko
2009-01-14 16:47 ` Chris Mason
2009-01-14 17:32 ` Dmitry Adamushko
2009-01-14 11:21 ` Ingo Molnar
2009-01-14 15:43 ` Linus Torvalds
2009-01-14 16:23 ` Chris Mason
2009-01-14 17:06 ` [PATCH -v11 delta] " Ingo Molnar
2009-01-14 17:00 ` [PATCH -v11][RFC] " Peter Zijlstra
2009-01-14 17:18 ` Nick Piggin
2009-01-14 17:22 ` Peter Zijlstra
2009-01-15 0:46 ` Nick Piggin
2009-01-15 7:44 ` Peter Zijlstra
2009-01-15 7:52 ` Nick Piggin
2009-01-14 18:33 ` [GIT PULL] adaptive spinning mutexes Ingo Molnar
2009-01-14 18:40 ` Chris Mason
2009-01-15 9:53 ` Ingo Molnar
2009-01-14 18:47 ` Ingo Molnar
2009-01-14 19:28 ` Ingo Molnar
2009-01-15 17:44 ` Matthew Wilcox
2009-01-15 18:05 ` Linus Torvalds
2009-01-15 18:08 ` Ingo Molnar
2009-01-15 18:16 ` Linus Torvalds
2009-01-15 19:26 ` Chris Mason
2009-01-15 20:13 ` Linus Torvalds
2009-01-15 21:04 ` Chris Mason
2009-01-15 22:03 ` Ingo Molnar
2009-01-16 13:32 ` Folkert van Heusden
2009-01-16 13:57 ` Folkert van Heusden
2009-01-16 18:37 ` Bill Davidsen
2009-01-16 0:53 ` Paul E. McKenney
2009-01-16 1:01 ` Linus Torvalds
2009-01-16 1:34 ` Paul E. McKenney
2009-01-16 14:07 ` Folkert van Heusden
2009-01-16 3:03 ` Nick Piggin
2009-01-15 18:06 ` Ingo Molnar
2009-01-14 18:53 ` Andrew Morton
2009-01-14 19:00 ` Ingo Molnar
2009-01-14 19:36 ` Andrew Morton
2009-01-14 19:50 ` Peter Zijlstra
2009-01-14 20:21 ` Andrew Morton
2009-01-14 20:27 ` Ingo Molnar
2009-01-14 20:44 ` Andrew Morton
2009-01-14 20:14 ` Ingo Molnar
2009-01-14 20:30 ` Andrew Morton
2009-01-14 20:51 ` Ingo Molnar
2009-01-14 21:06 ` Andrew Morton
2009-01-14 21:14 ` Ingo Molnar
2009-01-14 21:35 ` Andrew Morton
2009-01-14 23:23 ` Ingo Molnar
2009-01-15 0:55 ` Nick Piggin
2009-01-14 21:41 ` Ingo Molnar
2009-01-14 21:50 ` Kay Sievers
2009-01-14 22:34 ` Ingo Molnar
2009-01-15 11:45 ` Folkert van Heusden
2009-01-15 12:53 ` Chris Samuel
2009-01-14 19:23 ` Peter Zijlstra
2009-01-14 19:33 ` Ingo Molnar
2009-01-15 8:41 ` [PATCH] mutex: set owner only once on acquisition Johannes Weiner
2009-01-15 8:56 ` Johannes Weiner
2009-01-13 18:12 ` [PATCH -v9][RFC] mutex: implement adaptive spinning Ingo Molnar
2009-01-13 18:21 ` Linus Torvalds
2009-01-13 18:24 ` Ingo Molnar
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=496B6C23.8000808@redhat.com \
--to=avi@redhat.com \
--cc=SDietrich@novell.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=chris.mason@oracle.com \
--cc=dmitry.adamushko@gmail.com \
--cc=ghaskins@novell.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matthew@wil.cx \
--cc=mingo@elte.hu \
--cc=npiggin@suse.de \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=pmorreale@novell.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/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