Skip to contentSkip to conversation

x86/apic: Do not use smp_processor_id() in preemptible code

PATCH In review Borislav Petkov 2 participants 2 messages Sep 26, 2017 x86

lore
Share & tools
lore

Borislav Petkov

author maintainer
#0 lore raw

PATCH 1/1 x86/apic: Do not use smp_processor_id() in preemptible code

From: Borislav Petkov <[email protected]>

Call stack is:

check_preemption_disabled
? x2apic_prepare_cpu
x2apic_dead_cpu
cpuhp_invoke_callback
? cpuhp_kick_ap_work
? cpumask_next
_cpu_down
freeze_secondary_cpus
hibernation_snapshot
...

i.e., box is doing suspend-to-disk.

---
 arch/x86/kernel/apic/x2apic_cluster.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/apic/x2apic_cluster.c +1 -1
index 3da94277140f..6050c5364bdc 100644
@@ -156,7 +156,7 @@ static int x2apic_dead_cpu(unsigned int dead_cpu)
 {
 	struct cluster_mask *cmsk = per_cpu(cluster_masks, dead_cpu);
 
-	cpumask_clear_cpu(smp_processor_id(), &cmsk->mask);
+	cpumask_clear_cpu(dead_cpu, &cmsk->mask);
 	free_cpumask_var(per_cpu(ipi_mask, dead_cpu));
 	return 0;
 }
Signature · 1 line
2.13.0
#1 lore raw
Quoted 26 lines · Borislav Petkov

From: Borislav Petkov <[email protected]>

Call stack is:

check_preemption_disabled
? x2apic_prepare_cpu
x2apic_dead_cpu
cpuhp_invoke_callback
? cpuhp_kick_ap_work
? cpumask_next
_cpu_down
freeze_secondary_cpus
hibernation_snapshot
...

i.e., box is doing suspend-to-disk.

---
 arch/x86/kernel/apic/x2apic_cluster.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/apic/x2apic_cluster.c +0 -0
index 3da94277140f..6050c5364bdc 100644

arch/x86/kernel/apic/x2apic_cluster.c static int x2apic_dead_cpu(unsigned int dead_cpu) · line 159

Quoted 5 lines
arch/x86/kernel/apic/x2apic_cluster.c +1 -1
@@ -156,7 +156,7 @@ static int x2apic_dead_cpu(unsigned int dead_cpu)
 {
 	struct cluster_mask *cmsk = per_cpu(cluster_masks, dead_cpu);
 
-	cpumask_clear_cpu(smp_processor_id(), &cmsk->mask);
+	cpumask_clear_cpu(dead_cpu, &cmsk->mask);

Duh......

Quoted 7 lines
arch/x86/kernel/apic/x2apic_cluster.c +0 -0
 	free_cpumask_var(per_cpu(ipi_mask, dead_cpu));
 	return 0;
 }
Signature · 1 line
2.13.0