diff options
Diffstat (limited to 'arch/sparc/kernel/irq_64.c')
| -rw-r--r-- | arch/sparc/kernel/irq_64.c | 41 | 
1 files changed, 13 insertions, 28 deletions
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 5deabe921a4..bd075054942 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -45,6 +45,7 @@  #include <asm/cacheflush.h>  #include "entry.h" +#include "cpumap.h"  #define NUM_IVECS	(IMAP_INR + 1) @@ -256,35 +257,13 @@ static int irq_choose_cpu(unsigned int virt_irq)  	int cpuid;  	cpumask_copy(&mask, irq_desc[virt_irq].affinity); -	if (cpus_equal(mask, CPU_MASK_ALL)) { -		static int irq_rover; -		static DEFINE_SPINLOCK(irq_rover_lock); -		unsigned long flags; - -		/* Round-robin distribution... */ -	do_round_robin: -		spin_lock_irqsave(&irq_rover_lock, flags); - -		while (!cpu_online(irq_rover)) { -			if (++irq_rover >= nr_cpu_ids) -				irq_rover = 0; -		} -		cpuid = irq_rover; -		do { -			if (++irq_rover >= nr_cpu_ids) -				irq_rover = 0; -		} while (!cpu_online(irq_rover)); - -		spin_unlock_irqrestore(&irq_rover_lock, flags); +	if (cpus_equal(mask, cpu_online_map)) { +		cpuid = map_to_cpu(virt_irq);  	} else {  		cpumask_t tmp;  		cpus_and(tmp, cpu_online_map, mask); - -		if (cpus_empty(tmp)) -			goto do_round_robin; - -		cpuid = first_cpu(tmp); +		cpuid = cpus_empty(tmp) ? map_to_cpu(virt_irq) : first_cpu(tmp);  	}  	return cpuid; @@ -318,10 +297,12 @@ static void sun4u_irq_enable(unsigned int virt_irq)  	}  } -static void sun4u_set_affinity(unsigned int virt_irq, +static int sun4u_set_affinity(unsigned int virt_irq,  			       const struct cpumask *mask)  {  	sun4u_irq_enable(virt_irq); + +	return 0;  }  /* Don't do anything.  The desc->status check for IRQ_DISABLED in @@ -377,7 +358,7 @@ static void sun4v_irq_enable(unsigned int virt_irq)  		       ino, err);  } -static void sun4v_set_affinity(unsigned int virt_irq, +static int sun4v_set_affinity(unsigned int virt_irq,  			       const struct cpumask *mask)  {  	unsigned int ino = virt_irq_table[virt_irq].dev_ino; @@ -388,6 +369,8 @@ static void sun4v_set_affinity(unsigned int virt_irq,  	if (err != HV_EOK)  		printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): "  		       "err(%d)\n", ino, cpuid, err); + +	return 0;  }  static void sun4v_irq_disable(unsigned int virt_irq) @@ -445,7 +428,7 @@ static void sun4v_virq_enable(unsigned int virt_irq)  		       dev_handle, dev_ino, err);  } -static void sun4v_virt_set_affinity(unsigned int virt_irq, +static int sun4v_virt_set_affinity(unsigned int virt_irq,  				    const struct cpumask *mask)  {  	unsigned long cpuid, dev_handle, dev_ino; @@ -461,6 +444,8 @@ static void sun4v_virt_set_affinity(unsigned int virt_irq,  		printk(KERN_ERR "sun4v_vintr_set_target(%lx,%lx,%lu): "  		       "err(%d)\n",  		       dev_handle, dev_ino, cpuid, err); + +	return 0;  }  static void sun4v_virq_disable(unsigned int virt_irq)  |