diff options
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 8 | ||||
-rw-r--r-- | arch/x86/kernel/smpboot.c | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 2430b31c9857..937150e4c06d 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -1256,11 +1256,16 @@ static void __clear_irq_vector(int irq, struct irq_cfg *cfg) | |||
1256 | void __setup_vector_irq(int cpu) | 1256 | void __setup_vector_irq(int cpu) |
1257 | { | 1257 | { |
1258 | /* Initialize vector_irq on a new cpu */ | 1258 | /* Initialize vector_irq on a new cpu */ |
1259 | /* This function must be called with vector_lock held */ | ||
1260 | int irq, vector; | 1259 | int irq, vector; |
1261 | struct irq_cfg *cfg; | 1260 | struct irq_cfg *cfg; |
1262 | struct irq_desc *desc; | 1261 | struct irq_desc *desc; |
1263 | 1262 | ||
1263 | /* | ||
1264 | * vector_lock will make sure that we don't run into irq vector | ||
1265 | * assignments that might be happening on another cpu in parallel, | ||
1266 | * while we setup our initial vector to irq mappings. | ||
1267 | */ | ||
1268 | spin_lock(&vector_lock); | ||
1264 | /* Mark the inuse vectors */ | 1269 | /* Mark the inuse vectors */ |
1265 | for_each_irq_desc(irq, desc) { | 1270 | for_each_irq_desc(irq, desc) { |
1266 | cfg = desc->chip_data; | 1271 | cfg = desc->chip_data; |
@@ -1279,6 +1284,7 @@ void __setup_vector_irq(int cpu) | |||
1279 | if (!cpumask_test_cpu(cpu, cfg->domain)) | 1284 | if (!cpumask_test_cpu(cpu, cfg->domain)) |
1280 | per_cpu(vector_irq, cpu)[vector] = -1; | 1285 | per_cpu(vector_irq, cpu)[vector] = -1; |
1281 | } | 1286 | } |
1287 | spin_unlock(&vector_lock); | ||
1282 | } | 1288 | } |
1283 | 1289 | ||
1284 | static struct irq_chip ioapic_chip; | 1290 | static struct irq_chip ioapic_chip; |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 678d0b8c26f3..b2ebcba729d9 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -241,6 +241,11 @@ static void __cpuinit smp_callin(void) | |||
241 | map_cpu_to_logical_apicid(); | 241 | map_cpu_to_logical_apicid(); |
242 | 242 | ||
243 | notify_cpu_starting(cpuid); | 243 | notify_cpu_starting(cpuid); |
244 | |||
245 | /* | ||
246 | * Need to setup vector mappings before we enable interrupts. | ||
247 | */ | ||
248 | __setup_vector_irq(smp_processor_id()); | ||
244 | /* | 249 | /* |
245 | * Get our bogomips. | 250 | * Get our bogomips. |
246 | * | 251 | * |
@@ -315,7 +320,6 @@ notrace static void __cpuinit start_secondary(void *unused) | |||
315 | */ | 320 | */ |
316 | ipi_call_lock(); | 321 | ipi_call_lock(); |
317 | lock_vector_lock(); | 322 | lock_vector_lock(); |
318 | __setup_vector_irq(smp_processor_id()); | ||
319 | set_cpu_online(smp_processor_id(), true); | 323 | set_cpu_online(smp_processor_id(), true); |
320 | unlock_vector_lock(); | 324 | unlock_vector_lock(); |
321 | ipi_call_unlock(); | 325 | ipi_call_unlock(); |