public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Waiman Long <waiman.long@hp.com>,
	Mikulas Patocka <mpatocka@redhat.com>,
	"James E.J. Bottomley" <jejb@parisc-linux.org>,
	Helge Deller <deller@gmx.de>,
	John David Anglin <dave.anglin@bell.net>,
	Parisc List <linux-parisc@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"Vinod, Chegu" <chegu_vinod@hp.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Rik van Riel <riel@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Davidlohr Bueso <davidlohr@hp.com>, Peter Anvin <hpa@zytor.com>,
	Andi Kleen <andi@firstfloor.org>,
	"Chandramouleeswaran, Aswin" <aswin@hp.com>,
	"Norton, Scott J" <scott.norton@hp.com>,
	Jason Low <jason.low2@hp.com>
Subject: Re: [PATCH v2] introduce atomic_pointer to fix a race condition in cancelable mcs spinlocks
Date: Mon, 2 Jun 2014 14:02:27 -0700	[thread overview]
Message-ID: <20140602210227.GE22231@linux.vnet.ibm.com> (raw)
In-Reply-To: <CA+55aFwJwVf_MbcwNNWg-KrLdoOaV2xse2jzvBZTJHJgC_Htvg@mail.gmail.com>

On Mon, Jun 02, 2014 at 01:22:10PM -0700, Linus Torvalds wrote:
> On Mon, Jun 2, 2014 at 1:05 PM, Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > So the question is, do you prefer subtly broken code or hard compile
> > fails? Me, I go for the compile fail.
> 
> The thing is, parisc has a perfectly fine "cmpxchg" implementation in
> practice, and ACCESS_ONCE() and friends work fine too for reading.
> 
> What the "use a spinlock" approach cannot generally do is:
> 
>  - ACCESS_ONCE() to _write_ things doesn't work well. You really
> should use "atomic_set()".
> 
>  - you may not necessarily be able to mix partial updates (ie
> differently sized updates to the same thing) depending on just how the
> spinlock hashing works
> 
> but both of those are really rare issues and don't affect normal code.
> 
> I would not necessarily be opposed to splitting up ACCESS_ONCE() for
> reading and for writing, and maybe we could do something special for
> the writing path (which tends to be less ctitical). It's really mixing
> "ACCESS_ONCE(x)" to _set_ a value, together with atomic ops to update
> it, that ends up being problematic.

Knowing what I know now about how ACCESS_ONCE() is used, I would have
split it for reading and writing to begin with.  Where is that time
machine when you need it?  ;-)

> Maybe there are other issues I can't think of right now. But
> basically, parisc _can_ do cmpxchg, it's just that the code needs to
> be somewhat sanitized.
> 
> Side note: some of the RCU code uses "ACCESS_ONCE()" for
> read-modify-write code, which is just f*cking crazy. The semantics are
> dubious, and it generally makes gcc create bad code too.

A couple of the places are admittedly overkill, for example the pair of:

	ACCESS_ONCE(rsp->n_force_qs_lh)++;

which is just for debug statistics in any case.  I could put these back
to "rsp->n_force_qs_lh++;" without problems, if desired.  (Yeah, I know,
I am overly paranoid.)

However, these cases need a bit more care:

	ACCESS_ONCE(rdp->qlen)++;
	ACCESS_ONCE(rsp->n_barrier_done)++;
	ACCESS_ONCE(sync_rcu_preempt_exp_count)++;

In the ->qlen case, interrupts are disabled and the current CPU is
the only one who can write, so the read need not be volatile.  In the
->n_barrier_done, modifications are done holding ->barrier_mutex, so again
the read need not be volatile.  In the sync_rcu_preempt_exp_count case,
modifications are done holding sync_rcu_preempt_exp_mutex, so once again,
the read need not be volatile.  So I could do something like:

	ACCESS_ONCE(rdp->qlen) = rdp->qlen + 1;

But that still makes gcc generate bad code.

The reason I was not all that worried about this is that these are not
in fastpaths, and the last two are especially not in fastpaths.

