diff options
author | Alexander Gordeev <agordeev@redhat.com> | 2012-06-07 09:16:25 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-06-08 05:44:30 -0400 |
commit | 4988a40c3981212fa8c64da68722affc1cb6697a (patch) | |
tree | 0210395a3b47a0295ca5015e6ad2d16e1bc58a5e /arch/x86/kernel/apic/summit_32.c | |
parent | ff164324123c0fe181d8de7dadcc7b3fbe25f2cf (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.c | 3 |
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); |