diff options
| author | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-13 21:20:26 +1030 | 
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-13 21:20:26 +1030 | 
| commit | 0de26520c7cabf36e1de090ea8092f011a6106ce (patch) | |
| tree | 3d02e509b6315fdfd9cdb8c9e0b9ed0a30cf9384 /kernel/irq/manage.c | |
| parent | 29c0177e6a4ac094302bed54a1d4bbb6b740a9ef (diff) | |
| download | olio-linux-3.10-0de26520c7cabf36e1de090ea8092f011a6106ce.tar.xz olio-linux-3.10-0de26520c7cabf36e1de090ea8092f011a6106ce.zip  | |
cpumask: make irq_set_affinity() take a const struct cpumask
Impact: change existing irq_chip API
Not much point with gentle transition here: the struct irq_chip's
setaffinity method signature needs to change.
Fortunately, not widely used code, but hits a few architectures.
Note: In irq_select_affinity() I save a temporary in by mangling
irq_desc[irq].affinity directly.  Ingo, does this break anything?
(Folded in fix from KOSAKI Motohiro)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Mike Travis <travis@sgi.com>
Reviewed-by: Grant Grundler <grundler@parisc-linux.org>
Acked-by: Ingo Molnar <mingo@redhat.com>
Cc: ralf@linux-mips.org
Cc: grundler@parisc-linux.org
Cc: jeremy@xensource.com
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 22 | 
1 files changed, 10 insertions, 12 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 801addda3c4..10ad2f87ed9 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -79,7 +79,7 @@ int irq_can_set_affinity(unsigned int irq)   *	@cpumask:	cpumask   *   */ -int irq_set_affinity(unsigned int irq, cpumask_t cpumask) +int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask)  {  	struct irq_desc *desc = irq_to_desc(irq);  	unsigned long flags; @@ -91,14 +91,14 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask)  #ifdef CONFIG_GENERIC_PENDING_IRQ  	if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { -		desc->affinity = cpumask; +		cpumask_copy(&desc->affinity, cpumask);  		desc->chip->set_affinity(irq, cpumask);  	} else {  		desc->status |= IRQ_MOVE_PENDING; -		desc->pending_mask = cpumask; +		cpumask_copy(&desc->pending_mask, cpumask);  	}  #else -	desc->affinity = cpumask; +	cpumask_copy(&desc->affinity, cpumask);  	desc->chip->set_affinity(irq, cpumask);  #endif  	desc->status |= IRQ_AFFINITY_SET; @@ -112,26 +112,24 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask)   */  int do_irq_select_affinity(unsigned int irq, struct irq_desc *desc)  { -	cpumask_t mask; -  	if (!irq_can_set_affinity(irq))  		return 0; -	cpus_and(mask, cpu_online_map, irq_default_affinity); -  	/*  	 * Preserve an userspace affinity setup, but make sure that  	 * one of the targets is online.  	 */  	if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) { -		if (cpus_intersects(desc->affinity, cpu_online_map)) -			mask = desc->affinity; +		if (cpumask_any_and(&desc->affinity, cpu_online_mask) +		    < nr_cpu_ids) +			goto set_affinity;  		else  			desc->status &= ~IRQ_AFFINITY_SET;  	} -	desc->affinity = mask; -	desc->chip->set_affinity(irq, mask); +	cpumask_and(&desc->affinity, cpu_online_mask, &irq_default_affinity); +set_affinity: +	desc->chip->set_affinity(irq, &desc->affinity);  	return 0;  }  |