From: Peter Zijlstra <peterz@infradead.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Steven Rostedt <rostedt@goodmis.org>,
Andrew Morton <akpm@linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>,
Rusty Russell <rusty@rustcorp.com.au>,
npiggin@suse.de, Ingo Molnar <mingo@elte.hu>,
Thomas Gleixner <tglx@linutronix.de>,
Arjan van de Ven <arjan@infradead.org>,
jens.axboe@oracle.com
Subject: Re: [PATCH -v2] use per cpu data for single cpu ipi calls
Date: Thu, 29 Jan 2009 18:55:41 +0100 [thread overview]
Message-ID: <1233251741.4495.111.camel@laptop> (raw)
In-Reply-To: <1233251222.4495.110.camel@laptop>
On Thu, 2009-01-29 at 18:47 +0100, Peter Zijlstra wrote:
> On Thu, 2009-01-29 at 09:21 -0800, Linus Torvalds wrote:
> > On Thu, 29 Jan 2009, Steven Rostedt wrote:
> > >
> > > The caller must wait till the LOCK bit is cleared before setting
> > > it. When it is cleared, there is no IPI function using it.
> > > A spinlock is used to synchronize the setting of the bit between
> > > callers. Since only one callee can be called at a time, and it
> > > is the only thing to clear it, the IPI does not need to use
> > > any locking.
> >
> > That spinlock cannot be right. It is provably wrong for so many reasons..
> >
> > Think about it. We're talking about a per-CPU lock, which already makes no
> > sense: we're only locking against our own CPU, and we've already disabled
> > preemption for totally unrelated reasons.
> >
> > And the only way locking can make sense against our own CPU is if we lock
> > against interrupts - but the lock isn't actually irq-safe, so if you are
> > trying to lock against interrupts, you are (a) doing it wrong (you should
> > disable interrupts, not use a spinlock) and (b) causing a deadlock if it
> > ever happens.
>
>
> > + else {
> > + data = &per_cpu(csd_data, cpu);
> > + spin_lock(&per_cpu(csd_data_lock, cpu));
> > + while (data->flags & CSD_FLAG_LOCK)
> > + cpu_relax();
> > + data->flags = CSD_FLAG_LOCK;
> > + spin_unlock(&per_cpu(csd_data_lock, cpu));
> > + }
>
> I think your argument would hold if he did:
>
> data = &__get_cpu_var(csd_data);
>
> But now he's actually grabbing the remote cpu's csd, and thus needs
> atomicy around that remote csd -- which two cpus could contend for.
So the below should do
---
kernel/smp.c | 6 +-----
1 files changed, 1 insertions(+), 5 deletions(-)
diff --git a/kernel/smp.c b/kernel/smp.c
index 9bce851..9eead6c 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -201,8 +201,6 @@ void generic_smp_call_function_single_interrupt(void)
}
static DEFINE_PER_CPU(struct call_single_data, csd_data);
-static DEFINE_PER_CPU(spinlock_t, csd_data_lock) =
- __SPIN_LOCK_UNLOCKED(csd_lock);
/*
* smp_call_function_single - Run a function on a specific CPU
@@ -259,12 +257,10 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
if (data)
data->flags = CSD_FLAG_ALLOC;
else {
- data = &per_cpu(csd_data, cpu);
- spin_lock(&per_cpu(csd_data_lock, cpu));
+ data = &per_cpu(csd_data, me);
while (data->flags & CSD_FLAG_LOCK)
cpu_relax();
data->flags = CSD_FLAG_LOCK;
- spin_unlock(&per_cpu(csd_data_lock, cpu));
}
} else {
data = &d;
next prev parent reply other threads:[~2009-01-29 17:56 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-28 16:38 Buggy IPI and MTRR code on low memory Steven Rostedt
2009-01-28 16:41 ` Steven Rostedt
2009-01-28 16:46 ` Peter Zijlstra
2009-01-28 16:56 ` Steven Rostedt
2009-01-28 17:00 ` Peter Zijlstra
2009-01-28 17:24 ` Steven Rostedt
2009-01-28 18:20 ` Peter Zijlstra
2009-01-28 18:52 ` Steven Rostedt
2009-01-28 18:22 ` Arjan van de Ven
2009-01-28 18:34 ` Steven Rostedt
2009-01-28 21:12 ` Andrew Morton
2009-01-28 21:13 ` Andrew Morton
2009-01-28 21:23 ` Steven Rostedt
2009-01-28 22:07 ` Andrew Morton
2009-01-28 22:47 ` Steven Rostedt
2009-01-28 23:20 ` Andrew Morton
2009-01-28 23:50 ` Steven Rostedt
2009-01-28 23:25 ` Rusty Russell
2009-01-28 23:41 ` Steven Rostedt
2009-01-29 0:52 ` [PATCH] use per cpu data for single cpu ipi calls Steven Rostedt
2009-01-29 1:30 ` Andrew Morton
2009-01-29 1:56 ` Steven Rostedt
2009-01-29 8:49 ` Peter Zijlstra
2009-01-29 11:13 ` Ingo Molnar
2009-01-29 11:41 ` Peter Zijlstra
2009-01-29 13:42 ` Ingo Molnar
2009-01-29 14:07 ` Steven Rostedt
2009-01-29 15:08 ` [PATCH -v2] " Steven Rostedt
2009-01-29 15:33 ` Peter Zijlstra
2009-01-29 16:17 ` Ingo Molnar
2009-01-29 17:21 ` Linus Torvalds
2009-01-29 17:44 ` Steven Rostedt
2009-01-29 17:50 ` Steven Rostedt
2009-01-29 18:08 ` Linus Torvalds
2009-01-29 18:11 ` Steven Rostedt
2009-01-29 18:23 ` Peter Zijlstra
2009-01-29 18:31 ` Steven Rostedt
2009-01-29 18:39 ` Linus Torvalds
2009-01-29 18:44 ` Peter Zijlstra
2009-01-30 11:23 ` Jens Axboe
2009-01-30 12:32 ` [PATCH -v3] " Peter Zijlstra
2009-01-30 12:38 ` Jens Axboe
2009-01-30 12:48 ` Peter Zijlstra
2009-01-30 12:55 ` Jens Axboe
2009-01-30 12:56 ` Jens Axboe
2009-01-30 13:00 ` Peter Zijlstra
2009-01-30 13:02 ` [PATCH -v4] " Peter Zijlstra
2009-01-30 14:51 ` Ingo Molnar
2009-01-30 16:04 ` [PATCH -v3] " Linus Torvalds
2009-01-30 16:16 ` Peter Zijlstra
2009-01-31 8:44 ` Jens Axboe
2009-01-29 18:49 ` [PATCH -v2] " Ingo Molnar
2009-01-30 1:55 ` Rusty Russell
2009-01-29 17:47 ` Peter Zijlstra
2009-01-29 17:55 ` Peter Zijlstra [this message]
2009-01-29 18:08 ` Steven Rostedt
2009-01-30 1:11 ` Rusty Russell
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=1233251741.4495.111.camel@laptop \
--to=peterz@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=arjan@infradead.org \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=npiggin@suse.de \
--cc=rostedt@goodmis.org \
--cc=rusty@rustcorp.com.au \
--cc=tglx@linutronix.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.