From cf7fb5bf4a63adfdb3e81516d93d32ed7471a7fd Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 17 Jun 2008 09:12:03 +0200 Subject: [PATCH] --- yaml --- r: 99432 b: refs/heads/master c: 0beefa208bb3a9e581a60125703409ebe6f7fa53 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/process.c | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 9beb2b6667b6..6ddc227d3e27 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: aa276e1cafb3ce9d01d1e837bcd67e92616013ac +refs/heads/master: 0beefa208bb3a9e581a60125703409ebe6f7fa53 diff --git a/trunk/arch/x86/kernel/process.c b/trunk/arch/x86/kernel/process.c index 68ad3539b143..4061d63aabe7 100644 --- a/trunk/arch/x86/kernel/process.c +++ b/trunk/arch/x86/kernel/process.c @@ -267,17 +267,29 @@ static void c1e_idle(void) if (!cpu_isset(cpu, c1e_mask)) { cpu_set(cpu, c1e_mask); - /* Force broadcast so ACPI can not interfere */ + /* + * Force broadcast so ACPI can not interfere. Needs + * to run with interrupts enabled as it uses + * smp_function_call. + */ + local_irq_enable(); clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_FORCE, &cpu); printk(KERN_INFO "Switch to broadcast mode on CPU%d\n", cpu); + local_irq_disable(); } clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); + default_idle(); - local_irq_disable(); - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); - local_irq_enable(); + + /* + * The switch back from broadcast mode needs to be + * called with interrupts disabled. + */ + local_irq_disable(); + clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); + local_irq_enable(); } else default_idle(); }