| From stable-bounces@linux.kernel.org Sat May 19 07:19:01 2007 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| To: linux-kernel@vger.kernel.org |
| Date: Sat, 19 May 2007 16:22:50 +0200 |
| Message-Id: <1179584570.12981.123.camel@chaos> |
| Cc: Andrew Morton <akpm@osdl.org>, Ingo Molnar <mingo@elte.hu>, Darren Hart <dvhltc@us.ibm.com>, stable@kernel.org, Len Brown <lenb@kernel.org> |
| Subject: Ignore bogus ACPI info for offline CPUs |
| |
| Booting a SMP kernel with maxcpus=1 on a SMP system leads to a hard |
| hang, because ACPI ignores the maxcpus setting and sends timer broadcast |
| info for the offline CPUs. This results in a stuck for ever call to |
| smp_call_function_single() on an offline CPU. |
| |
| Ignore the bogus information and print a kernel error to remind ACPI |
| folks to fix it. |
| |
| Affects 2.6.21 / 2.6.22-rc |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/time/tick-broadcast.c | 17 ++++++++++++----- |
| 1 file changed, 12 insertions(+), 5 deletions(-) |
| |
| --- linux-2.6.21.4.orig/kernel/time/tick-broadcast.c |
| +++ linux-2.6.21.4/kernel/time/tick-broadcast.c |
| @@ -243,11 +243,18 @@ void tick_broadcast_on_off(unsigned long |
| { |
| int cpu = get_cpu(); |
| |
| - if (cpu == *oncpu) |
| - tick_do_broadcast_on_off(&reason); |
| - else |
| - smp_call_function_single(*oncpu, tick_do_broadcast_on_off, |
| - &reason, 1, 1); |
| + if (!cpu_isset(*oncpu, cpu_online_map)) { |
| + printk(KERN_ERR "tick-braodcast: ignoring broadcast for " |
| + "offline CPU #%d\n", *oncpu); |
| + } else { |
| + |
| + if (cpu == *oncpu) |
| + tick_do_broadcast_on_off(&reason); |
| + else |
| + smp_call_function_single(*oncpu, |
| + tick_do_broadcast_on_off, |
| + &reason, 1, 1); |
| + } |
| put_cpu(); |
| } |
| |