On 02/13/2018 10:18 AM, Michael Ellerman wrote:
> Cédric Le Goater <c...@kaod.org> 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 <c...@kaod.org>
>> ---
>>
>>  I think we should send this one to stable also.
> 
> Fixes: eac1e731b59e ("powerpc/xive: guest exploitation of the XIVE interrupt 
> controller")

yes.

> Cc: sta...@vger.kernel.org # 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

Reply via email to