f833bab87f
Currently clockevents_notify() is called with interrupts enabled at some places and interrupts disabled at some other places. This results in a deadlock in this scenario. cpu A holds clockevents_lock in clockevents_notify() with irqs enabled cpu B waits for clockevents_lock in clockevents_notify() with irqs disabled cpu C doing set_mtrr() which will try to rendezvous of all the cpus. This will result in C and A come to the rendezvous point and waiting for B. B is stuck forever waiting for the spinlock and thus not reaching the rendezvous point. Fix the clockevents code so that clockevents_lock is taken with interrupts disabled and thus avoid the above deadlock. Also call lapic_timer_propagate_broadcast() on the destination cpu so that we avoid calling smp_call_function() in the clockevents notifier chain. This issue left us wondering if we need to change the MTRR rendezvous logic to use stop machine logic (instead of smp_call_function) or add a check in spinlock debug code to see if there are other spinlocks which gets taken under both interrupts enabled/disabled conditions. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Cc: "Pallipadi Venkatesh" <venkatesh.pallipadi@intel.com> Cc: "Brown Len" <len.brown@intel.com> LKML-Reference: <1250544899.2709.210.camel@sbs-t61.sc.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
||
---|---|---|
.. | ||
acpica | ||
ac.c | ||
acpi_memhotplug.c | ||
battery.c | ||
blacklist.c | ||
bus.c | ||
button.c | ||
cm_sbs.c | ||
container.c | ||
debug.c | ||
dock.c | ||
ec.c | ||
event.c | ||
fan.c | ||
glue.c | ||
internal.h | ||
Kconfig | ||
Makefile | ||
numa.c | ||
osl.c | ||
pci_bind.c | ||
pci_irq.c | ||
pci_link.c | ||
pci_root.c | ||
pci_slot.c | ||
power.c | ||
proc.c | ||
processor_core.c | ||
processor_idle.c | ||
processor_perflib.c | ||
processor_thermal.c | ||
processor_throttling.c | ||
reboot.c | ||
sbs.c | ||
sbshc.c | ||
sbshc.h | ||
scan.c | ||
sleep.c | ||
sleep.h | ||
system.c | ||
tables.c | ||
thermal.c | ||
utils.c | ||
video_detect.c | ||
video.c | ||
wakeup.c |