[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 11/33] spapr/xive: Allocate vCPU IPIs from the vCPU contexts
From: |
David Gibson |
Subject: |
[PULL 11/33] spapr/xive: Allocate vCPU IPIs from the vCPU contexts |
Date: |
Tue, 8 Sep 2020 15:19:31 +1000 |
From: Cédric Le Goater <clg@kaod.org>
When QEMU switches to the XIVE interrupt mode, it creates all the
guest interrupts at the level of the KVM device. These interrupts are
backed by real HW interrupts from the IPI interrupt pool of the XIVE
controller.
Currently, this is done from the QEMU main thread, which results in
allocating all interrupts from the chip on which QEMU is running. IPIs
are not distributed across the system and the load is not well
balanced across the interrupt controllers.
Change the vCPU IPI allocation to run from the vCPU context. The
associated XIVE IPI interrupt will be allocated on the chip on which
the vCPU is running and improve distribution of the IPIs in the system.
When the vCPUs are pinned, this will make the IPI local to the chip of
the vCPU. It will reduce rerouting between interrupt controllers and
gives better performance.
Device interrupts are still treated the same. To improve placement, we
would need some information on the chip owning the virtual source or
the HW source in case of a passthrough device but this reuires
changes in PAPR.
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20200820134547.2355743-5-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/intc/spapr_xive_kvm.c | 36 +++++++++++++++++++++++++++++++++---
1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/hw/intc/spapr_xive_kvm.c b/hw/intc/spapr_xive_kvm.c
index 507637d51e..66bf4c06fe 100644
--- a/hw/intc/spapr_xive_kvm.c
+++ b/hw/intc/spapr_xive_kvm.c
@@ -146,13 +146,43 @@ int kvmppc_xive_cpu_synchronize_state(XiveTCTX *tctx,
Error **errp)
return s.ret;
}
-static int kvmppc_xive_reset_ipi(SpaprXive *xive, CPUState *cs, Error **errp)
+/*
+ * Allocate the vCPU IPIs from the vCPU context. This will allocate
+ * the XIVE IPI interrupt on the chip on which the vCPU is running.
+ * This gives a better distribution of IPIs when the guest has a lot
+ * of vCPUs. When the vCPUs are pinned, this will make the IPI local
+ * to the chip of the vCPU. It will reduce rerouting between interrupt
+ * controllers and gives better performance.
+ */
+typedef struct {
+ SpaprXive *xive;
+ Error *err;
+ int rc;
+} XiveInitIPI;
+
+static void kvmppc_xive_reset_ipi_on_cpu(CPUState *cs, run_on_cpu_data arg)
{
unsigned long ipi = kvm_arch_vcpu_id(cs);
+ XiveInitIPI *s = arg.host_ptr;
uint64_t state = 0;
- return kvm_device_access(xive->fd, KVM_DEV_XIVE_GRP_SOURCE, ipi,
- &state, true, errp);
+ s->rc = kvm_device_access(s->xive->fd, KVM_DEV_XIVE_GRP_SOURCE, ipi,
+ &state, true, &s->err);
+}
+
+static int kvmppc_xive_reset_ipi(SpaprXive *xive, CPUState *cs, Error **errp)
+{
+ XiveInitIPI s = {
+ .xive = xive,
+ .err = NULL,
+ .rc = 0,
+ };
+
+ run_on_cpu(cs, kvmppc_xive_reset_ipi_on_cpu, RUN_ON_CPU_HOST_PTR(&s));
+ if (s.err) {
+ error_propagate(errp, s.err);
+ }
+ return s.rc;
}
int kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp)
--
2.26.2
- [PULL 00/33] ppc-for-5.2 queue 20200908, David Gibson, 2020/09/08
- [PULL 02/33] ppc/pnv: Fix TypeInfo of PnvLpcController abstract class, David Gibson, 2020/09/08
- [PULL 01/33] adb: Correct class size on TYPE_ADB_DEVICE, David Gibson, 2020/09/08
- [PULL 03/33] spapr: Remove unnecessary DRC type-checker macros, David Gibson, 2020/09/08
- [PULL 04/33] spapr/xive: Add a 'hv-prio' property to represent the KVM escalation priority, David Gibson, 2020/09/08
- [PULL 05/33] ppc/pnv: Add a HIOMAP erase command, David Gibson, 2020/09/08
- [PULL 08/33] spapr/xive: Modify kvm_cpu_is_enabled() interface, David Gibson, 2020/09/08
- [PULL 07/33] spapr/xive: Use the xics flag to check for XIVE-only IRQ backends, David Gibson, 2020/09/08
- [PULL 06/33] spapr_vscsi: do not allow device hotplug, David Gibson, 2020/09/08
- [PULL 11/33] spapr/xive: Allocate vCPU IPIs from the vCPU contexts,
David Gibson <=
- [PULL 09/33] spapr/xive: Use kvmppc_xive_source_reset() in post_load, David Gibson, 2020/09/08
- [PULL 12/33] ppc/spapr_nvdimm: use g_autofree in spapr_nvdimm_validate_opts(), David Gibson, 2020/09/08
- [PULL 14/33] ppc/spapr_nvdimm: do not enable support with 'nvdimm=off', David Gibson, 2020/09/08
- [PULL 10/33] spapr/xive: Allocate IPIs independently from the other sources, David Gibson, 2020/09/08
- [PULL 13/33] spapr, spapr_nvdimm: fold NVDIMM validation in the same place, David Gibson, 2020/09/08
- [PULL 15/33] target/arm: Move start-powered-off property to generic CPUState, David Gibson, 2020/09/08
- [PULL 16/33] target/arm: Move setting of CPU halted state to generic code, David Gibson, 2020/09/08
- [PULL 19/33] mips/cps: Use start-powered-off CPUState property, David Gibson, 2020/09/08
- [PULL 24/33] hw/ppc/ppc4xx_pci: Replace pointless warning by assert(), David Gibson, 2020/09/08
- [PULL 20/33] sparc/sun4m: Don't set cs->halted = 0 in main_cpu_reset(), David Gibson, 2020/09/08