|
@@ -139,6 +139,25 @@ static inline void
|
|
|
irq_get_pending(struct cpumask *mask, struct irq_desc *desc) { }
|
|
|
#endif
|
|
|
|
|
|
+int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
|
|
+ bool force)
|
|
|
+{
|
|
|
+ struct irq_desc *desc = irq_data_to_desc(data);
|
|
|
+ struct irq_chip *chip = irq_data_get_irq_chip(data);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = chip->irq_set_affinity(data, mask, false);
|
|
|
+ switch (ret) {
|
|
|
+ case IRQ_SET_MASK_OK:
|
|
|
+ cpumask_copy(data->affinity, mask);
|
|
|
+ case IRQ_SET_MASK_OK_NOCOPY:
|
|
|
+ irq_set_thread_affinity(desc);
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask)
|
|
|
{
|
|
|
struct irq_chip *chip = irq_data_get_irq_chip(data);
|
|
@@ -149,14 +168,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask)
|
|
|
return -EINVAL;
|
|
|
|
|
|
if (irq_can_move_pcntxt(data)) {
|
|
|
- ret = chip->irq_set_affinity(data, mask, false);
|
|
|
- switch (ret) {
|
|
|
- case IRQ_SET_MASK_OK:
|
|
|
- cpumask_copy(data->affinity, mask);
|
|
|
- case IRQ_SET_MASK_OK_NOCOPY:
|
|
|
- irq_set_thread_affinity(desc);
|
|
|
- ret = 0;
|
|
|
- }
|
|
|
+ ret = irq_do_set_affinity(data, mask, false);
|
|
|
} else {
|
|
|
irqd_set_move_pending(data);
|
|
|
irq_copy_pending(desc, mask);
|
|
@@ -280,9 +292,8 @@ EXPORT_SYMBOL_GPL(irq_set_affinity_notifier);
|
|
|
static int
|
|
|
setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)
|
|
|
{
|
|
|
- struct irq_chip *chip = irq_desc_get_chip(desc);
|
|
|
struct cpumask *set = irq_default_affinity;
|
|
|
- int ret, node = desc->irq_data.node;
|
|
|
+ int node = desc->irq_data.node;
|
|
|
|
|
|
/* Excludes PER_CPU and NO_BALANCE interrupts */
|
|
|
if (!irq_can_set_affinity(irq))
|
|
@@ -308,13 +319,7 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)
|
|
|
if (cpumask_intersects(mask, nodemask))
|
|
|
cpumask_and(mask, mask, nodemask);
|
|
|
}
|
|
|
- ret = chip->irq_set_affinity(&desc->irq_data, mask, false);
|
|
|
- switch (ret) {
|
|
|
- case IRQ_SET_MASK_OK:
|
|
|
- cpumask_copy(desc->irq_data.affinity, mask);
|
|
|
- case IRQ_SET_MASK_OK_NOCOPY:
|
|
|
- irq_set_thread_affinity(desc);
|
|
|
- }
|
|
|
+ irq_do_set_affinity(&desc->irq_data, mask, false);
|
|
|
return 0;
|
|
|
}
|
|
|
#else
|