Commit f786419c authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] x86-64: remove WARN_ON in smp_call_function

Remove WARN_ON in smp_call_function. it breaks the machine check
handling and there is no good way to enable interrupts here.

 Call Trace:<ffffffff8011cb33>{smp_call_function+115} <ffffffff8011cbf9>{smp_send_stop+25}
 <ffffffff80138012>{panic+274} <ffffffff801187e0>{do_machine_check+0}
 <ffffffff80118c3a>{do_machine_check+1114} <ffffffff80111663>{machine_check+127}
 <ffffffff803434d7>{net_rx_action+215}  <EOE> <IRQ> <ffffffff8013c8e3>{__do_softirq+83}
   <ffffffff8013c975>{do_softirq+53} <ffffffff80113cdd>{do_IRQ+317}
 <<ffffffff8010f3b0>{default_idle+0} <ffffffff80110b81>{ret_from_intr+0}
     <EOI> <ffffffff8010f3d0>{default_idle+32} <ffffffff8010f86a>{cpu_idle+26}
  <ffffffff8058f886>{start_kernel+502} <ffffffff8058f1e0>{_sinittext+48
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 81b0a556
...@@ -396,6 +396,7 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic, ...@@ -396,6 +396,7 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
* *
* You must not call this function with disabled interrupts or from a * You must not call this function with disabled interrupts or from a
* hardware interrupt handler or from a bottom half handler. * hardware interrupt handler or from a bottom half handler.
* Actually there are a few legal cases, like panic.
*/ */
{ {
struct call_data_struct data; struct call_data_struct data;
...@@ -404,9 +405,6 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic, ...@@ -404,9 +405,6 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
if (!cpus) if (!cpus)
return 0; return 0;
/* Can deadlock when called with interrupts disabled */
WARN_ON(irqs_disabled());
data.func = func; data.func = func;
data.info = info; data.info = info;
atomic_set(&data.started, 0); atomic_set(&data.started, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment