From: Peter Zijlstra on 24 Jun 2010 02:50 On Thu, 2010-06-24 at 14:43 +0800, Huang Ying wrote: > Hi, Peter, > I fact I uses exactly the similar method in my patches, just trigger it > with soft_irq instead of IRQ. Please take a look at > nmi_return_notifier_schedule in But then why still use softirq? Once you have this its completely useless. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Huang Ying on 24 Jun 2010 02:50 Hi, Peter, On Thu, 2010-06-24 at 14:35 +0800, Peter Zijlstra wrote: > Something like this, but filled out with some arch code that does the > self-ipi and calls irq_work_run() should do. > > No need to molest the softirq code, no need for limited vectors of any > kind. > > Signed-off-by: Peter Zijlstra <a.p.zijlstra(a)chello.nl> > --- > include/linux/irq_callback.h | 13 ++++++++ > kernel/irq_callback.c | 66 +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 79 insertions(+) > > Index: linux-2.6/include/linux/irq_callback.h > =================================================================== > --- /dev/null > +++ linux-2.6/include/linux/irq_callback.h > @@ -0,0 +1,13 @@ > +#ifndef _LINUX_IRQ_CALLBACK_H > +#define _LINUX_IRQ_CALLBACK_H > + > +struct irq_work { > + struct irq_work *next; > + void (*func)(struct irq_work *); > +}; > + > +int irq_work_queue(struct irq_work *entry, void (*func)(struct irq_work *)); > +void irq_work_run(void); > +void irq_work_sync(struct irq_work *entry); > + > +#endif /* _LINUX_IRQ_CALLBACK_H */ > Index: linux-2.6/kernel/irq_callback.c > =================================================================== > --- /dev/null > +++ linux-2.6/kernel/irq_callback.c > @@ -0,0 +1,66 @@ > + > +#include <linux/irq_callback.h> > + > +#define CALLBACK_TAIL ((struct irq_work *)-1UL) > + > +static DEFINE_PER_CPU(struct irq_work *, irq_work_list) = { > + CALLBACK_TAIL, > +}; > + > +int irq_work_queue(struct irq_work *entry, void (*func)(struct irq_work *)) > +{ > + struct irq_work **head; > + > + if (cmpxchg(&entry->next, NULL, CALLBACK_TAIL) != NULL) > + return 0; > + > + entry->func = func; > + > + head = &get_cpu_var(irq_work_list); > + > + do { > + entry->next = *head; > + } while (cmpxchg(head, entry->next, entry) != entry->next); > + > + if (entry->next == CALLBACK_TAIL) > + arch_self_ipi(); > + > + put_cpu_var(irq_work_list); > + return 1; > +} > + > +void irq_work_run(void) > +{ > + struct irq_work *list; > + > + list = xchg(&__get_cpu_var(irq_work_list), CALLBACK_TAIL); > + while (list != CALLBACK_TAIL) { > + struct irq_work *entry = list; > + > + list = list->next; > + entry->func(entry); > + > + entry->next = NULL; > + /* > + * matches the mb in cmpxchg() in irq_work_queue() > + */ > + smp_wmb(); > + } > +} > + > +static int irq_work_pending(struct irq_work *entry) > +{ > + /* > + * matches the wmb in irq_work_run > + */ > + smp_rmb(); > + return entry->next != NULL; > +} > + > +void irq_work_sync(struct irq_work *entry) > +{ > + WARN_ON_ONCE(irqs_disabled()); > + > + while (irq_work_pending(entry)) > + cpu_relax(); > +} I fact I uses exactly the similar method in my patches, just trigger it with soft_irq instead of IRQ. Please take a look at nmi_return_notifier_schedule in [RFC 2/5] NMI return notifier Best Regards, Huang Ying -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Huang Ying on 24 Jun 2010 03:00 On Thu, 2010-06-24 at 14:47 +0800, Peter Zijlstra wrote: > On Thu, 2010-06-24 at 14:43 +0800, Huang Ying wrote: > > Hi, Peter, > > > I fact I uses exactly the similar method in my patches, just trigger it > > with soft_irq instead of IRQ. Please take a look at > > nmi_return_notifier_schedule in > > But then why still use softirq? Once you have this its completely > useless. Some systems have no self interrupt, for example the system without APIC. We need to provide a fallback for them. soft_irq can help here. Best Regards, Huang Ying -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Peter Zijlstra on 24 Jun 2010 03:00 On Thu, 2010-06-24 at 14:50 +0800, Huang Ying wrote: > On Thu, 2010-06-24 at 14:47 +0800, Peter Zijlstra wrote: > > On Thu, 2010-06-24 at 14:43 +0800, Huang Ying wrote: > > > Hi, Peter, > > > > > I fact I uses exactly the similar method in my patches, just trigger it > > > with soft_irq instead of IRQ. Please take a look at > > > nmi_return_notifier_schedule in > > > > But then why still use softirq? Once you have this its completely > > useless. > > Some systems have no self interrupt, for example the system without > APIC. We need to provide a fallback for them. soft_irq can help here. So there's systems that don't have self-ipi but do have NMI context? Can't we run the callbacks from the tick or something for such legacy muck? I really don't like the whole softirq mess. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Huang Ying on 24 Jun 2010 03:10
On Thu, 2010-06-24 at 14:58 +0800, Peter Zijlstra wrote: > On Thu, 2010-06-24 at 14:50 +0800, Huang Ying wrote: > > On Thu, 2010-06-24 at 14:47 +0800, Peter Zijlstra wrote: > > > On Thu, 2010-06-24 at 14:43 +0800, Huang Ying wrote: > > > > Hi, Peter, > > > > > > > I fact I uses exactly the similar method in my patches, just trigger it > > > > with soft_irq instead of IRQ. Please take a look at > > > > nmi_return_notifier_schedule in > > > > > > But then why still use softirq? Once you have this its completely > > > useless. > > > > Some systems have no self interrupt, for example the system without > > APIC. We need to provide a fallback for them. soft_irq can help here. > > So there's systems that don't have self-ipi but do have NMI context? Yes. NMI is there from 8259 age. > Can't we run the callbacks from the tick or something for such legacy > muck? I really don't like the whole softirq mess. That is possible. But in NO_HZ system, we have no tick to rely on. soft_irq is better here, because it will be triggered for any interrupt. Best Regards, Huang Ying -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |