linux/include/asm-i386/mach-default
Satyam Sharma 62be90012c i386: Fix a couple busy loops in mach_wakecpu.h:wait_for_init_deassert()
Use cpu_relax() in the busy loops, as atomic_read() doesn't automatically
imply volatility for i386 and x86_64. x86_64 doesn't have this issue because
it open-codes the while loop in smpboot.c:smp_callin() itself that already
uses cpu_relax().

For i386, however, smpboot.c:smp_callin() calls wait_for_init_deassert()
which is buggy for mach-default and mach-es7000 cases.

[ I test-built a kernel -- smp_callin() itself got inlined in its only
  callsite, smpboot.c:start_secondary() -- and the relevant piece of
  code disassembles to the following:

0xc1019704 <start_secondary+12>:        mov    0xc144c4c8,%eax
0xc1019709 <start_secondary+17>:        test   %eax,%eax
0xc101970b <start_secondary+19>:        je     0xc1019709 <start_secondary+17>

  init_deasserted (at 0xc144c4c8) gets fetched into %eax only once and
  then we loop over the test of the stale value in the register only,
  so these look like real bugs to me. With the fix below, this becomes:

0xc1019706 <start_secondary+14>:        pause
0xc1019708 <start_secondary+16>:        cmpl   $0x0,0xc144c4c8
0xc101970f <start_secondary+23>:        je     0xc1019706 <start_secondary+14>

  which looks nice and healthy. ]

Thanks to Heiko Carstens for noticing this.

Signed-off-by: Satyam Sharma <satyam@infradead.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-08-18 09:54:44 -07:00
..
apm.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
bios_ebda.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
do_timer.h i386: remove pit_interrupt_hook 2007-07-21 18:37:08 -07:00
entry_arch.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
io_ports.h i386: move PIT function declarations and constants to correct header file 2007-07-21 18:37:14 -07:00
irq_vectors.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
irq_vectors_limits.h paravirt: increase IRQ limit 2007-07-18 08:47:41 -07:00
mach_apic.h [PATCH] x86: default to physical mode on hotplug CPU kernels 2007-05-02 19:27:04 +02:00
mach_apicdef.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach_ipi.h [PATCH] x86_64: Avoid broadcasting NMI IPIs 2006-06-26 10:48:22 -07:00
mach_mpparse.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach_mpspec.h [PATCH] x86: increase MAX_MP_BUSSES on default arch 2006-09-01 11:39:08 -07:00
mach_reboot.h i386: fix machine rebooting 2007-07-21 18:37:10 -07:00
mach_time.h [PATCH] RTC: Fix up some RTC whitespace and style 2006-03-28 09:16:01 -08:00
mach_timer.h [PATCH] Time: i386 Conversion - part 2: Rework TSC Support 2006-06-26 09:58:21 -07:00
mach_traps.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mach_wakecpu.h i386: Fix a couple busy loops in mach_wakecpu.h:wait_for_init_deassert() 2007-08-18 09:54:44 -07:00
pci-functions.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
setup_arch.h [PATCH] paravirt: header and stubs for paravirtualisation 2006-12-07 02:14:07 +01:00
smpboot_hooks.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00