|
@@ -80,7 +80,7 @@ int irq_can_set_affinity(unsigned int irq)
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
-static void
|
|
|
|
|
|
+void
|
|
irq_set_thread_affinity(struct irq_desc *desc, const struct cpumask *cpumask)
|
|
irq_set_thread_affinity(struct irq_desc *desc, const struct cpumask *cpumask)
|
|
{
|
|
{
|
|
struct irqaction *action = desc->action;
|
|
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);
|
|
spin_lock_irqsave(&desc->lock, flags);
|
|
|
|
|
|
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
|
#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 {
|
|
else {
|
|
desc->status |= IRQ_MOVE_PENDING;
|
|
desc->status |= IRQ_MOVE_PENDING;
|
|
cpumask_copy(desc->pending_mask, cpumask);
|
|
cpumask_copy(desc->pending_mask, cpumask);
|
|
}
|
|
}
|
|
#else
|
|
#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
|
|
#endif
|
|
- irq_set_thread_affinity(desc, cpumask);
|
|
|
|
desc->status |= IRQ_AFFINITY_SET;
|
|
desc->status |= IRQ_AFFINITY_SET;
|
|
spin_unlock_irqrestore(&desc->lock, flags);
|
|
spin_unlock_irqrestore(&desc->lock, flags);
|
|
return 0;
|
|
return 0;
|