From: Peter Zijlstra <peterz@infradead.org>
To: Huang Ying <ying.huang@intel.com>
Cc: Ingo Molnar <mingo@elte.hu>, "H.PeterA" <"nvin hpa"@zytor.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Andi Kleen <andi@firstfloor.org>
Subject: Re: [RFC][PATCH] irq_work
Date: Fri, 25 Jun 2010 11:30:45 +0200 [thread overview]
Message-ID: <1277458245.32034.96.camel@twins> (raw)
In-Reply-To: <1277457439.3947.184.camel@yhuang-dev.sh.intel.com>
On Fri, 2010-06-25 at 17:17 +0800, Huang Ying wrote:
> On Fri, 2010-06-25 at 15:48 +0800, Peter Zijlstra wrote:
> > On Fri, 2010-06-25 at 10:12 +0800, Huang Ying wrote:
> > >
> > > It is better to add "void *data" field in this struct to allow same
> > > function can be used for multiple struct irq_work.
> >
> > No, simply do:
> >
> > struct my_foo {
> > struct irq_work work;
> > /* my extra data */
> > }
> >
> > void my_func(struct irq_work *work)
> > {
> > struct my_foo *foo = container_of(work, struct my_foo, work);
> >
> > /* tada! */
> > }
>
> Yes. This works too. But Adding "void *data" field is helpful if you do
> not embed struct irq_work into another struct.
No, embedding is the normal way we do this in the kernel.
> > > And I think IRQ is the implementation detail here, so irq_work is
> > > probably not a good name. nmi_return_notifier or nmi_callback is better?
> >
> > Well, its ran in hard-irq context, so its an irq work. There's nothing
> > that says it can only be used from NMI context.
>
> It may be run in other contexts on some system (without APIC).
I would consider that a BUG. Use a random IRQ source to process the
callbacks on these broken platforms.
> And I
> don't think it is useful to others except NMI handler. I think this is a
> choice between naming after implementation and purpose.
There is, although I'm sure people will yell at me for even proposing
this. You can raise the IPI from an IRQ disabled section to get
something done right after it.
> We can use another flag to signify whether it is executing. For example
> the bit 0 of entry->next.
There's no point.
> > I think clearing after the function is done executing is the only sane
> > semantics (and yes, I should fix the current perf code).
> >
> > You can always miss an NMI since it can always happen before the
> > callback gets done, and allowing another enqueue before the callback is
> > complete is asking for trouble.
>
> If we move entry->next = NULL before entry->func(entry), we will not
> miss the NMI. Can you show how to miss it in this way?
<NMI>
...
irq_work_queue(&my_work, func);
...
<EOI>
<IPI>
irq_work_run()
<NMI>
irq_work_queue(&my_work, func); <FAIL>
<EOI>
my_func.next = NULL;
<EOI>
Really not that hard. Now imagine wrapping irq_work in some state and
you reusing the state while the function is still running..
next prev parent reply other threads:[~2010-06-25 9:31 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-24 3:04 [RFC 1/5] Make soft_irq NMI safe Huang Ying
2010-06-24 3:04 ` [RFC 2/5] NMI return notifier Huang Ying
2010-06-24 3:04 ` [RFC 3/5] x86, trigger NMI return notifier soft_irq earlier Huang Ying
2010-06-24 6:03 ` Peter Zijlstra
2010-06-24 3:04 ` [RFC 4/5] x86, Use NMI return notifier in MCE Huang Ying
2010-06-24 10:00 ` Andi Kleen
2010-06-24 3:04 ` [RFC 5/5] Use NMI return notifier in perf pending Huang Ying
2010-06-24 6:00 ` Peter Zijlstra
2010-06-24 6:09 ` [RFC 1/5] Make soft_irq NMI safe Peter Zijlstra
2010-06-24 6:45 ` Huang Ying
2010-06-24 6:35 ` [RFC][PATCH] irq_work Peter Zijlstra
2010-06-24 6:43 ` Huang Ying
2010-06-24 6:47 ` Peter Zijlstra
2010-06-24 6:50 ` Huang Ying
2010-06-24 6:58 ` Peter Zijlstra
2010-06-24 7:04 ` Huang Ying
2010-06-24 7:19 ` Peter Zijlstra
2010-06-24 7:27 ` Huang Ying
2010-06-24 7:32 ` Peter Zijlstra
2010-06-24 10:27 ` Andi Kleen
2010-06-24 10:30 ` Peter Zijlstra
2010-06-24 10:52 ` Andi Kleen
2010-06-24 10:58 ` Peter Zijlstra
2010-06-24 11:08 ` Andi Kleen
2010-06-24 11:10 ` Peter Zijlstra
2010-06-24 11:20 ` Andi Kleen
2010-06-24 11:33 ` Peter Zijlstra
2010-06-24 11:55 ` Andi Kleen
2010-06-24 11:57 ` Peter Zijlstra
2010-06-24 12:02 ` Andi Kleen
2010-06-24 12:18 ` Peter Zijlstra
2010-06-24 12:38 ` Andi Kleen
2010-06-25 10:38 ` Peter Zijlstra
2010-06-24 11:42 ` Peter Zijlstra
2010-06-24 11:58 ` Andi Kleen
2010-06-24 12:02 ` Peter Zijlstra
2010-06-24 11:23 ` Ingo Molnar
2010-06-24 11:34 ` Peter Zijlstra
2010-06-24 12:35 ` Ingo Molnar
2010-06-24 13:02 ` Andi Kleen
2010-06-24 13:20 ` Borislav Petkov
2010-06-24 13:33 ` Andi Kleen
2010-06-24 13:42 ` Ingo Molnar
2010-06-24 13:46 ` Ingo Molnar
2010-06-24 14:01 ` Andi Kleen
2010-06-24 15:41 ` Borislav Petkov
2010-06-24 16:09 ` Andi Kleen
2010-06-25 2:12 ` Huang Ying
2010-06-25 7:48 ` Peter Zijlstra
2010-06-25 9:17 ` Huang Ying
2010-06-25 9:23 ` Frederic Weisbecker
2010-06-25 9:30 ` Huang Ying
2010-06-25 9:44 ` Frederic Weisbecker
2010-06-25 9:30 ` Peter Zijlstra [this message]
2010-06-25 11:58 ` huang ying
2010-06-25 9:08 ` Andi Kleen
2010-06-25 18:30 ` [RFC][PATCH] irq_work -v2 Peter Zijlstra
2010-06-25 19:30 ` Andi Kleen
2010-06-25 19:39 ` Peter Zijlstra
2010-06-25 19:49 ` Peter Zijlstra
2010-06-25 22:29 ` Andi Kleen
2010-06-26 8:36 ` Peter Zijlstra
2010-06-26 10:08 ` Andi Kleen
2010-06-26 10:32 ` Peter Zijlstra
2010-06-25 19:47 ` Peter Zijlstra
2010-06-26 1:26 ` huang ying
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=1277458245.32034.96.camel@twins \
--to=peterz@infradead.org \
--cc="nvin hpa"@zytor.com \
--cc=andi@firstfloor.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=ying.huang@intel.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