diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/irq/manage.c | 40 | ||||
| -rw-r--r-- | kernel/irq/proc.c | 22 | 
2 files changed, 41 insertions, 21 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  /** diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index bb44bc995d6..2db91eb54ad 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c @@ -16,26 +16,6 @@ static struct proc_dir_entry *root_irq_dir;  #ifdef CONFIG_SMP -#ifdef CONFIG_GENERIC_PENDING_IRQ -void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) -{ -	set_balance_irq_affinity(irq, mask_val); - -	/* -	 * Save these away for later use. Re-progam when the -	 * interrupt is pending -	 */ -	set_pending_irq(irq, mask_val); -} -#else -void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) -{ -	set_balance_irq_affinity(irq, mask_val); -	irq_desc[irq].affinity = mask_val; -	irq_desc[irq].chip->set_affinity(irq, mask_val); -} -#endif -  static int irq_affinity_read_proc(char *page, char **start, off_t off,  				  int count, int *eof, void *data)  { @@ -73,7 +53,7 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer,  		   code to set default SMP affinity. */  		return select_smp_affinity(irq) ? -EINVAL : full_count; -	proc_set_irq_affinity(irq, new_value); +	irq_set_affinity(irq, new_value);  	return full_count;  }  |