Hi Ingo, On 07/05/2014 04:13 PM, tip-bot for Peter Zijlstra wrote: > Commit-ID: a77353e5eb56b6c6098bfce59aff1f449451b0b7 > Gitweb: http://git.kernel.org/tip/a77353e5eb56b6c6098bfce59aff1f449451b0b7 > Author: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > AuthorDate: Wed, 25 Jun 2014 07:13:07 +0200 > Committer: Ingo Molnar <mingo@xxxxxxxxxx> > CommitDate: Sat, 5 Jul 2014 11:17:26 +0200 > > irq_work: Remove BUG_ON in irq_work_run() > I believe this fix has to go into 3.16 itself, since this fixes a CPU hotplug regression on many systems, as reported here: https://lkml.org/lkml/2014/6/24/765 https://lkml.org/lkml/2014/7/1/473 https://lkml.org/lkml/2014/7/4/16 I didn't find this fix in mainline yet, so I thought of sending a note. Thank you! Regards, Srivatsa S. Bhat > Because of a collision with 8d056c48e486 ("CPU hotplug, smp: flush any > pending IPI callbacks before CPU offline"), which ends up calling > hotplug_cfd()->flush_smp_call_function_queue()->irq_work_run(), which > is not from IRQ context. > > And since that already calls irq_work_run() from the hotplug path, > remove our entire hotplug handling. > > Reported-by: Stephen Warren <swarren@xxxxxxxxxxxxx> > Tested-by: Stephen Warren <swarren@xxxxxxxxxxxxx> > Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> > Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx> > Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Link: http://lkml.kernel.org/n/tip-busatzs2gvz4v62258agipuf@xxxxxxxxxxxxxx > Signed-off-by: Ingo Molnar <mingo@xxxxxxxxxx> > --- > kernel/irq_work.c | 46 ++++------------------------------------------ > 1 file changed, 4 insertions(+), 42 deletions(-) > > diff --git a/kernel/irq_work.c b/kernel/irq_work.c > index 4b0a890..e6bcbe7 100644 > --- a/kernel/irq_work.c > +++ b/kernel/irq_work.c > @@ -160,20 +160,14 @@ static void irq_work_run_list(struct llist_head *list) > } > } > > -static void __irq_work_run(void) > -{ > - irq_work_run_list(&__get_cpu_var(raised_list)); > - irq_work_run_list(&__get_cpu_var(lazy_list)); > -} > - > /* > - * Run the irq_work entries on this cpu. Requires to be ran from hardirq > - * context with local IRQs disabled. > + * hotplug calls this through: > + * hotplug_cfd() -> flush_smp_call_function_queue() > */ > void irq_work_run(void) > { > - BUG_ON(!in_irq()); > - __irq_work_run(); > + irq_work_run_list(&__get_cpu_var(raised_list)); > + irq_work_run_list(&__get_cpu_var(lazy_list)); > } > EXPORT_SYMBOL_GPL(irq_work_run); > > @@ -189,35 +183,3 @@ void irq_work_sync(struct irq_work *work) > cpu_relax(); > } > EXPORT_SYMBOL_GPL(irq_work_sync); > - > -#ifdef CONFIG_HOTPLUG_CPU > -static int irq_work_cpu_notify(struct notifier_block *self, > - unsigned long action, void *hcpu) > -{ > - long cpu = (long)hcpu; > - > - switch (action) { > - case CPU_DYING: > - /* Called from stop_machine */ > - if (WARN_ON_ONCE(cpu != smp_processor_id())) > - break; > - __irq_work_run(); > - break; > - default: > - break; > - } > - return NOTIFY_OK; > -} > - > -static struct notifier_block cpu_notify; > - > -static __init int irq_work_init_cpu_notifier(void) > -{ > - cpu_notify.notifier_call = irq_work_cpu_notify; > - cpu_notify.priority = 0; > - register_cpu_notifier(&cpu_notify); > - return 0; > -} > -device_initcall(irq_work_init_cpu_notifier); > - > -#endif /* CONFIG_HOTPLUG_CPU */ > -- To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html