diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/irq/internals.h | 3 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 39 | ||||
| -rw-r--r-- | kernel/irq/migration.c | 13 | 
3 files changed, 27 insertions, 28 deletions
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 8e5c56b3b7d..001fa5bab49 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h @@ -101,6 +101,9 @@ extern int irq_select_affinity_usr(unsigned int irq, struct cpumask *mask);  extern void irq_set_thread_affinity(struct irq_desc *desc); +extern int irq_do_set_affinity(struct irq_data *data, +			       const struct cpumask *dest, bool force); +  /* Inline functions for support of irq chips on slow busses */  static inline void chip_bus_lock(struct irq_desc *desc)  { 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 diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index c3c89751b32..ca3f4aaff70 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c @@ -42,17 +42,8 @@ void irq_move_masked_irq(struct irq_data *idata)  	 * For correct operation this depends on the caller  	 * masking the irqs.  	 */ -	if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) -		   < nr_cpu_ids)) { -		int ret = chip->irq_set_affinity(&desc->irq_data, -						 desc->pending_mask, false); -		switch (ret) { -		case IRQ_SET_MASK_OK: -			cpumask_copy(desc->irq_data.affinity, desc->pending_mask); -		case IRQ_SET_MASK_OK_NOCOPY: -			irq_set_thread_affinity(desc); -		} -	} +	if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids) +		irq_do_set_affinity(&desc->irq_data, desc->pending_mask, false);  	cpumask_clear(desc->pending_mask);  }  |