diff options
Diffstat (limited to 'arch/powerpc/platforms/cell/spu_priv1_mmio.c')
| -rw-r--r-- | arch/powerpc/platforms/cell/spu_priv1_mmio.c | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/cell/spu_priv1_mmio.c b/arch/powerpc/platforms/cell/spu_priv1_mmio.c index 67fa7247b80..906a0a2a9fe 100644 --- a/arch/powerpc/platforms/cell/spu_priv1_mmio.c +++ b/arch/powerpc/platforms/cell/spu_priv1_mmio.c @@ -28,6 +28,7 @@  #include <linux/io.h>  #include <linux/mutex.h>  #include <linux/device.h> +#include <linux/sched.h>  #include <asm/spu.h>  #include <asm/spu_priv1.h> @@ -75,8 +76,19 @@ static u64 int_stat_get(struct spu *spu, int class)  static void cpu_affinity_set(struct spu *spu, int cpu)  { -	u64 target = iic_get_target_id(cpu); -	u64 route = target << 48 | target << 32 | target << 16; +	u64 target; +	u64 route; + +	if (nr_cpus_node(spu->node)) { +		cpumask_t spumask = node_to_cpumask(spu->node); +		cpumask_t cpumask = node_to_cpumask(cpu_to_node(cpu)); + +		if (!cpus_intersects(spumask, cpumask)) +			return; +	} + +	target = iic_get_target_id(cpu); +	route = target << 48 | target << 32 | target << 16;  	out_be64(&spu->priv1->int_route_RW, route);  }  |