[Qemu-devel] [PATCH for-2.12 v2 00/12] spapr: introduce an IRQ allocator at the machine level

Cédric Le Goater posted 12 patches 6 years, 5 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20171109101439.390-1-clg@kaod.org
Test checkpatch passed
Test docker passed
Test ppc passed
Test s390x passed
There is a newer version of this series
hw/intc/trace-events   |   2 -
hw/intc/xics.c         |  37 ++++++-----
hw/intc/xics_kvm.c     |   4 +-
hw/intc/xics_spapr.c   |  76 ++++-----------------
hw/ppc/pnv.c           |  34 ++++++++++
hw/ppc/pnv_psi.c       |   4 --
hw/ppc/spapr.c         | 174 ++++++++++++++++++++++++++++++++++++++++++++++++-
hw/ppc/spapr_events.c  |   4 +-
hw/ppc/spapr_pci.c     |   8 +--
hw/ppc/spapr_vio.c     |   2 +-
hw/ppc/trace-events    |   2 +
include/hw/ppc/spapr.h |   6 ++
include/hw/ppc/xics.h  |  20 ++++--
13 files changed, 267 insertions(+), 106 deletions(-)
[Qemu-devel] [PATCH for-2.12 v2 00/12] spapr: introduce an IRQ allocator at the machine level
Posted by Cédric Le Goater 6 years, 5 months ago
Hello,

Currently, the ICSState 'ics' object of the sPAPR machine acts as the
global interrupt source handler and also as the IRQ number allocator
for the machine. Some IRQ numbers are allocated very early in the
machine initialization sequence to populate the device tree, and this
is a problem to introduce the new POWER XIVE interrupt model, as it
needs to share the IRQ numbers with the older model.

To prepare ground for XIVE, here is a proposal adding a set of new
XICSFabric operations to let the machine handle directly the IRQ
number allocation and to decorrelate the allocation from the interrupt
source object :

    bool (*irq_test)(XICSFabric *xi, int irq);
    int (*irq_alloc_block)(XICSFabric *xi, int count, int align);
    void (*irq_free_block)(XICSFabric *xi, int irq, int num);
    bool (*irq_is_lsi)(XICSFabric *xi, int irq);

In these prototypes, the 'irq' parameter refers to a number in the
global IRQ number space.

On the sPAPR platform, these operations are simply backed by a bitmap
and to handle migration compatibility, we introduce a machine class
flag 'has_irq_bitmap', which is set to false for older machines.


To completely remove the use of the ICSState object (required to
introduce XIVE), we also need to change how the nature of an
interrupt, MSI or LSI, is stored. Today, this is done using the flag
attribute of the ICSIRQState array. We change that by splitting the
IRQ number space of the machine in two: first the LSIs and then the
MSIs. This has the benefit to keep the LSI IRQ numbers in a well known
range which is useful for PHB hotplug.

The git repo for this pachset can be found here along with the latest
XIVE model:

    https://github.com/legoater/qemu/commits/xive

Thanks,

C.

Tests :

 - make check on each patch
 - migration :
     qemu-2.12 (pseries-2.12) <->  qemu-2.12 (pseries-2.12)
     qemu-2.12 (pseries-2.10) <->  qemu-2.12 (pseries-2.10)
     qemu-2.10 (pseries-2.10) <->  qemu-2.12 (pseries-2.10)

Changes since v1 :

 - reorganised patchset to introduce the XICSFabric operations before
   the major changes: bitmap and IRQ number space split   
 - introduced a reference bitmap to save some state in migration

Cédric Le Goater (12):
  spapr: add pseries 2.12 machine type
  ppc/xics: remove useless if condition
  spapr: introduce new XICSFabric operations for an IRQ allocator
  spapr: move current IRQ allocation under the machine
  spapr: introduce an IRQ allocator using a bitmap
  spapr: store a reference IRQ bitmap
  spapr: introduce an 'irq_base' number
  spapr: remove the use of ics_valid_irq()
  spapr: introduce a XICSFabric is_lsi() operation
  spapr: split the IRQ number space for LSI interrupts
  sparp: merge ics_set_irq_type() in irq_alloc_block() operation
  spapr: use sPAPRMachineState in spapr_ics_ prototypes

 hw/intc/trace-events   |   2 -
 hw/intc/xics.c         |  37 ++++++-----
 hw/intc/xics_kvm.c     |   4 +-
 hw/intc/xics_spapr.c   |  76 ++++-----------------
 hw/ppc/pnv.c           |  34 ++++++++++
 hw/ppc/pnv_psi.c       |   4 --
 hw/ppc/spapr.c         | 174 ++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/ppc/spapr_events.c  |   4 +-
 hw/ppc/spapr_pci.c     |   8 +--
 hw/ppc/spapr_vio.c     |   2 +-
 hw/ppc/trace-events    |   2 +
 include/hw/ppc/spapr.h |   6 ++
 include/hw/ppc/xics.h  |  20 ++++--
 13 files changed, 267 insertions(+), 106 deletions(-)

