From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Ming Lei <ming.lei@canonical.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
USB list <linux-usb@vger.kernel.org>,
Kernel development list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] driver core: fix shutdown races with probe/remove
Date: Wed, 6 Jun 2012 08:14:48 -0700 [thread overview]
Message-ID: <20120606151448.GJ19601@linux.vnet.ibm.com> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1206061022020.1788-100000@iolanthe.rowland.org>
On Wed, Jun 06, 2012 at 10:44:05AM -0400, Alan Stern wrote:
> On Wed, 6 Jun 2012, Ming Lei wrote:
[ . . . ]
> > There are some similar examples(check on global variable is moved) with
> > ACCESS_ONCE usage in Documentation/atomic_ops.txt. (from line 88)
>
> Most of those examples involve repeatedly reading a global variable.
> In your case there is no repetition, and you are writing rather than
> reading.
>
> Furthermore, I think some of those examples go a little too far.
> Here's an extract from the file:
>
> -------------------------------------------------------------------
> For a final example, consider the following code, assuming that the
> variable a is set at boot time before the second CPU is brought online
> and never changed later, so that memory barriers are not needed:
>
> if (a)
> b = 9;
> else
> b = 42;
>
> The compiler is within its rights to manufacture an additional store
> by transforming the above code into the following:
>
> b = 42;
> if (a)
> b = 9;
>
> This could come as a fatal surprise to other code running concurrently
> that expected b to never have the value 42 if a was zero. To prevent
> the compiler from doing this, write something like:
>
> if (a)
> ACCESS_ONCE(b) = 9;
> else
> ACCESS_ONCE(b) = 42;
> -------------------------------------------------------------------
>
> That just seems wrong. By the same reasoning, the compiler is within
> its rights to transform either the original code or the code using
> ACCESS_ONCE into:
>
> b = 999;
> if (a)
> b = 9;
> else
> b = 42;
>
> and again, other code would be confused. The simple fact is that
> SMP-safe code is not likely to be produced by a compiler that assumes
> everything is single-threaded.
If you use ACCESS_ONCE(), the compiler is prohibited from inserting
the "b = 999". If you don't use ACCESS_ONCE(), the compiler really
is permitted to insert the "b = 999". So, why would the compiler do
such a thing? One possible reason would be from optimizations using
large registers to hold multiple values. A store from such a register
could clobber unrelated variables, but as long as the compiler fixes
up the clobbering after the fact, it is within its rights to do so.
The sad fact is that the C standard really does permit the compiler
to assume that it is generating sequential code.
Thanx, Paul
next prev parent reply other threads:[~2012-06-06 15:27 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-05 8:59 [PATCH] driver core: fix shutdown races with probe/remove Ming Lei
2012-06-05 9:18 ` Greg Kroah-Hartman
2012-06-05 9:38 ` Ming Lei
2012-06-05 14:47 ` Alan Stern
2012-06-05 15:17 ` Ming Lei
2012-06-05 17:09 ` Alan Stern
2012-06-05 20:21 ` Greg Kroah-Hartman
2012-06-05 20:44 ` Alan Stern
2012-06-06 2:27 ` Ming Lei
2012-06-06 13:42 ` Paul E. McKenney
2012-06-06 15:21 ` Alan Stern
2012-06-06 15:48 ` Paul E. McKenney
2012-06-06 16:05 ` Alan Stern
2012-06-06 16:24 ` Paul E. McKenney
2012-06-06 14:44 ` Alan Stern
2012-06-06 15:14 ` Paul E. McKenney [this message]
2012-06-06 15:44 ` Alan Stern
2012-06-06 15:55 ` Paul E. McKenney
2012-06-06 16:58 ` Alan Stern
2012-06-06 23:24 ` Paul E. McKenney
2012-06-07 9:30 ` Ming Lei
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=20120606151448.GJ19601@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=ming.lei@canonical.com \
--cc=stern@rowland.harvard.edu \
/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