From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: akpm@linux-foundation.org, Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Steven Rostedt <rostedt@goodmis.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Nicholas Miell <nmiell@comcast.net>,
laijs@cn.fujitsu.com, dipankar@in.ibm.com, josh@joshtriplett.org,
dvhltc@us.ibm.com, niv@us.ibm.com, tglx@linutronix.de,
peterz@infradead.org, Valdis.Kletnieks@vt.edu,
dhowells@redhat.com
Subject: Re: [patch 2/3] scheduler: add full memory barriers upon task switch at runqueue lock/unlock
Date: Mon, 1 Feb 2010 11:09:30 -0500 [thread overview]
Message-ID: <20100201160929.GA3032@Krystal> (raw)
In-Reply-To: <alpine.LFD.2.00.1002010722350.4206@localhost.localdomain>
* Linus Torvalds (torvalds@linux-foundation.org) wrote:
>
>
> On Sun, 31 Jan 2010, Mathieu Desnoyers wrote:
> >
> > Adds no overhead on x86, because LOCK-prefixed atomic operations of the spin
> > lock/unlock already imply a full memory barrier.
>
> .. and as Nick pointed out, you're fundamentally incorrect on this.
> unlock on x86 is no memory barrier at all, since the x86 memory ordering
> rules are such that a regular store always has release consistency.
>
> But more importantly, you don't even explain why the addded smp_mb()
> helps.
>
> Why does a smp_mb() at the lock/unlock even matter? Reading accesses by
> the same CPU sure as hell do _not_ matter, so the whole concept seems
> totally broken. There is no way in _hell_ that whatever unlocked thing
> can ever write the variables protected by the lock, only read them. So a
> full memory barrier makes zero sense to begin with.
>
> So what are these magical memory barriers all about?
>
> Linus
To show the ordering required by sys_membarrier, let's first express
sys_membarrier() succinctly:
smp_mb();
rcu_read_lock(); /* ensures validity of cpu_curr(cpu) tasks */
for_each_cpu(cpu, mm_cpumask(current->mm))
if (current->mm == cpu_curr(cpu)->mm)
smp_call_function_single(cpu, membarrier_ipi, NULL, 1);
rcu_read_unlock();
smp_mb();
We need to guarantee that between the two memory barriers issued by
sys_membarrier(), we run a membarrier_ipi on every other running thread
belonging to the same process.
Where we have to be careful here is that the context switch does not
imply memory barriers both before and after:
- mm_cpumask update
- rq->cur update
Not having memory barriers between user-space instruction execution and
these updates performed by the scheduler leaves room for a race between
sys_membarrier() and the scheduler, where we would not deliver a
membarrier_ipi to a thread which either starts running or is about to be
context switched.
One option is to surround the context switch by memory barriers. If we
choose not to do that, we are left with these solutions:
We can deal with the rq->cur update by holding the rq lock in each
iteration of the for_each_cpu(cpu, mm_cpumask(current->mm)) loop. This
ensures that if rq->cur is updated, we have an associated memory barrier
issued (e.g. on x86, implied by writing to cr3 while the rq lock is held).
However, this does not deal with mm_cpumask update, and we cannot use
the per-cpu rq lock, as it's a process-wide data structure updated with
clear_bit/set_bit in switch_mm(). So at the very least, we would have to
add memory barriers in switch_mm() on some architectures to deal with
this.
Thanks,
Mathieu
--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2010-02-01 16:09 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-31 20:52 [patch 0/3] introduce sys_membarrier(): process-wide memory barrier (v8) Mathieu Desnoyers
2010-01-31 20:52 ` [patch 1/3] Create spin lock/spin unlock with distinct memory barrier Mathieu Desnoyers
2010-02-01 7:25 ` Nick Piggin
2010-02-01 14:08 ` Mathieu Desnoyers
2010-02-01 7:28 ` Nick Piggin
2010-02-01 14:10 ` Mathieu Desnoyers
2010-02-01 15:22 ` Linus Torvalds
2010-02-01 15:41 ` Steven Rostedt
2010-01-31 20:52 ` [patch 2/3] scheduler: add full memory barriers upon task switch at runqueue lock/unlock Mathieu Desnoyers
2010-02-01 7:33 ` Nick Piggin
2010-02-01 9:42 ` Peter Zijlstra
2010-02-01 10:11 ` Nick Piggin
2010-02-01 10:36 ` Peter Zijlstra
2010-02-01 10:49 ` Nick Piggin
2010-02-01 14:47 ` Mathieu Desnoyers
2010-02-01 14:58 ` Nick Piggin
2010-02-01 15:23 ` Steven Rostedt
2010-02-01 15:44 ` Steven Rostedt
2010-02-01 16:00 ` Mike Galbraith
2010-02-01 15:27 ` Linus Torvalds
2010-02-01 16:09 ` Mathieu Desnoyers [this message]
2010-02-01 16:23 ` Linus Torvalds
2010-02-01 16:48 ` Mathieu Desnoyers
2010-02-01 16:56 ` Linus Torvalds
2010-02-01 17:45 ` Mathieu Desnoyers
2010-02-01 18:00 ` Steven Rostedt
2010-02-01 18:36 ` Linus Torvalds
2010-02-01 19:56 ` Mathieu Desnoyers
2010-02-01 20:42 ` Linus Torvalds
2010-02-01 22:42 ` Mathieu Desnoyers
2010-02-01 20:33 ` Steven Rostedt
2010-02-01 20:52 ` Linus Torvalds
2010-02-01 22:39 ` Steven Rostedt
2010-02-01 23:09 ` Steven Rostedt
2010-02-01 17:13 ` Steven Rostedt
2010-02-01 17:34 ` Linus Torvalds
2010-02-01 16:24 ` Steven Rostedt
2010-02-01 16:29 ` Peter Zijlstra
2010-02-01 16:46 ` Steven Rostedt
2010-02-01 16:11 ` Steven Rostedt
2010-01-31 20:52 ` [patch 3/3] introduce sys_membarrier(): process-wide memory barrier (v8) Mathieu Desnoyers
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=20100201160929.GA3032@Krystal \
--to=mathieu.desnoyers@polymtl.ca \
--cc=Valdis.Kletnieks@vt.edu \
--cc=akpm@linux-foundation.org \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=dvhltc@us.ibm.com \
--cc=josh@joshtriplett.org \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=niv@us.ibm.com \
--cc=nmiell@comcast.net \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--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