diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2015-12-31 11:30:52 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2016-01-15 07:44:01 -0500 |
| commit | 5da0c1217f05d2ccc9a8ed6e6e5c23a8a1d24dd6 (patch) | |
| tree | d3012c5679e55dc25357f68b048ee0f68a46d5b3 | |
| parent | c1684f5035b60e9f98566493e869496fb5de1d89 (diff) | |
x86/irq: Remove the cpumask allocation from send_cleanup_vector()
There is no need to allocate a new cpumask for sending the cleanup vector. The
old_domain mask is now protected by the vector_lock, so we can safely remove
the offline cpus from it and send the IPI with the resulting mask.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Borislav Petkov <bp@alien8.de>
Tested-by: Joe Lawrence <joe.lawrence@stratus.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>
Cc: Jeremiah Mahler <jmmahler@gmail.com>
Cc: andy.shevchenko@gmail.com
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: stable@vger.kernel.org #4.3+
Link: http://lkml.kernel.org/r/20151231160106.967993932@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
| -rw-r--r-- | arch/x86/kernel/apic/vector.c | 16 |
1 files changed, 3 insertions, 13 deletions
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index ed62f9c3f785..91dc2742cfb1 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c | |||
| @@ -530,21 +530,11 @@ static struct irq_chip lapic_controller = { | |||
| 530 | #ifdef CONFIG_SMP | 530 | #ifdef CONFIG_SMP |
| 531 | static void __send_cleanup_vector(struct apic_chip_data *data) | 531 | static void __send_cleanup_vector(struct apic_chip_data *data) |
| 532 | { | 532 | { |
| 533 | cpumask_var_t cleanup_mask; | ||
| 534 | |||
| 535 | raw_spin_lock(&vector_lock); | 533 | raw_spin_lock(&vector_lock); |
| 534 | cpumask_and(data->old_domain, data->old_domain, cpu_online_mask); | ||
| 536 | data->move_in_progress = 0; | 535 | data->move_in_progress = 0; |
| 537 | if (unlikely(!alloc_cpumask_var(&cleanup_mask, GFP_ATOMIC))) { | 536 | if (!cpumask_empty(data->old_domain)) |
| 538 | unsigned int i; | 537 | apic->send_IPI_mask(data->old_domain, IRQ_MOVE_CLEANUP_VECTOR); |
| 539 | |||
| 540 | for_each_cpu_and(i, data->old_domain, cpu_online_mask) | ||
| 541 | apic->send_IPI_mask(cpumask_of(i), | ||
| 542 | IRQ_MOVE_CLEANUP_VECTOR); | ||
| 543 | } else { | ||
| 544 | cpumask_and(cleanup_mask, data->old_domain, cpu_online_mask); | ||
| 545 | apic->send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR); | ||
| 546 | free_cpumask_var(cleanup_mask); | ||
| 547 | } | ||
| 548 | raw_spin_unlock(&vector_lock); | 538 | raw_spin_unlock(&vector_lock); |
| 549 | } | 539 | } |
| 550 | 540 | ||
