diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 40 | 
1 files changed, 40 insertions, 0 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index cd790ad0ae5..5597c157442 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -38,6 +38,46 @@ void synchronize_irq(unsigned int irq)  }  EXPORT_SYMBOL(synchronize_irq); +/** + *	irq_can_set_affinity - Check if the affinity of a given irq can be set + *	@irq:		Interrupt to check + * + */ +int irq_can_set_affinity(unsigned int irq) +{ +	struct irq_desc *desc = irq_desc + irq; + +	if (CHECK_IRQ_PER_CPU(desc->status) || !desc->chip || +	    !desc->chip->set_affinity) +		return 0; + +	return 1; +} + +/** + *	irq_set_affinity - Set the irq affinity of a given irq + *	@irq:		Interrupt to set affinity + *	@cpumask:	cpumask + * + */ +int irq_set_affinity(unsigned int irq, cpumask_t cpumask) +{ +	struct irq_desc *desc = irq_desc + irq; + +	if (!desc->chip->set_affinity) +		return -EINVAL; + +	set_balance_irq_affinity(irq, cpumask); + +#ifdef CONFIG_GENERIC_PENDING_IRQ +	set_pending_irq(irq, cpumask); +#else +	desc->affinity = cpumask; +	desc->chip->set_affinity(irq, cpumask); +#endif +	return 0; +} +  #endif  /**  |