[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 37/44] ppc/xics: fix irq priority in ics_set_irq_type()
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 37/44] ppc/xics: fix irq priority in ics_set_irq_type() |
Date: |
Wed, 29 May 2019 16:50:10 +1000 |
From: Cédric Le Goater <address@hidden>
Recent commits changed the behavior of ics_set_irq_type() to
initialize correctly LSIs at the KVM level. ics_set_irq_type() is also
called by the realize routine of the different devices of the machine
when initial interrupts are claimed, before the ICSState device is
reseted.
In the case, the ICSIRQState priority is 0x0 and the call to
ics_set_irq_type() results in configuring the target of the
interrupt. On P9, when using the KVM XICS-on-XIVE device, the target
is configured to be server 0, priority 0 and the event queue 0 is
created automatically by KVM.
With the dual interrupt mode creating the KVM device at reset, it
leads to unexpected effects on the guest, mostly blocking IPIs. This
is wrong, fix it by reseting the ICSIRQState structure when
ics_set_irq_type() is called.
Fixes: commit 6cead90c5c9c ("xics: Write source state to KVM at claim time")
Signed-off-by: Greg Kurz <address@hidden>
Signed-off-by: Cédric Le Goater <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: David Gibson <address@hidden>
---
hw/intc/xics.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index af7dc709ab..79f5a8a916 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -610,6 +610,12 @@ static const TypeInfo ics_simple_info = {
.class_size = sizeof(ICSStateClass),
};
+static void ics_reset_irq(ICSIRQState *irq)
+{
+ irq->priority = 0xff;
+ irq->saved_priority = 0xff;
+}
+
static void ics_base_reset(DeviceState *dev)
{
ICSState *ics = ICS_BASE(dev);
@@ -623,8 +629,7 @@ static void ics_base_reset(DeviceState *dev)
memset(ics->irqs, 0, sizeof(ICSIRQState) * ics->nr_irqs);
for (i = 0; i < ics->nr_irqs; i++) {
- ics->irqs[i].priority = 0xff;
- ics->irqs[i].saved_priority = 0xff;
+ ics_reset_irq(ics->irqs + i);
ics->irqs[i].flags = flags[i];
}
}
@@ -760,6 +765,7 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi)
lsi ? XICS_FLAGS_IRQ_LSI : XICS_FLAGS_IRQ_MSI;
if (kvm_irqchip_in_kernel()) {
+ ics_reset_irq(ics->irqs + srcno);
ics_set_kvm_state_one(ics, srcno);
}
}
--
2.21.0
- [Qemu-ppc] [PULL 21/44] target/ppc: Set PSSCR_EC on cpu halt to prevent spurious wakeup, (continued)
- [Qemu-ppc] [PULL 21/44] target/ppc: Set PSSCR_EC on cpu halt to prevent spurious wakeup, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 32/44] sysbus: add a sysbus_mmio_unmap() helper, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 44/44] ppc/pnv: add dummy XSCOM registers for PRD initialization, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 43/44] ppc/pnv: introduce new skiboot platform properties, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 36/44] spapr/irq: initialize the IRQ device only once, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 41/44] spapr: change default interrupt mode to 'dual', David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 42/44] spapr: Don't migrate the hpt_maxpagesize cap to older machine types, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 38/44] spapr/irq: add KVM support to the 'dual' machine, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 40/44] spapr/xive: fix multiple resets when using the 'dual' interrupt mode, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 35/44] spapr/irq: introduce a spapr_irq_init_device() helper, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 37/44] ppc/xics: fix irq priority in ics_set_irq_type(),
David Gibson <=
- [Qemu-ppc] [PULL 33/44] spapr: introduce routines to delete the KVM IRQ device, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 39/44] docs: provide documentation on the POWER9 XIVE interrupt controller, David Gibson, 2019/05/29
- [Qemu-ppc] [PULL 30/44] spapr/xive: add migration support for KVM, David Gibson, 2019/05/29
- Re: [Qemu-ppc] [PULL 00/44] ppc-for-4.1 queue 20190529, Peter Maydell, 2019/05/30