Patch "x86/irq: Do not use apic_chip_data.old_domain as temporary buffer" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86/irq: Do not use apic_chip_data.old_domain as temporary buffer
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-irq-do-not-use-apic_chip_data.old_domain-as-temporary-buffer.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
8a580f70f6936ec095da217018cdeeb5835c0207Mon Sep 17 00:00:00 2001
From: Jiang Liu <[email protected]>
Date: Thu, 31 Dec 2015 16:30:46 +0000
Subject: x86/irq: Do not use apic_chip_data.old_domain as temporary buffer
From: Jiang Liu <[email protected]>
commit 8a580f70f6936ec095da217018cdeeb5835c0207 upstream.
Function __assign_irq_vector() makes use of apic_chip_data.old_domain as a temporary buffer, which is in the way of using apic_chip_data.old_domain for synchronizing the vector cleanup with the vector assignement code.
Use a proper temporary cpumask for this.
[ tglx: Renamed the mask to searched_cpumask for clarity ]
--- arch/x86/kernel/apic/vector.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/x86/kernel/apic/vector.c +5 -3
@@ -30,7 +30,7 @@ struct apic_chip_data {struct irq_domain *x86_vector_domain;static DEFINE_RAW_SPINLOCK (vector_lock); -static cpumask_var_t vector_cpumask; +static cpumask_var_t vector_cpumask, searched_cpumask;static struct irq_chip lapic_controller;#ifdef CONFIG_X86_IO_APIC static struct apic_chip_data *legacy_irq_data[NR_IRQS_LEGACY ];
@@ -124,6 +124,7 @@ static int __assign_irq_vector(int irq,/* Only try and allocate irqs on cpus that are present */ err = -ENOSPC ;cpumask_clear (d->old_domain); +cpumask_clear (searched_cpumask); cpu =cpumask_first_and (mask, cpu_online_mask);while (cpu < nr_cpu_ids) {int new_cpu, vector, offset;
@@ -157,9 +158,9 @@ next: }if (unlikely (current_vector == vector)) { -cpumask_or (d->old_domain, d->old_domain, +cpumask_or (searched_cpumask, searched_cpumask, vector_cpumask); -cpumask_andnot (vector_cpumask, mask, d->old_domain); +cpumask_andnot (vector_cpumask, mask, searched_cpumask); cpu =cpumask_first_and (vector_cpumask, cpu_online_mask);continue ;
@@ -404,6 +405,7 @@ int __init arch_early_irq_init(void)arch_init_htirq_domain (x86_vector_domain);BUG_ON (!alloc_cpumask_var (&vector_cpumask,GFP_KERNEL )); +BUG_ON (!alloc_cpumask_var (&searched_cpumask,GFP_KERNEL ));return arch_early_ioapic_init (); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/x86-irq-validate-that-irq-descriptor-is-still-active.patch queue-4.4/x86-irq-remove-outgoing-cpu-from-vector-cleanup-mask.patch queue-4.4/x86-irq-get-rid-of-code-duplication.patch queue-4.4/genirq-validate-action-before-dereferencing-it-in-handle_irq_event_percpu.patch queue-4.4/x86-irq-remove-offline-cpus-from-vector-cleanup.patch queue-4.4/x86-irq-reorganize-the-return-path-in-assign_irq_vector.patch queue-4.4/x86-irq-copy-vectormask-instead-of-an-and-operation.patch queue-4.4/x86-irq-call-irq_force_move_complete-with-irq-descriptor.patch queue-4.4/x86-irq-call-chip-irq_set_affinity-in-proper-context.patch queue-4.4/x86-irq-plug-vector-cleanup-race.patch queue-4.4/x86-irq-do-not-use-apic_chip_data.old_domain-as-temporary-buffer.patch queue-4.4/x86-irq-reorganize-the-search-in-assign_irq_vector.patch queue-4.4/x86-irq-remove-the-cpumask-allocation-from-send_cleanup_vector.patch queue-4.4/x86-irq-fix-a-race-in-x86_vector_free_irqs.patch queue-4.4/x86-irq-check-vector-allocation-early.patch queue-4.4/x86-irq-clear-move_in_progress-before-sending-cleanup-ipi.patch