diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 17 | 
1 files changed, 11 insertions, 6 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 2734eca59243..aaf5c9d05770 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -80,7 +80,7 @@ int irq_can_set_affinity(unsigned int irq)  	return 1;  } -static void +void  irq_set_thread_affinity(struct irq_desc *desc, const struct cpumask *cpumask)  {  	struct irqaction *action = desc->action; @@ -109,17 +109,22 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask)  	spin_lock_irqsave(&desc->lock, flags);  #ifdef CONFIG_GENERIC_PENDING_IRQ -	if (desc->status & IRQ_MOVE_PCNTXT) -		desc->chip->set_affinity(irq, cpumask); +	if (desc->status & IRQ_MOVE_PCNTXT) { +		if (!desc->chip->set_affinity(irq, cpumask)) { +			cpumask_copy(desc->affinity, cpumask); +			irq_set_thread_affinity(desc, cpumask); +		} +	}  	else {  		desc->status |= IRQ_MOVE_PENDING;  		cpumask_copy(desc->pending_mask, cpumask);  	}  #else -	cpumask_copy(desc->affinity, cpumask); -	desc->chip->set_affinity(irq, cpumask); +	if (!desc->chip->set_affinity(irq, cpumask)) { +		cpumask_copy(desc->affinity, cpumask); +		irq_set_thread_affinity(desc, cpumask); +	}  #endif -	irq_set_thread_affinity(desc, cpumask);  	desc->status |= IRQ_AFFINITY_SET;  	spin_unlock_irqrestore(&desc->lock, flags);  	return 0;  |