Suggestions?

							Thanx, Paul


  reply	other threads:[~2014-06-02 21:02 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-01 17:53 [PATCH] fix a race condition in cancelable mcs spinlocks Mikulas Patocka
2014-06-01 19:20 ` Peter Zijlstra
2014-06-01 20:46   ` John David Anglin
2014-06-01 21:30     ` Peter Zijlstra
2014-06-01 21:46       ` Paul E. McKenney
2014-06-02  9:19       ` Mikulas Patocka
2014-06-02 13:24         ` Paul E. McKenney
2014-06-02 15:57           ` Mikulas Patocka
2014-06-02 16:39             ` Paul E. McKenney
2014-06-02 19:56       ` James Bottomley
2014-06-03  7:56         ` Peter Zijlstra
2014-06-04 12:53           ` Mikulas Patocka
2014-06-02 13:58     ` Mikulas Patocka
2014-06-02 14:02       ` Mikulas Patocka
2014-06-02 15:39         ` John David Anglin
2014-06-02 10:34   ` Mikulas Patocka
2014-06-02 14:14 ` Waiman Long
2014-06-02 15:27   ` Jason Low
2014-06-02 16:00 ` [PATCH v2] introduce atomic_pointer to " Mikulas Patocka
2014-06-02 16:25   ` Peter Zijlstra
2014-06-02 16:30     ` Peter Zijlstra
2014-06-02 16:46       ` Paul E. McKenney
2014-06-02 17:33       ` Waiman Long
2014-06-02 20:05         ` Peter Zijlstra
2014-06-02 20:22           ` Linus Torvalds
2014-06-02 21:02             ` Paul E. McKenney [this message]
2014-06-02 21:12               ` Linus Torvalds
2014-06-02 22:08                 ` Paul E. McKenney
2014-06-02 22:44                   ` Eric Dumazet
2014-06-02 23:17                     ` Paul E. McKenney
2014-06-02 23:53                       ` Eric Dumazet
2014-06-03  0:28                         ` Paul E. McKenney
2014-06-02 22:55                   ` Linus Torvalds
2014-06-03 16:48                     ` Paul E. McKenney
2014-06-03  7:54             ` Peter Zijlstra
2014-06-02 20:24           ` James Bottomley
2014-06-02 16:43     ` Paul E. McKenney
2014-06-02 17:14       ` James Bottomley
2014-06-02 17:29       ` Waiman Long
2014-06-02 17:09     ` Linus Torvalds
2014-06-02 17:12       ` Davidlohr Bueso
2014-06-02 17:42         ` Waiman Long
2014-06-02 20:46       ` Mikulas Patocka
2014-06-02 20:53         ` Linus Torvalds
2014-06-02 21:12           ` Mikulas Patocka
2014-06-03  7:36             ` Peter Zijlstra
2014-06-03 11:14               ` Mikulas Patocka
2014-06-03 13:24                 ` Peter Zijlstra
2014-06-03 14:18                   ` Mikulas Patocka
2014-06-03 14:07               ` Paul E. McKenney
2014-06-03 15:09                 ` Peter Zijlstra
2014-06-03 15:56                   ` Paul E. McKenney
2014-06-03  7:20         ` Peter Zijlstra
2014-06-02 21:03       ` Paul E. McKenney
2014-06-06 15:06       ` Peter Zijlstra
2014-06-06 15:15         ` Paul E. McKenney
2014-06-06 15:42         ` Davidlohr Bueso
2014-06-02 16:50   ` Jason Low
2014-06-02 17:03     ` Paul E. McKenney
2014-06-02 17:25     ` Waiman Long
2014-06-02 17:38       ` H. Peter Anvin

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=20140602210227.GE22231@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=aswin@hp.com \
    --cc=chegu_vinod@hp.com \
    --cc=dave.anglin@bell.net \
    --cc=davidlohr@hp.com \
    --cc=deller@gmx.de \
    --cc=hpa@zytor.com \
    --cc=jason.low2@hp.com \
    --cc=jejb@parisc-linux.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-parisc@vger.kernel.org \
    --cc=mpatocka@redhat.com \
    --cc=peterz@infradead.org \
    --cc=riel@redhat.com \
    --cc=scott.norton@hp.com \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=waiman.long@hp.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox