Patch "x86/irq: Get rid of code duplication" 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: Get rid of code duplication
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-get-rid-of-code-duplication.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
ab25ac02148b600e645f77cfb8b8ea415ed75bb4Mon Sep 17 00:00:00 2001
From: Thomas Gleixner <[email protected]>
Date: Thu, 31 Dec 2015 16:30:49 +0000
Subject: x86/irq: Get rid of code duplication
From: Thomas Gleixner <[email protected]>
commit ab25ac02148b600e645f77cfb8b8ea415ed75bb4 upstream.
Reusing an existing vector and assigning a new vector has duplicated code. Consolidate it.
This is also a preparatory patch for finally plugging the cleanup race.
--- arch/x86/kernel/apic/vector.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-)
arch/x86/kernel/apic/vector.c +15 -18
@@ -116,7 +116,7 @@ static int __assign_irq_vector(int irq,*/ static int current_vector =FIRST_EXTERNAL_VECTOR +VECTOR_OFFSET_START ;static int current_offset =VECTOR_OFFSET_START %16 ; -int cpu; +int cpu, vector;if (d->move_in_progress)return -EBUSY ;
@@ -126,7 +126,7 @@ static int __assign_irq_vector(int irq,cpumask_clear (searched_cpumask); cpu =cpumask_first_and (mask, cpu_online_mask);while (cpu < nr_cpu_ids) { -int new_cpu, vector, offset; +int new_cpu, offset;/* Get the possible target cpus for @mask/@cpu from the apic */ apic->vector_allocation_domain (cpu, vector_cpumask, mask);
@@ -146,16 +146,12 @@ static int __assign_irq_vector(int irq,if (cpumask_equal (vector_cpumask, d->domain)) goto success;/* -* New cpumask using the vector is a proper subset of -* the current in use mask. So cleanup the vector -* allocation for the members that are not used anymore. +* Mark the cpus which are not longer in the mask for +* cleanup. */ -cpumask_andnot (d->old_domain, d->domain, - vector_cpumask); - d->move_in_progress = -cpumask_intersects (d->old_domain, cpu_online_mask); -cpumask_copy (d->domain, vector_cpumask); - goto success; +cpumask_andnot (d->old_domain, d->domain, vector_cpumask); + vector = d->cfg.vector; + goto update; } vector = current_vector;
@@ -181,16 +177,12 @@ next:/* Found one! */ current_vector = vector; current_offset = offset; -if (d->cfg.vector) { +/* Schedule the old vector for cleanup on all cpus */ +if (d->cfg.vector)cpumask_copy (d->old_domain, d->domain); - d->move_in_progress = -cpumask_intersects (d->old_domain, cpu_online_mask); - }for_each_cpu (new_cpu, vector_searchmask)per_cpu (vector_irq, new_cpu)[vector] =irq_to_desc (irq); - d->cfg.vector = vector; -cpumask_copy (d->domain, vector_cpumask); - goto success; + goto update; next_cpu:/*
@@ -207,6 +199,11 @@ next_cpu: }return -ENOSPC ; +update: +/* Cleanup required ? */ + d->move_in_progress =cpumask_intersects (d->old_domain, cpu_online_mask); + d->cfg.vector = vector; +cpumask_copy (d->domain, vector_cpumask); success:/* * Cache destination APIC IDs into cfg->dest_apicid. This cannot fail
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/x86-entry-compat-add-missing-clac-to-entry_int80_32.patch queue-4.4/tick-nohz-set-the-correct-expiry-when-switching-to-nohz-lowres-mode.patch queue-4.4/irqchip-mxs-add-missing-set_handle_irq.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/posix-clock-fix-return-code-on-the-poll-method-s-error-path.patch queue-4.4/x86-irq-reorganize-the-return-path-in-assign_irq_vector.patch queue-4.4/cputime-prevent-32bit-overflow-in-time_to_cputime.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/clockevents-tcb_clksrc-prevent-disabling-an-already-disabled-clock.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/irqchip-omap-intc-add-support-for-spurious-irq-handling.patch queue-4.4/x86-irq-clear-move_in_progress-before-sending-cleanup-ipi.patch queue-4.4/x86-mpx-fix-off-by-one-comparison-with-nr_registers.patch queue-4.4/irqchip-atmel-aic-fix-wrong-bit-operation-for-irq-priority.patch queue-4.4/revert-workqueue-make-sure-delayed-work-run-in-local-cpu.patch