|
@@ -575,8 +575,10 @@ EXPORT_SYMBOL(on_each_cpu);
|
|
|
*
|
|
|
* If @wait is true, then returns once @func has returned.
|
|
|
*
|
|
|
- * You must not call this function with disabled interrupts or
|
|
|
- * from a hardware interrupt handler or from a bottom half handler.
|
|
|
+ * You must not call this function with disabled interrupts or from a
|
|
|
+ * hardware interrupt handler or from a bottom half handler. The
|
|
|
+ * exception is that it may be used during early boot while
|
|
|
+ * early_boot_irqs_disabled is set.
|
|
|
*/
|
|
|
void on_each_cpu_mask(const struct cpumask *mask, smp_call_func_t func,
|
|
|
void *info, bool wait)
|
|
@@ -585,9 +587,10 @@ void on_each_cpu_mask(const struct cpumask *mask, smp_call_func_t func,
|
|
|
|
|
|
smp_call_function_many(mask, func, info, wait);
|
|
|
if (cpumask_test_cpu(cpu, mask)) {
|
|
|
- local_irq_disable();
|
|
|
+ unsigned long flags;
|
|
|
+ local_irq_save(flags);
|
|
|
func(info);
|
|
|
- local_irq_enable();
|
|
|
+ local_irq_restore(flags);
|
|
|
}
|
|
|
put_cpu();
|
|
|
}
|