diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 39 | 
1 files changed, 22 insertions, 17 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index bb32326afe8..a1b903380bc 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -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  |