linux/drivers
Ingo Molnar 5d0e600d90 [PATCH] x86: fix laptop bootup hang in init_acpi()
During kernel bootup, a new T60 laptop (CoreDuo, 32-bit) hangs about
10%-20% of the time in acpi_init():

 Calling initcall 0xc055ce1a: topology_init+0x0/0x2f()
 Calling initcall 0xc055d75e: mtrr_init_finialize+0x0/0x2c()
 Calling initcall 0xc05664f3: param_sysfs_init+0x0/0x175()
 Calling initcall 0xc014cb65: pm_sysrq_init+0x0/0x17()
 Calling initcall 0xc0569f99: init_bio+0x0/0xf4()
 Calling initcall 0xc056b865: genhd_device_init+0x0/0x50()
 Calling initcall 0xc056c4bd: fbmem_init+0x0/0x87()
 Calling initcall 0xc056dd74: acpi_init+0x0/0x1ee()

It's a hard hang that not even an NMI could punch through!  Frustratingly,
adding printks or function tracing to the ACPI code made the hangs go away
...

After some time an additional detail emerged: disabling the NMI watchdog
made these occasional hangs go away.

So i spent the better part of today trying to debug this and trying out
various theories when i finally found the likely reason for the hang: if
acpi_ns_initialize_devices() executes an _INI AML method and an NMI
happens to hit that AML execution in the wrong moment, the machine would
hang.  (my theory is that this must be some sort of chipset setup method
doing stores to chipset mmio registers?)

Unfortunately given the characteristics of the hang it was sheer
impossible to figure out which of the numerous AML methods is impacted
by this problem.

As a workaround i wrote an interface to disable chipset-based NMIs while
executing _INI sections - and indeed this fixed the hang.  I did a
boot-loop of 100 separate reboots and none hung - while without the patch
it would hang every 5-10 attempts.  Out of caution i did not touch the
nmi_watchdog=2 case (it's not related to the chipset anyway and didnt
hang).

I implemented this for both x86_64 and i686, tested the i686 laptop both
with nmi_watchdog=1 [which triggered the hangs] and nmi_watchdog=2, and
tested an Athlon64 box with the 64-bit kernel as well. Everything builds
and works with the patch applied.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Andi Kleen <ak@suse.de>
Cc: Len Brown <lenb@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2007-02-13 13:26:24 +01:00
..
acorn [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
acpi [PATCH] x86: fix laptop bootup hang in init_acpi() 2007-02-13 13:26:24 +01:00
amba [ARM] Fix __must_check warnings in drivers/bus/amba.c 2006-11-30 14:04:49 +00:00
ata libata: kill ATA_ENABLE_PATA 2007-02-09 17:39:40 -05:00
atm [PATCH] Get rid of "double zeroing" of allocated pages 2007-02-11 10:51:31 -08:00
auxdisplay [PATCH] drivers: add LCD support 2007-02-11 10:51:24 -08:00
base [PATCH] Drop __get_zone_counts() 2007-02-11 10:51:18 -08:00
block [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
bluetooth [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
cdrom [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
char [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
clocksource [PATCH] clocksource: small cleanup 2006-12-10 09:57:22 -08:00
connector [PATCH] connector: some fixes for ia64 unaligned access errors 2007-01-05 23:55:29 -08:00
cpufreq [CPUFREQ] check sysfs_create_link return value 2007-01-29 00:06:27 -05:00
crypto Merge branch 'HEAD' of master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6 2007-02-08 15:25:18 -08:00
dio
dma [PATCH] slab: remove SLAB_KERNEL 2006-12-07 08:39:24 -08:00
edac [PATCH] EDAC: Add Fully-Buffered DIMM APIs to core 2007-02-12 09:48:32 -08:00
eisa [PATCH] EISA: handle sysfs errors 2006-10-11 11:14:25 -07:00
fc4 [PATCH] getting rid of all casts of k[cmz]alloc() calls 2006-12-13 09:05:58 -08:00
firmware [PATCH] docbook: add edd firmware interfaces 2007-02-11 10:51:32 -08:00
hid HID: move away from DEBUG defines in favor of CONFIG_HID_DEBUG 2007-02-05 10:00:45 +01:00
hwmon [PATCH] hwmon: ansify 2007-02-09 09:14:06 -08:00
i2c [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
ide [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
ieee1394 [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
infiniband [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
input [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
isdn [PATCH] mark struct file_operations const 3 2007-02-12 09:48:45 -08:00
kvm [PATCH] i386: Convert i386 PDA code to use %fs 2007-02-13 13:26:20 +01:00
leds [PATCH] Fix leds-s3c24xx hardware.h reference 2007-01-05 23:55:21 -08:00
macintosh [PATCH] mark struct file_operations const 4 2007-02-12 09:48:45 -08:00
mca [PATCH] drivers/mca: handle sysfs errors 2006-10-11 11:14:25 -07:00
md [PATCH] mark struct file_operations const 4 2007-02-12 09:48:45 -08:00
media [PATCH] mark struct file_operations const 4 2007-02-12 09:48:45 -08:00
message [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
mfd [PATCH] Add include/linux/freezer.h and move definitions from sched.h 2006-12-07 08:39:27 -08:00
misc [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
mmc Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc 2007-02-11 11:39:00 -08:00
mtd [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
net [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
nubus
oprofile [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
parisc [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
parport [PATCH] Kconfig refactoring for better menu nesting 2006-12-10 09:55:39 -08:00
pci [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
pcmcia [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
pnp [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
ps3 [PATCH] ps3: disable display flipping during mode changes 2007-02-12 09:48:44 -08:00
rapidio [PATCH] rapidio: fix multi-switch enumeration 2007-02-11 11:18:07 -08:00
rtc [PATCH] mark struct file_operations const 5 2007-02-12 09:48:45 -08:00
s390 Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6 2007-02-12 09:57:44 -08:00
sbus [PATCH] mark struct file_operations const 6 2007-02-12 09:48:45 -08:00
scsi [PATCH] mark struct file_operations const 6 2007-02-12 09:48:45 -08:00
serial [PATCH] atmel_serial: Use __raw I/O register access 2007-02-12 09:48:29 -08:00
sh
sn [PATCH] IOC3/IOC4: PCI mem space resources 2007-02-11 10:51:25 -08:00
spi [PATCH] SPI eeprom driver 2007-02-12 09:48:31 -08:00
tc [PATCH] Char: tty_wakeup cleanup 2007-02-11 10:51:26 -08:00
telephony [PATCH] mark struct file_operations const 6 2007-02-12 09:48:45 -08:00
usb [PATCH] mark struct file_operations const 6 2007-02-12 09:48:45 -08:00
video [PATCH] mark struct file_operations const 6 2007-02-12 09:48:45 -08:00
w1 [PATCH] w1: Use ARRAY_SIZE macro when appropriate 2007-02-12 09:48:28 -08:00
zorro [PATCH] mark struct file_operations const 6 2007-02-12 09:48:45 -08:00
Kconfig [PATCH] drivers: add LCD support 2007-02-11 10:51:24 -08:00
Makefile [PATCH] drivers: add LCD support 2007-02-11 10:51:24 -08:00