-- 
2.13.6


Re: [Qemu-devel] [Qemu-ppc] [PATCH for-2.12 v2 00/12] spapr: introduce an IRQ allocator at the machine level
Posted by Cédric Le Goater 6 years, 5 months ago
David,

On 11/09/2017 10:14 AM, Cédric Le Goater wrote:
> Hello,
> 
> Currently, the ICSState 'ics' object of the sPAPR machine acts as the
> global interrupt source handler and also as the IRQ number allocator
> for the machine. Some IRQ numbers are allocated very early in the
> machine initialization sequence to populate the device tree, and this
> is a problem to introduce the new POWER XIVE interrupt model, as it
> needs to share the IRQ numbers with the older model.
> 
> To prepare ground for XIVE, here is a proposal adding a set of new
> XICSFabric operations to let the machine handle directly the IRQ
> number allocation and to decorrelate the allocation from the interrupt
> source object :
> 
>     bool (*irq_test)(XICSFabric *xi, int irq);
>     int (*irq_alloc_block)(XICSFabric *xi, int count, int align);
>     void (*irq_free_block)(XICSFabric *xi, int irq, int num);
>     bool (*irq_is_lsi)(XICSFabric *xi, int irq);
> 
> In these prototypes, the 'irq' parameter refers to a number in the
> global IRQ number space.
> 
> On the sPAPR platform, these operations are simply backed by a bitmap
> and to handle migration compatibility, we introduce a machine class
> flag 'has_irq_bitmap', which is set to false for older machines.

Talking with Greg, I have found a better solution to handle migration 
compatibility which is to do like the phb_placement. That is to use 
two sets of XICS IRQ operations : one for the latest pseries machine 
using the bitmap and another one for the older pseries machine using 
the ICSIRQState. It impacts mostly patch 5.

This solution is cleaner and I will send a v3 in my morning unless
you start reviewing and have some obvious comments in the v2 series.


Thanks,

C. 


> To completely remove the use of the ICSState object (required to
> introduce XIVE), we also need to change how the nature of an
> interrupt, MSI or LSI, is stored. Today, this is done using the flag
> attribute of the ICSIRQState array. We change that by splitting the
> IRQ number space of the machine in two: first the LSIs and then the
> MSIs. This has the benefit to keep the LSI IRQ numbers in a well known
> range which is useful for PHB hotplug.
> 
> The git repo for this pachset can be found here along with the latest
> XIVE model:
> 
>     https://github.com/legoater/qemu/commits/xive
> 
> Thanks,
> 
> C.
> 
> Tests :
> 
>  - make check on each patch
>  - migration :
>      qemu-2.12 (pseries-2.12) <->  qemu-2.12 (pseries-2.12)
>      qemu-2.12 (pseries-2.10) <->  qemu-2.12 (pseries-2.10)
>      qemu-2.10 (pseries-2.10) <->  qemu-2.12 (pseries-2.10)
> 
> Changes since v1 :
> 
>  - reorganised patchset to introduce the XICSFabric operations before
>    the major changes: bitmap and IRQ number space split   
>  - introduced a reference bitmap to save some state in migration
> 
> Cédric Le Goater (12):
>   spapr: add pseries 2.12 machine type
>   ppc/xics: remove useless if condition
>   spapr: introduce new XICSFabric operations for an IRQ allocator
>   spapr: move current IRQ allocation under the machine
>   spapr: introduce an IRQ allocator using a bitmap
>   spapr: store a reference IRQ bitmap
>   spapr: introduce an 'irq_base' number
>   spapr: remove the use of ics_valid_irq()
>   spapr: introduce a XICSFabric is_lsi() operation
>   spapr: split the IRQ number space for LSI interrupts
>   sparp: merge ics_set_irq_type() in irq_alloc_block() operation
>   spapr: use sPAPRMachineState in spapr_ics_ prototypes
> 
>  hw/intc/trace-events   |   2 -
>  hw/intc/xics.c         |  37 ++++++-----
>  hw/intc/xics_kvm.c     |   4 +-
>  hw/intc/xics_spapr.c   |  76 ++++-----------------
>  hw/ppc/pnv.c           |  34 ++++++++++
>  hw/ppc/pnv_psi.c       |   4 --
>  hw/ppc/spapr.c         | 174 ++++++++++++++++++++++++++++++++++++++++++++++++-
>  hw/ppc/spapr_events.c  |   4 +-
>  hw/ppc/spapr_pci.c     |   8 +--
>  hw/ppc/spapr_vio.c     |   2 +-
>  hw/ppc/trace-events    |   2 +
>  include/hw/ppc/spapr.h |   6 ++
>  include/hw/ppc/xics.h  |  20 ++++--
>  13 files changed, 267 insertions(+), 106 deletions(-)
>