genirq: fix the affinity setting in setup_irq
The affinity setting in setup irq is called before the NO_BALANCING flag is checked and might therefore override affinity settings from the calling code with the default setting. Move the NO_BALANCING flag check before the call to the affinity setting. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
f6d87f4bd2
commit
612e3684c1
|
@ -123,7 +123,7 @@ int do_irq_select_affinity(unsigned int irq, struct irq_desc *desc)
|
||||||
* Preserve an userspace affinity setup, but make sure that
|
* Preserve an userspace affinity setup, but make sure that
|
||||||
* one of the targets is online.
|
* one of the targets is online.
|
||||||
*/
|
*/
|
||||||
if (desc->status & IRQ_AFFINITY_SET) {
|
if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) {
|
||||||
if (cpus_intersects(desc->affinity, cpu_online_map))
|
if (cpus_intersects(desc->affinity, cpu_online_map))
|
||||||
mask = desc->affinity;
|
mask = desc->affinity;
|
||||||
else
|
else
|
||||||
|
@ -483,6 +483,10 @@ __setup_irq(unsigned int irq, struct irq_desc * desc, struct irqaction *new)
|
||||||
/* Undo nested disables: */
|
/* Undo nested disables: */
|
||||||
desc->depth = 1;
|
desc->depth = 1;
|
||||||
|
|
||||||
|
/* Exclude IRQ from balancing if requested */
|
||||||
|
if (new->flags & IRQF_NOBALANCING)
|
||||||
|
desc->status |= IRQ_NO_BALANCING;
|
||||||
|
|
||||||
/* Set default affinity mask once everything is setup */
|
/* Set default affinity mask once everything is setup */
|
||||||
do_irq_select_affinity(irq, desc);
|
do_irq_select_affinity(irq, desc);
|
||||||
|
|
||||||
|
@ -497,10 +501,6 @@ __setup_irq(unsigned int irq, struct irq_desc * desc, struct irqaction *new)
|
||||||
|
|
||||||
*p = new;
|
*p = new;
|
||||||
|
|
||||||
/* Exclude IRQ from balancing */
|
|
||||||
if (new->flags & IRQF_NOBALANCING)
|
|
||||||
desc->status |= IRQ_NO_BALANCING;
|
|
||||||
|
|
||||||
/* Reset broken irq detection when installing new handler */
|
/* Reset broken irq detection when installing new handler */
|
||||||
desc->irq_count = 0;
|
desc->irq_count = 0;
|
||||||
desc->irqs_unhandled = 0;
|
desc->irqs_unhandled = 0;
|
||||||
|
|
Loading…
Reference in a new issue