From: Thomas Gleixner <tglx@linutronix.de>
To: Andi Kleen <andi@firstfloor.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Andi Kleen <ak@linux.intel.com>,
Eric Dumazet <eric.dumazet@gmail.com>,
Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH 3/3] tick-broadcast: push down tick_broadcast_lock
Date: Tue, 6 Sep 2011 20:55:14 +0200 (CEST) [thread overview]
Message-ID: <alpine.LFD.2.02.1109062048190.2723@ionos> (raw)
In-Reply-To: <20110906174939.GK7761@one.firstfloor.org>
On Tue, 6 Sep 2011, Andi Kleen wrote:
> On Tue, Sep 06, 2011 at 06:19:00PM +0200, Thomas Gleixner wrote:
>
> >
> > There is no full solution to that problem other than using sane
> > hardware.
>
> Not convinced.
>
> BTW can you at least merge the first patch for the notifiers.
> This fixes the "fixed hardware" which is currently broken too.
>
> > raw_spin_lock(&tick_broadcast_lock);
> > bc->next_event = KTIME_MAX;
> > for_each_online_cpu() {
> > next_event = ...;
> > }
> > .... if (dev->next_event < bc->next_event) {
> > raw_spin_lock(&tick_broadcast_lock);
> >
> > tick_broadcast_set_event(next_event, 0);
> > bc->next_event = next_event;
> >
> > raw_spin_unlock(&tick_broadcast_lock);
> > tick_broadcast_set_event(dev->next_event, 1);
> >
> > So you unconditionally set the broadcast device to dev->next_event of
> > CPU1 even if the current pending event which was evaluated on CPU0 is
> > _BEFORE_ the CPU1 event. That can cause stalls and other hard to debug
> > horror. We've been there before.
>
> I don't understand. It only sets it if the new event is earlier.
> So it can never be set back.
If you read the above you see that the broadcast handler sets the next
event to KTIME_MAX first. Then it looks for the next event and
programs it to that expiry time.
So when the check on the other CPU happens after CPU0 does
bc->next_event = KTIME_MAX and before CPU0 finished reprogramming,
then CPU1 sees KTIME_MAX and the comparison evaluates true. So CPU1
waits for the lock which is held by CPU0 and then sets the BC device
to CPU1 next event unconditionally, which might be _AFTER_ the already
pending event which was set by CPU0.
> You seem to say the opposite?
No, that's racy because you do not hold the lock when doing the
comparision.
> >
> > Further the unprotected comparison on 32bit is completely bogus.
>
> Ok. Just need a ordered read like i_size_read().
>
> > > - if (dev->next_event.tv64 != KTIME_MAX)
> > > +
> > > + /* Only take the lock if the event changes */
> > > + if (dev->next_event.tv64 != KTIME_MAX) {
> > > + raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
> >
> > Why would you take the global lock to program the cpu local device?
> > Just because it happened to be under that lock before?
>
> Yes, I didn't audit that code. But probably it can be dropped
> you're right.
That's not a question of auditing, it's a question of understanding
the code which you modify.
Thanks,
tglx
next prev parent reply other threads:[~2011-09-06 18:55 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-29 21:08 [PATCH 1/3] clockevents: Use an atomic RCU notifier for clockevents Andi Kleen
2011-08-29 21:08 ` [PATCH 2/3] broadcast-tick: Move oneshot broadcast mask to per cpu variables v2 Andi Kleen
2011-09-06 15:28 ` Thomas Gleixner
2011-08-29 21:08 ` [PATCH 3/3] tick-broadcast: push down tick_broadcast_lock Andi Kleen
2011-09-06 16:19 ` Thomas Gleixner
2011-09-06 17:49 ` Andi Kleen
2011-09-06 18:55 ` Thomas Gleixner [this message]
2011-09-06 19:23 ` [PATCH 1/3] clockevents: Use an atomic RCU notifier for clockevents Thomas Gleixner
2011-09-06 20:33 ` Andi Kleen
2011-09-06 21:45 ` Thomas Gleixner
2011-09-06 22:42 ` Andi Kleen
2011-09-06 23:19 ` Thomas Gleixner
-- strict thread matches above, loose matches on Subject: below --
2011-08-26 22:32 Andi Kleen
2011-08-26 22:32 ` [PATCH 3/3] tick-broadcast: push down tick_broadcast_lock Andi Kleen
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.02.1109062048190.2723@ionos \
--to=tglx@linutronix.de \
--cc=ak@linux.intel.com \
--cc=andi@firstfloor.org \
--cc=eric.dumazet@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.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
Powered by JetHome