linux/arch/x86/kernel/cpu
Suresh Siddha 68f202e4e8 x86, mtrr: Use stop machine context to rendezvous all the cpu's
Use the stop machine context rather than IPI's to rendezvous all the cpus for
MTRR initialization that happens during cpu bringup or for MTRR modifications
during runtime.

This avoids deadlock scenario (reported by Prarit) like:

cpu A holds a read_lock (tasklist_lock for example) with irqs enabled
cpu B waits for the same lock with irqs disabled using write_lock_irq
cpu C doing set_mtrr() (during AP bringup for example), which will try to
rendezvous all the cpus using IPI's

This will result in C and A come to the rendezvous point and waiting
for B. B is stuck forever waiting for the lock and thus not
reaching the rendezvous point.

Using stop cpu (run in the process context of per cpu based keventd) to do
this rendezvous, avoids this deadlock scenario.

Also make sure all the cpu's are in the rendezvous handler before we proceed
with the local_irq_save() on each cpu. This lock step disabling irqs on all
the cpus will avoid other deadlock scenarios (for example involving
with the blocking smp_call_function's etc).

   [ This problem is very old. Marking -stable only for 2.6.35 as the
     stop_one_cpu_nowait() API is present only in 2.6.35. Any older
     kernel interested in this fix need to do some more work in backporting
     this patch. ]

Reported-by: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1280515602.2682.10.camel@sbsiddha-MOBL3.sc.intel.com>
Acked-by: Prarit Bhargava <prarit@redhat.com>
Cc: stable@kernel.org	[2.6.35]
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
2010-07-30 15:59:49 -07:00
..
cpufreq x86, k8: Fix section mismatch for powernowk8_exit() 2010-05-25 15:42:21 -07:00
mcheck Merge branch 'linux_next' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/i7core 2010-06-04 15:39:54 -07:00
mtrr x86, mtrr: Use stop machine context to rendezvous all the cpu's 2010-07-30 15:59:49 -07:00
.gitignore
addon_cpuid_features.c x86, cpu: Make APERF/MPERF a normal table-driven flag 2010-05-03 15:49:31 -07:00
amd.c x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space 2009-12-16 15:06:23 -08:00
bugs_64.c x86/cpu: Clean up various files a bit 2009-07-11 11:24:09 +02:00
bugs.c x86: Avoid check hlt for newer cpus 2010-05-07 15:31:17 -07:00
centaur.c x86, cpu: mv display_cacheinfo -> cpu_detect_cache_sizes 2009-11-23 11:59:53 -08:00
cmpxchg.c
common.c numa: x86_64: use generic percpu var numa_node_id() implementation 2010-05-27 09:12:57 -07:00
cpu.h x86, cpu: mv display_cacheinfo -> cpu_detect_cache_sizes 2009-11-23 11:59:53 -08:00
cyrix.c x86, cpu: mv display_cacheinfo -> cpu_detect_cache_sizes 2009-11-23 11:59:53 -08:00
hypervisor.c x86, hypervisor: add missing <linux/module.h> 2010-05-09 22:46:54 -07:00
intel_cacheinfo.c x86, cacheinfo: Turn off L3 cache index disable feature in virtualized environments 2010-05-14 11:53:01 -07:00
intel.c Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-05-18 08:49:13 -07:00
Makefile x86: Detect running on a Microsoft HyperV system 2010-05-06 18:24:15 -07:00
mkcapflags.pl
mshyperv.c x86, hypervisor: add missing <linux/module.h> 2010-05-09 22:46:54 -07:00
perf_event_amd.c perf, x86: Fix incorrect branches event on AMD CPUs 2010-07-03 15:19:34 +02:00
perf_event_intel_ds.c perf, x86: Improve the PEBS ABI 2010-05-07 11:31:02 +02:00
perf_event_intel_lbr.c perf, x86: Clean up debugctlmsr bit definitions 2010-03-26 09:41:03 +01:00
perf_event_intel.c perf_events: Fix Intel Westmere event constraints 2010-06-10 14:16:32 +02:00
perf_event_p4.c perf, x86: P4_pmu_schedule_events -- use smp_processor_id instead of raw_ 2010-05-19 09:41:05 +02:00
perf_event_p6.c perf, x86: Fix __initconst vs const 2010-04-02 19:52:05 +02:00
perf_event.c perf_events: Fix event scheduling issues introduced by transactional API 2010-05-31 08:46:10 +02:00
perfctr-watchdog.c perf, x86: rename macro in ARCH_PERFMON_EVENTSEL_ENABLE 2010-03-01 14:21:23 +01:00
powerflags.c
proc.c Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-09-14 07:57:32 -07:00
sched.c sched: x86: Name old_perf in a unique way 2009-09-16 11:21:07 +02:00
transmeta.c x86, cpu: mv display_cacheinfo -> cpu_detect_cache_sizes 2009-11-23 11:59:53 -08:00
umc.c
vmware.c x86, hypervisor: Export the x86_hyper* symbols 2010-05-09 01:10:34 -07:00