Message ID | 20171109101439.390-1-clg@kaod.org |
---|---|
Headers | show |
Series | spapr: introduce an IRQ allocator at the machine level | expand |
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(-) >