powerpc/pseries: Fix xics interrupt affinity
PATCH 1/1 powerpc/pseries: Fix xics interrupt affinity
Commit 57b150cce8e004ddd36330490a68bfb59b7271e9 (irq: only update affinity if ->set_affinity() is sucessfull) broke xics irq affinity.
We need to use the cpumask passed in, instead of accessing ->affinity directly.
Signed-off-by Anton Blanchard <[email protected]>
---
This code needs a rework and a conversion to the new cpumask API, but I will leave that for subsequent patches.
arch/powerpc/platforms/pseries/xics.c +6 -6
@@ -163,14 +163,13 @@ static inline void lpar_qirr_info(int n_/* Interface to generic irq subsystem */ #ifdef CONFIG_SMP -static int get_irq_server (unsigned int virq,unsigned int strict_check) +static int get_irq_server (unsigned int virq,cpumask_t cpumask, +unsigned int strict_check) {int server;/* For the moment only implement delivery to all cpus or one cpu */ -cpumask_t cpumask;cpumask_t tmp =CPU_MASK_NONE ; -cpumask_copy (&cpumask,irq_to_desc (virq)->affinity);if (!distribute_irqs)return default_server;
@@ -192,7 +191,8 @@ static int get_irq_server(unsigned int v return default_server; }#else -static int get_irq_server (unsigned int virq,unsigned int strict_check) +static int get_irq_server (unsigned int virq,cpumask_t cpumask, +unsigned int strict_check) {return default_server; }
@@ -211,7 +211,7 @@ static void xics_unmask_irq(unsigned intif (irq ==XICS_IPI || irq ==XICS_IRQ_SPURIOUS )return ; - server =get_irq_server (virq,0 ); + server =get_irq_server (virq, *(irq_to_desc (virq)->affinity),0 ); call_status =rtas_call (ibm_set_xive,3 ,1 ,NULL , irq, server,DEFAULT_PRIORITY );
@@ -405,7 +405,7 @@ static int xics_set_affinity(unsigned in* For the moment only implement delivery to all cpus or one cpu. * Get current irq_server for the given irq */ - irq_server =get_irq_server (virq,1 ); + irq_server =get_irq_server (virq, *cpumask,1 );if (irq_server ==-1 ) {char cpulist[128 ];cpumask_scnprintf (cpulist,sizeof (cpulist), cpumask);