From: Linus Torvalds <torvalds@linux-foundation.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>,
akpm@linux-foundation.org, Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
"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 12:52:22 -0800 (PST) [thread overview]
Message-ID: <alpine.LFD.2.00.1002011244020.4206@localhost.localdomain> (raw)
In-Reply-To: <1265056389.29013.126.camel@gandalf.stny.rr.com>
On Mon, 1 Feb 2010, Steven Rostedt wrote:
>
> But a race exists between the reading of the mm_cpumask and sending the
> IPI. There is in fact two different problems with this race. One is that
> a thread scheduled away, but never issued an mb(), the other is that a
> running task just came in and we never saw it.
I get it. But the thing I object to here is that Mathieu claims that we
need _two_ memory barriers in the switch_mm() code.
And I'm still not seeing it.
You claim that the rule is that "you have to do a mb on all threads", and
that there is a race if a threads switches away just as we're about to do
that.
Fine. But why _two_? And what's so magical about the mm_cpumask that it
needs to be around it?
If the rule is that we do a memory barrier as we switch an mm, then why
does that single one not just handle it? Either the CPU kept running that
mm (and the IPI will do the memory barrier), or the CPU didn't (and the
switch_mm had a memory barrier).
Without locking, I don't see how you can really have any stronger
guarantees, and as per my previous email, I don't see what the smp_mb()
around mm_cpumask accesses help - because the other CPU is still not going
to atomically "see the mask and IPI". It's going to see one value or the
other, and the smp_mb() around the access doesn't seem to have anything to
do with which value it sees.
So I can kind of understand the "We want to guarantee that switching MM's
around wants to be a memory barrier". Quite frankly, I haven't though even
that through entirely, so who knows... But the "we need to have memory
barriers on both sides of the bit setting/clearing" I don't get.
IOW, show me why that cpumask is _so_ important that the placement of the
memory barriers around it matters, to the point where you want to have it
on both sides.
Maybe you've really thought about this very deeply, but the explanations
aren't getting through to me. Educate me.
Linus
next prev parent reply other threads:[~2010-02-01 20:53 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
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 [this message]
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=alpine.LFD.2.00.1002011244020.4206@localhost.localdomain \
--to=torvalds@linux-foundation.org \
--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=mathieu.desnoyers@polymtl.ca \
--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 \
/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