diff options
-rw-r--r-- | arch/x86/Kconfig | 10 | ||||
-rw-r--r-- | arch/x86/configs/x86_64_defconfig | 1 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 56 | ||||
-rw-r--r-- | include/linux/irq.h | 10 | ||||
-rw-r--r-- | kernel/irq/Makefile | 2 | ||||
-rw-r--r-- | kernel/irq/chip.c | 12 | ||||
-rw-r--r-- | kernel/irq/handle.c | 9 | ||||
-rw-r--r-- | kernel/irq/numa_migrate.c | 2 |
8 files changed, 9 insertions, 93 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index df9e885eee14..e1b2543f8ed3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -274,16 +274,6 @@ config SPARSE_IRQ | |||
274 | 274 | ||
275 | If you don't know what to do here, say N. | 275 | If you don't know what to do here, say N. |
276 | 276 | ||
277 | config NUMA_MIGRATE_IRQ_DESC | ||
278 | bool "Move irq desc when changing irq smp_affinity" | ||
279 | depends on SPARSE_IRQ && NUMA | ||
280 | depends on BROKEN | ||
281 | default n | ||
282 | ---help--- | ||
283 | This enables moving irq_desc to cpu/node that irq will use handled. | ||
284 | |||
285 | If you don't know what to do here, say N. | ||
286 | |||
287 | config X86_MPPARSE | 277 | config X86_MPPARSE |
288 | bool "Enable MPS table" if ACPI | 278 | bool "Enable MPS table" if ACPI |
289 | default y | 279 | default y |
diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig index 9fe5d212ab4c..27b8ce0f5908 100644 --- a/arch/x86/configs/x86_64_defconfig +++ b/arch/x86/configs/x86_64_defconfig | |||
@@ -195,7 +195,6 @@ CONFIG_HIGH_RES_TIMERS=y | |||
195 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 195 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
196 | CONFIG_SMP=y | 196 | CONFIG_SMP=y |
197 | CONFIG_SPARSE_IRQ=y | 197 | CONFIG_SPARSE_IRQ=y |
198 | # CONFIG_NUMA_MIGRATE_IRQ_DESC is not set | ||
199 | CONFIG_X86_FIND_SMP_CONFIG=y | 198 | CONFIG_X86_FIND_SMP_CONFIG=y |
200 | CONFIG_X86_MPPARSE=y | 199 | CONFIG_X86_MPPARSE=y |
201 | # CONFIG_X86_ELAN is not set | 200 | # CONFIG_X86_ELAN is not set |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 30da617d18e4..9fbf0f7ec7eb 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -148,9 +148,6 @@ struct irq_cfg { | |||
148 | unsigned move_cleanup_count; | 148 | unsigned move_cleanup_count; |
149 | u8 vector; | 149 | u8 vector; |
150 | u8 move_in_progress : 1; | 150 | u8 move_in_progress : 1; |
151 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
152 | u8 move_desc_pending : 1; | ||
153 | #endif | ||
154 | }; | 151 | }; |
155 | 152 | ||
156 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ | 153 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ |
@@ -254,8 +251,7 @@ int arch_init_chip_data(struct irq_desc *desc, int cpu) | |||
254 | return 0; | 251 | return 0; |
255 | } | 252 | } |
256 | 253 | ||
257 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | 254 | /* for move_irq_desc */ |
258 | |||
259 | static void | 255 | static void |
260 | init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int cpu) | 256 | init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg, int cpu) |
261 | { | 257 | { |
@@ -356,19 +352,7 @@ void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc) | |||
356 | old_desc->chip_data = NULL; | 352 | old_desc->chip_data = NULL; |
357 | } | 353 | } |
358 | } | 354 | } |
359 | 355 | /* end for move_irq_desc */ | |
360 | static void | ||
361 | set_extra_move_desc(struct irq_desc *desc, const struct cpumask *mask) | ||
362 | { | ||
363 | struct irq_cfg *cfg = desc->chip_data; | ||
364 | |||
365 | if (!cfg->move_in_progress) { | ||
366 | /* it means that domain is not changed */ | ||
367 | if (!cpumask_intersects(desc->affinity, mask)) | ||
368 | cfg->move_desc_pending = 1; | ||
369 | } | ||
370 | } | ||
371 | #endif | ||
372 | 356 | ||
373 | #else | 357 | #else |
374 | static struct irq_cfg *irq_cfg(unsigned int irq) | 358 | static struct irq_cfg *irq_cfg(unsigned int irq) |
@@ -378,13 +362,6 @@ static struct irq_cfg *irq_cfg(unsigned int irq) | |||
378 | 362 | ||
379 | #endif | 363 | #endif |
380 | 364 | ||
381 | #ifndef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
382 | static inline void | ||
383 | set_extra_move_desc(struct irq_desc *desc, const struct cpumask *mask) | ||
384 | { | ||
385 | } | ||
386 | #endif | ||
387 | |||
388 | struct io_apic { | 365 | struct io_apic { |
389 | unsigned int index; | 366 | unsigned int index; |
390 | unsigned int unused[3]; | 367 | unsigned int unused[3]; |
@@ -592,9 +569,6 @@ set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) | |||
592 | if (assign_irq_vector(irq, cfg, mask)) | 569 | if (assign_irq_vector(irq, cfg, mask)) |
593 | return BAD_APICID; | 570 | return BAD_APICID; |
594 | 571 | ||
595 | /* check that before desc->addinity get updated */ | ||
596 | set_extra_move_desc(desc, mask); | ||
597 | |||
598 | cpumask_copy(desc->affinity, mask); | 572 | cpumask_copy(desc->affinity, mask); |
599 | 573 | ||
600 | return apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain); | 574 | return apic->cpu_mask_to_apicid_and(desc->affinity, cfg->domain); |
@@ -2393,8 +2367,6 @@ migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
2393 | if (assign_irq_vector(irq, cfg, mask)) | 2367 | if (assign_irq_vector(irq, cfg, mask)) |
2394 | return; | 2368 | return; |
2395 | 2369 | ||
2396 | set_extra_move_desc(desc, mask); | ||
2397 | |||
2398 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask); | 2370 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask); |
2399 | 2371 | ||
2400 | irte.vector = cfg->vector; | 2372 | irte.vector = cfg->vector; |
@@ -2491,34 +2463,14 @@ static void irq_complete_move(struct irq_desc **descp) | |||
2491 | struct irq_cfg *cfg = desc->chip_data; | 2463 | struct irq_cfg *cfg = desc->chip_data; |
2492 | unsigned vector, me; | 2464 | unsigned vector, me; |
2493 | 2465 | ||
2494 | if (likely(!cfg->move_in_progress)) { | 2466 | if (likely(!cfg->move_in_progress)) |
2495 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
2496 | if (likely(!cfg->move_desc_pending)) | ||
2497 | return; | ||
2498 | |||
2499 | /* domain has not changed, but affinity did */ | ||
2500 | me = smp_processor_id(); | ||
2501 | if (cpumask_test_cpu(me, desc->affinity)) { | ||
2502 | *descp = desc = move_irq_desc(desc, me); | ||
2503 | /* get the new one */ | ||
2504 | cfg = desc->chip_data; | ||
2505 | cfg->move_desc_pending = 0; | ||
2506 | } | ||
2507 | #endif | ||
2508 | return; | 2467 | return; |
2509 | } | ||
2510 | 2468 | ||
2511 | vector = ~get_irq_regs()->orig_ax; | 2469 | vector = ~get_irq_regs()->orig_ax; |
2512 | me = smp_processor_id(); | 2470 | me = smp_processor_id(); |
2513 | 2471 | ||
2514 | if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) { | 2472 | if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) |
2515 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
2516 | *descp = desc = move_irq_desc(desc, me); | ||
2517 | /* get the new one */ | ||
2518 | cfg = desc->chip_data; | ||
2519 | #endif | ||
2520 | send_cleanup_vector(cfg); | 2473 | send_cleanup_vector(cfg); |
2521 | } | ||
2522 | } | 2474 | } |
2523 | #else | 2475 | #else |
2524 | static inline void irq_complete_move(struct irq_desc **descp) {} | 2476 | static inline void irq_complete_move(struct irq_desc **descp) {} |
diff --git a/include/linux/irq.h b/include/linux/irq.h index c4953cf27e5e..2a34cd6281d7 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -212,16 +212,6 @@ extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu); | |||
212 | 212 | ||
213 | extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); | 213 | extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); |
214 | 214 | ||
215 | static inline struct irq_desc * | ||
216 | irq_remap_to_desc(unsigned int irq, struct irq_desc *desc) | ||
217 | { | ||
218 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC | ||
219 | return irq_to_desc(irq); | ||
220 | #else | ||
221 | return desc; | ||
222 | #endif | ||
223 | } | ||
224 | |||
225 | /* | 215 | /* |
226 | * Migration helpers for obsolete names, they will go away: | 216 | * Migration helpers for obsolete names, they will go away: |
227 | */ | 217 | */ |
diff --git a/kernel/irq/Makefile b/kernel/irq/Makefile index 3394f8f52964..2f065277f8ee 100644 --- a/kernel/irq/Makefile +++ b/kernel/irq/Makefile | |||
@@ -3,5 +3,5 @@ obj-y := handle.o manage.o spurious.o resend.o chip.o devres.o | |||
3 | obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o | 3 | obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o |
4 | obj-$(CONFIG_PROC_FS) += proc.o | 4 | obj-$(CONFIG_PROC_FS) += proc.o |
5 | obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o | 5 | obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o |
6 | obj-$(CONFIG_NUMA_MIGRATE_IRQ_DESC) += numa_migrate.o | 6 | obj-$(CONFIG_SPARSE_IRQ) += numa_migrate.o |
7 | obj-$(CONFIG_PM_SLEEP) += pm.o | 7 | obj-$(CONFIG_PM_SLEEP) += pm.o |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index c687ba4363f2..13c68e71b726 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -359,7 +359,6 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
359 | 359 | ||
360 | spin_lock(&desc->lock); | 360 | spin_lock(&desc->lock); |
361 | mask_ack_irq(desc, irq); | 361 | mask_ack_irq(desc, irq); |
362 | desc = irq_remap_to_desc(irq, desc); | ||
363 | 362 | ||
364 | if (unlikely(desc->status & IRQ_INPROGRESS)) | 363 | if (unlikely(desc->status & IRQ_INPROGRESS)) |
365 | goto out_unlock; | 364 | goto out_unlock; |
@@ -438,7 +437,6 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc) | |||
438 | desc->status &= ~IRQ_INPROGRESS; | 437 | desc->status &= ~IRQ_INPROGRESS; |
439 | out: | 438 | out: |
440 | desc->chip->eoi(irq); | 439 | desc->chip->eoi(irq); |
441 | desc = irq_remap_to_desc(irq, desc); | ||
442 | 440 | ||
443 | spin_unlock(&desc->lock); | 441 | spin_unlock(&desc->lock); |
444 | } | 442 | } |
@@ -475,7 +473,6 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
475 | !desc->action)) { | 473 | !desc->action)) { |
476 | desc->status |= (IRQ_PENDING | IRQ_MASKED); | 474 | desc->status |= (IRQ_PENDING | IRQ_MASKED); |
477 | mask_ack_irq(desc, irq); | 475 | mask_ack_irq(desc, irq); |
478 | desc = irq_remap_to_desc(irq, desc); | ||
479 | goto out_unlock; | 476 | goto out_unlock; |
480 | } | 477 | } |
481 | kstat_incr_irqs_this_cpu(irq, desc); | 478 | kstat_incr_irqs_this_cpu(irq, desc); |
@@ -483,7 +480,6 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
483 | /* Start handling the irq */ | 480 | /* Start handling the irq */ |
484 | if (desc->chip->ack) | 481 | if (desc->chip->ack) |
485 | desc->chip->ack(irq); | 482 | desc->chip->ack(irq); |
486 | desc = irq_remap_to_desc(irq, desc); | ||
487 | 483 | ||
488 | /* Mark the IRQ currently in progress.*/ | 484 | /* Mark the IRQ currently in progress.*/ |
489 | desc->status |= IRQ_INPROGRESS; | 485 | desc->status |= IRQ_INPROGRESS; |
@@ -544,10 +540,8 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc) | |||
544 | if (!noirqdebug) | 540 | if (!noirqdebug) |
545 | note_interrupt(irq, desc, action_ret); | 541 | note_interrupt(irq, desc, action_ret); |
546 | 542 | ||
547 | if (desc->chip->eoi) { | 543 | if (desc->chip->eoi) |
548 | desc->chip->eoi(irq); | 544 | desc->chip->eoi(irq); |
549 | desc = irq_remap_to_desc(irq, desc); | ||
550 | } | ||
551 | } | 545 | } |
552 | 546 | ||
553 | void | 547 | void |
@@ -582,10 +576,8 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | |||
582 | 576 | ||
583 | /* Uninstall? */ | 577 | /* Uninstall? */ |
584 | if (handle == handle_bad_irq) { | 578 | if (handle == handle_bad_irq) { |
585 | if (desc->chip != &no_irq_chip) { | 579 | if (desc->chip != &no_irq_chip) |
586 | mask_ack_irq(desc, irq); | 580 | mask_ack_irq(desc, irq); |
587 | desc = irq_remap_to_desc(irq, desc); | ||
588 | } | ||
589 | desc->status |= IRQ_DISABLED; | 581 | desc->status |= IRQ_DISABLED; |
590 | desc->depth = 1; | 582 | desc->depth = 1; |
591 | } | 583 | } |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 882c79800107..3e0cbc44bd73 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -458,11 +458,8 @@ unsigned int __do_IRQ(unsigned int irq) | |||
458 | /* | 458 | /* |
459 | * No locking required for CPU-local interrupts: | 459 | * No locking required for CPU-local interrupts: |
460 | */ | 460 | */ |
461 | if (desc->chip->ack) { | 461 | if (desc->chip->ack) |
462 | desc->chip->ack(irq); | 462 | desc->chip->ack(irq); |
463 | /* get new one */ | ||
464 | desc = irq_remap_to_desc(irq, desc); | ||
465 | } | ||
466 | if (likely(!(desc->status & IRQ_DISABLED))) { | 463 | if (likely(!(desc->status & IRQ_DISABLED))) { |
467 | action_ret = handle_IRQ_event(irq, desc->action); | 464 | action_ret = handle_IRQ_event(irq, desc->action); |
468 | if (!noirqdebug) | 465 | if (!noirqdebug) |
@@ -473,10 +470,8 @@ unsigned int __do_IRQ(unsigned int irq) | |||
473 | } | 470 | } |
474 | 471 | ||
475 | spin_lock(&desc->lock); | 472 | spin_lock(&desc->lock); |
476 | if (desc->chip->ack) { | 473 | if (desc->chip->ack) |
477 | desc->chip->ack(irq); | 474 | desc->chip->ack(irq); |
478 | desc = irq_remap_to_desc(irq, desc); | ||
479 | } | ||
480 | /* | 475 | /* |
481 | * REPLAY is when Linux resends an IRQ that was dropped earlier | 476 | * REPLAY is when Linux resends an IRQ that was dropped earlier |
482 | * WAITING is used by probe to mark irqs that are being tested | 477 | * WAITING is used by probe to mark irqs that are being tested |
diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index 5760d7251626..ce72bc3f4ced 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c | |||
@@ -97,9 +97,7 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | |||
97 | 97 | ||
98 | /* free the old one */ | 98 | /* free the old one */ |
99 | free_one_irq_desc(old_desc, desc); | 99 | free_one_irq_desc(old_desc, desc); |
100 | spin_unlock(&old_desc->lock); | ||
101 | kfree(old_desc); | 100 | kfree(old_desc); |
102 | spin_lock(&desc->lock); | ||
103 | 101 | ||
104 | return desc; | 102 | return desc; |
105 | 103 | ||