diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-21 03:30:37 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-21 03:30:37 +0100 |
commit | 2b1caf6ed7b888c95a1909d343799672731651a5 (patch) | |
tree | 7ab9a7ae13bc02376bce6267df67f6f2aa9091f1 /kernel/smp.c | |
parent | ACPI / PM: Call suspend_nvs_free() earlier during resume (diff) | |
parent | smp: Allow on_each_cpu() to be called while early_boot_irqs_disabled status t... (diff) | |
download | linux-2b1caf6ed7b888c95a1909d343799672731651a5.tar.xz linux-2b1caf6ed7b888c95a1909d343799672731651a5.zip |
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
smp: Allow on_each_cpu() to be called while early_boot_irqs_disabled status to init/main.c
lockdep: Move early boot local IRQ enable/disable status to init/main.c
Diffstat (limited to 'kernel/smp.c')
-rw-r--r-- | kernel/smp.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/kernel/smp.c b/kernel/smp.c index 2fe66f7c617a..9910744f0856 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -459,7 +459,7 @@ void smp_call_function_many(const struct cpumask *mask, * can't happen. */ WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled() - && !oops_in_progress); + && !oops_in_progress && !early_boot_irqs_disabled); /* So, what's a CPU they want? Ignoring this one. */ cpu = cpumask_first_and(mask, cpu_online_mask); @@ -572,17 +572,20 @@ void ipi_call_unlock_irq(void) #endif /* USE_GENERIC_SMP_HELPERS */ /* - * Call a function on all processors + * Call a function on all processors. May be used during early boot while + * early_boot_irqs_disabled is set. Use local_irq_save/restore() instead + * of local_irq_disable/enable(). */ int on_each_cpu(void (*func) (void *info), void *info, int wait) { + unsigned long flags; int ret = 0; preempt_disable(); ret = smp_call_function(func, info, wait); - local_irq_disable(); + local_irq_save(flags); func(info); - local_irq_enable(); + local_irq_restore(flags); preempt_enable(); return ret; } |