On 21/11/2019 01:56, David Gibson wrote: > Traditional PCI INTx for vfio devices can only perform well if using > an in-kernel irqchip. Therefore, vfio_intx_update() issues a warning > if an in kernel irqchip is not available. > > We usually do have an in-kernel irqchip available for pseries machines > on POWER hosts. However, because the platform allows feature > negotiation of what interrupt controller model to use, we don't > currently initialize it until machine reset. vfio_intx_update() is > called (first) from vfio_realize() before that, so it can issue a > spurious warning, even if we will have an in kernel irqchip by the > time we need it. > > To workaround this, make a call to spapr_irq_update_active_intc() from > spapr_irq_init() which is called at machine realize time, before the > vfio realize. This call will be pretty much obsoleted by the later > call at reset time, but it serves to suppress the spurious warning > from VFIO. > > Cc: Alex Williamson <alex.williamson@xxxxxxxxxx> > Cc: Alexey Kardashevskiy <aik@xxxxxxxxx> > > Signed-off-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> Reviewed-by: Cédric Le Goater <clg@xxxxxxxx> > --- > hw/ppc/spapr_irq.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c > index 1d27034962..d6bb7fd2d6 100644 > --- a/hw/ppc/spapr_irq.c > +++ b/hw/ppc/spapr_irq.c > @@ -373,6 +373,14 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp) > > spapr->qirqs = qemu_allocate_irqs(spapr_set_irq, spapr, > smc->nr_xirqs + SPAPR_XIRQ_BASE); > + > + /* > + * Mostly we don't actually need this until reset, except that not > + * having this set up can cause VFIO devices to issue a > + * false-positive warning during realize(), because they don't yet > + * have an in-kernel irq chip. > + */ > + spapr_irq_update_active_intc(spapr); > } > > int spapr_irq_claim(SpaprMachineState *spapr, int irq, bool lsi, Error **errp) > @@ -528,7 +536,8 @@ void spapr_irq_update_active_intc(SpaprMachineState *spapr) > * this. > */ > new_intc = SPAPR_INTC(spapr->xive); > - } else if (spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) { > + } else if (spapr->ov5_cas > + && spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) { > new_intc = SPAPR_INTC(spapr->xive); > } else { > new_intc = SPAPR_INTC(spapr->ics); >