linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linuxppc-dev list <linuxppc-dev@ozlabs.org>,
	akpm <akpm@linux-foundation.org>,
	Linux Kernel list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] synchronize_irq needs a barrier
Date: Thu, 18 Oct 2007 12:40:54 +1000	[thread overview]
Message-ID: <1192675254.12879.29.camel@pasglop> (raw)
In-Reply-To: <alpine.LFD.0.999.0710171906150.26902@woody.linux-foundation.org>


On Wed, 2007-10-17 at 19:12 -0700, Linus Torvalds wrote:
> 
> So, what exactly does it protect against? At a minimum, this needs a 
> comment in the changelog, and probably preferably in the source code too.

I replied to Andrew, but I agree, it's worth a comment, I'll add one.

> The thing is, synchronize_irq() can only protect against interrupts that 
> are *already*running* on another CPU, and the caller must have made sure 
> that no new interrupts are coming in (or at least that whatever new 
> interrupts that come in will not pick up a certain piece of data). 
> 
> So I can imagine that the smb_mb() is there so that the caller - who has 
> cleared some list or done something like that - will have any preceding 
> writes that it did be serialized with actually checking the old state of 
> "desc->status".

Yes.

> Fair enough - I can see that a smp_mb() is useful. But I think it needs 
> documenting as such, and preferably with an example of how this actually 
> happened in the first place (do you have one?)

One could argue that it's the caller that should do the mb() but that
would really be asking for trouble. Since most usage scenario require
it, and it's not a hot path, I prefer having it here.

Note that some kind of read barrier or compiler barrier should be needed
regardless, or we are just not sync'ing with anything at all (we may
have loaded the value ages ago and thus operate on a totally stale
value). I prefer a full barrier to also ensure all previous stores are
pushed out.

> The synchronize_irq() users that are really fundamental (ie the irq 
> datastructures themselves) all should use the irq descriptor spinlock, and 
> should *not* be needing any of this, since they would have serialized with 
> whoever actually set the IRQ_INPROGRESS bit in the first place.

That isn't always the case. You can have very efficient lock-less fast
path and use synchronize_irq as a kind of RCU-like way to have the slow
path do the right thing.

> So in *that* sense, I think the memory barrier is useless, and I can't 
> make up my mind whether it's good or bad. Which is why I'd really like to 
> have an example scenario spelled out where it makes a difference..

Well, typically, I can clear a pointer and want to make sure my IRQ
handler isn't using it anymore before freeing the memory. Or set a "HW
is off" flag. Having spinlocks all over isn't always the best approach
on things that are really hot path, it's fair enough to use lockless
approaches like that by moving the burden to the slow path that does
synchronize_irq.

In general, I tend to think that for this function to make any sense
(that is, to synchronize anything at all), it needs a barrier or you are
just making a decision based on a totally random value of desc->status
since it can have been re-ordered, speculatively loaded, pre-fetched,
whatever'ed... :-).

Want a respin with a comment ?

Ben.

  reply	other threads:[~2007-10-18  2:41 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-18  1:25 [PATCH] synchronize_irq needs a barrier Benjamin Herrenschmidt
2007-10-18  1:45 ` Andrew Morton
2007-10-18  1:55   ` Benjamin Herrenschmidt
2007-10-18  2:12 ` Linus Torvalds
2007-10-18  2:40   ` Benjamin Herrenschmidt [this message]
2007-10-18  2:57     ` Benjamin Herrenschmidt
2007-10-18 14:56       ` Herbert Xu
2007-10-18 22:05         ` Benjamin Herrenschmidt
2007-10-18 22:52           ` Linus Torvalds
2007-10-18 23:17             ` Benjamin Herrenschmidt
2007-10-18 23:39               ` Linus Torvalds
2007-10-18 23:52                 ` Benjamin Herrenschmidt
2007-10-19  2:32                 ` Herbert Xu
2007-10-19  2:52                   ` Nick Piggin
2007-10-19  3:28                     ` Herbert Xu
2007-10-19  4:49                       ` Nick Piggin
2007-10-19  2:55                   ` Linus Torvalds
2007-10-19  3:26                     ` Linus Torvalds
2007-10-19  4:11                       ` Benjamin Herrenschmidt
2007-10-19  4:26                         ` Benjamin Herrenschmidt
2007-10-19  5:53                           ` Herbert Xu
2007-10-19  4:20                       ` Herbert Xu
2007-10-19  4:29                         ` Benjamin Herrenschmidt
2007-10-19  4:35                         ` Benjamin Herrenschmidt
2007-10-19  4:48                         ` Herbert Xu
2007-10-19  4:58                           ` Benjamin Herrenschmidt
2007-10-21 21:10                             ` Benjamin Herrenschmidt
2007-10-23  3:26                               ` [IRQ]: Fix synchronize_irq races with IRQ handler Herbert Xu
2007-10-19  5:36                         ` [NET]: Fix possible dev_deactivate race condition Herbert Xu
2007-10-19  5:38                           ` David Miller
2007-10-19  7:35                           ` Peter Zijlstra
2007-10-19  9:29                             ` Herbert Xu
2007-10-18 14:35     ` [PATCH] synchronize_irq needs a barrier Herbert Xu
2007-10-18 21:35       ` Benjamin Herrenschmidt
2007-10-20  2:02 ` Maxim Levitsky
2007-10-20  2:25   ` Linus Torvalds
2007-10-20  3:10     ` Maxim Levitsky
2007-10-20  4:06       ` Benjamin Herrenschmidt
2007-10-20  4:04     ` Benjamin Herrenschmidt
2007-10-20  4:09       ` Benjamin Herrenschmidt
2007-10-20  3:37   ` Herbert Xu
2007-10-20  3:56   ` Benjamin Herrenschmidt
2007-10-20  4:24     ` Maxim Levitsky
2007-10-20  5:04       ` Benjamin Herrenschmidt
2007-10-20  5:36         ` Maxim Levitsky
2007-10-20  5:46           ` Benjamin Herrenschmidt
2007-10-20  6:06             ` Maxim Levitsky
2007-10-20  6:13               ` Benjamin Herrenschmidt

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=1192675254.12879.29.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    --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;
as well as URLs for NNTP newsgroup(s).