On 02/13/2018 10:18 AM, Michael Ellerman wrote: > Cédric Le Goater <clg@xxxxxxxx> writes: > >> The CPU event notification queues on sPAPR should be configured using >> a hardware CPU identifier. >> >> The problem did not show up on the Power Hypervisor because pHyp >> supports 8 threads per core which keeps CPU number contiguous. This is >> not the case on all sPAPR virtual machines, some use SMT=1. >> >> Also improve error logging by adding the CPU number. >> >> Signed-off-by: Cédric Le Goater <clg@xxxxxxxx> >> --- >> >> I think we should send this one to stable also. > > Fixes: eac1e731b59e ("powerpc/xive: guest exploitation of the XIVE interrupt controller") yes. > Cc: stable@xxxxxxxxxxxxxxx # v4.14+ yes. I just added the Cc:. I am not sure that will work with patchwork though. Thanks, C. > ? > > cheers > >> diff --git a/arch/powerpc/sysdev/xive/spapr.c b/arch/powerpc/sysdev/xive/spapr.c >> index d9c4c9366049..091f1d0d0af1 100644 >> --- a/arch/powerpc/sysdev/xive/spapr.c >> +++ b/arch/powerpc/sysdev/xive/spapr.c >> @@ -356,7 +356,8 @@ static int xive_spapr_configure_queue(u32 target, struct xive_q *q, u8 prio, >> >> rc = plpar_int_get_queue_info(0, target, prio, &esn_page, &esn_size); >> if (rc) { >> - pr_err("Error %lld getting queue info prio %d\n", rc, prio); >> + pr_err("Error %lld getting queue info CPU %d prio %d\n", rc, >> + target, prio); >> rc = -EIO; >> goto fail; >> } >> @@ -370,7 +371,8 @@ static int xive_spapr_configure_queue(u32 target, struct xive_q *q, u8 prio, >> /* Configure and enable the queue in HW */ >> rc = plpar_int_set_queue_config(flags, target, prio, qpage_phys, order); >> if (rc) { >> - pr_err("Error %lld setting queue for prio %d\n", rc, prio); >> + pr_err("Error %lld setting queue for CPU %d prio %d\n", rc, >> + target, prio); >> rc = -EIO; >> } else { >> q->qpage = qpage; >> @@ -389,8 +391,8 @@ static int xive_spapr_setup_queue(unsigned int cpu, struct xive_cpu *xc, >> if (IS_ERR(qpage)) >> return PTR_ERR(qpage); >> >> - return xive_spapr_configure_queue(cpu, q, prio, qpage, >> - xive_queue_shift); >> + return xive_spapr_configure_queue(get_hard_smp_processor_id(cpu), >> + q, prio, qpage, xive_queue_shift); >> } >> >> static void xive_spapr_cleanup_queue(unsigned int cpu, struct xive_cpu *xc, >> @@ -399,10 +401,12 @@ static void xive_spapr_cleanup_queue(unsigned int cpu, struct xive_cpu *xc, >> struct xive_q *q = &xc->queue[prio]; >> unsigned int alloc_order; >> long rc; >> + int hw_cpu = get_hard_smp_processor_id(cpu); >> >> - rc = plpar_int_set_queue_config(0, cpu, prio, 0, 0); >> + rc = plpar_int_set_queue_config(0, hw_cpu, prio, 0, 0); >> if (rc) >> - pr_err("Error %ld setting queue for prio %d\n", rc, prio); >> + pr_err("Error %ld setting queue for CPU %d prio %d\n", rc, >> + hw_cpu, prio); >> >> alloc_order = xive_alloc_order(xive_queue_shift); >> free_pages((unsigned long)q->qpage, alloc_order); >> -- >> 2.13.6