aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/apic/summit_32.c
diff options
context:
space:
mode:
authorAlexander Gordeev <agordeev@redhat.com>2012-06-07 09:16:25 -0400
committerIngo Molnar <mingo@kernel.org>2012-06-08 05:44:30 -0400
commit4988a40c3981212fa8c64da68722affc1cb6697a (patch)
tree0210395a3b47a0295ca5015e6ad2d16e1bc58a5e /arch/x86/kernel/apic/summit_32.c
parentff164324123c0fe181d8de7dadcc7b3fbe25f2cf (diff)
x86/apic: Make cpu_mask_to_apicid() operations check cpu_online_mask
Currently cpu_mask_to_apicid() should not get a offline CPU with the cpumask. Otherwise some apic drivers might try to access non-existent per-cpu variables (i.e. x2apic). In that regard cpu_mask_to_apicid() and cpu_mask_to_apicid_and() operations are inconsistent. This fix makes the two operations do not rely on calling functions and always return the apicid for only online CPUs. As result, the meaning and implementations of cpu_mask_to_apicid() and cpu_mask_to_apicid_and() operations become straight. Signed-off-by: Alexander Gordeev <agordeev@redhat.com> Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> Cc: Yinghai Lu <yinghai@kernel.org> Link: http://lkml.kernel.org/r/20120607131624.GG4759@dhcp-26-207.brq.redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel/apic/summit_32.c')
-rw-r--r--arch/x86/kernel/apic/summit_32.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c
index 5766d84f12d6..79d360f6729e 100644
--- a/arch/x86/kernel/apic/summit_32.c
+++ b/arch/x86/kernel/apic/summit_32.c
@@ -272,7 +272,7 @@ summit_cpu_mask_to_apicid(const struct cpumask *cpumask, unsigned int *dest_id)
272 /* 272 /*
273 * The cpus in the mask must all be on the apic cluster. 273 * The cpus in the mask must all be on the apic cluster.
274 */ 274 */
275 for_each_cpu(cpu, cpumask) { 275 for_each_cpu_and(cpu, cpumask, cpu_online_mask) {
276 int new_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu); 276 int new_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu);
277 277
278 if (round && APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) { 278 if (round && APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) {
@@ -298,7 +298,6 @@ summit_cpu_mask_to_apicid_and(const struct cpumask *inmask,
298 return 0; 298 return 0;
299 299
300 cpumask_and(cpumask, inmask, andmask); 300 cpumask_and(cpumask, inmask, andmask);
301 cpumask_and(cpumask, cpumask, cpu_online_mask);
302 summit_cpu_mask_to_apicid(cpumask, apicid); 301 summit_cpu_mask_to_apicid(cpumask, apicid);
303 302
304 free_cpumask_var(cpumask); 303 free_cpumask_var(cpumask);