[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 15/28] spapr: Remove SpaprIrq::init_kvm hook
From: |
David Gibson |
Subject: |
[PULL 15/28] spapr: Remove SpaprIrq::init_kvm hook |
Date: |
Thu, 24 Oct 2019 19:18:00 +1100 |
This hook is a bit odd. The only caller is spapr_irq_init_kvm(), but
it explicitly takes an SpaprIrq *, so it's never really called through the
current SpaprIrq. Essentially this is just a way of passing through a
function pointer so that spapr_irq_init_kvm() can handle some
configuration and error handling logic without duplicating it between the
xics and xive reset paths.
So, make it just take that function pointer. Because of earlier reworks
to the KVM connect/disconnect code in the xics and xive backends we can
also eliminate some wrapper functions and streamline error handling a bit.
Signed-off-by: David Gibson <address@hidden>
Reviewed-by: Greg Kurz <address@hidden>
Reviewed-by: Cédric Le Goater <address@hidden>
---
hw/ppc/spapr_irq.c | 74 +++++++++++++-------------------------
include/hw/ppc/spapr_irq.h | 1 -
2 files changed, 25 insertions(+), 50 deletions(-)
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index 5c8ffb27da..7cd18e5b15 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -65,33 +65,35 @@ void spapr_irq_msi_free(SpaprMachineState *spapr, int irq,
uint32_t num)
bitmap_clear(spapr->irq_map, irq - SPAPR_IRQ_MSI, num);
}
-static void spapr_irq_init_kvm(SpaprMachineState *spapr,
- SpaprIrq *irq, Error **errp)
+static int spapr_irq_init_kvm(int (*fn)(SpaprInterruptController *, Error **),
+ SpaprInterruptController *intc,
+ Error **errp)
{
- MachineState *machine = MACHINE(spapr);
+ MachineState *machine = MACHINE(qdev_get_machine());
Error *local_err = NULL;
if (kvm_enabled() && machine_kernel_irqchip_allowed(machine)) {
- irq->init_kvm(spapr, &local_err);
- if (local_err && machine_kernel_irqchip_required(machine)) {
- error_prepend(&local_err,
- "kernel_irqchip requested but unavailable: ");
- error_propagate(errp, local_err);
- return;
- }
+ if (fn(intc, &local_err) < 0) {
+ if (machine_kernel_irqchip_required(machine)) {
+ error_prepend(&local_err,
+ "kernel_irqchip requested but unavailable: ");
+ error_propagate(errp, local_err);
+ return -1;
+ }
- if (!local_err) {
- return;
+ /*
+ * We failed to initialize the KVM device, fallback to
+ * emulated mode
+ */
+ error_prepend(&local_err,
+ "kernel_irqchip allowed but unavailable: ");
+ error_append_hint(&local_err,
+ "Falling back to kernel-irqchip=off\n");
+ warn_report_err(local_err);
}
-
- /*
- * We failed to initialize the KVM device, fallback to
- * emulated mode
- */
- error_prepend(&local_err, "kernel_irqchip allowed but unavailable: ");
- error_append_hint(&local_err, "Falling back to kernel-irqchip=off\n");
- warn_report_err(local_err);
}
+
+ return 0;
}
/*
@@ -112,20 +114,7 @@ static int spapr_irq_post_load_xics(SpaprMachineState
*spapr, int version_id)
static void spapr_irq_reset_xics(SpaprMachineState *spapr, Error **errp)
{
- Error *local_err = NULL;
-
- spapr_irq_init_kvm(spapr, &spapr_irq_xics, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-}
-
-static void spapr_irq_init_kvm_xics(SpaprMachineState *spapr, Error **errp)
-{
- if (kvm_enabled()) {
- xics_kvm_connect(SPAPR_INTC(spapr->ics), errp);
- }
+ spapr_irq_init_kvm(xics_kvm_connect, SPAPR_INTC(spapr->ics), errp);
}
SpaprIrq spapr_irq_xics = {
@@ -136,7 +125,6 @@ SpaprIrq spapr_irq_xics = {
.post_load = spapr_irq_post_load_xics,
.reset = spapr_irq_reset_xics,
- .init_kvm = spapr_irq_init_kvm_xics,
};
/*
@@ -151,7 +139,6 @@ static int spapr_irq_post_load_xive(SpaprMachineState
*spapr, int version_id)
static void spapr_irq_reset_xive(SpaprMachineState *spapr, Error **errp)
{
CPUState *cs;
- Error *local_err = NULL;
CPU_FOREACH(cs) {
PowerPCCPU *cpu = POWERPC_CPU(cs);
@@ -160,9 +147,8 @@ static void spapr_irq_reset_xive(SpaprMachineState *spapr,
Error **errp)
spapr_xive_set_tctx_os_cam(spapr_cpu_state(cpu)->tctx);
}
- spapr_irq_init_kvm(spapr, &spapr_irq_xive, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (spapr_irq_init_kvm(kvmppc_xive_connect,
+ SPAPR_INTC(spapr->xive), errp) < 0) {
return;
}
@@ -170,13 +156,6 @@ static void spapr_irq_reset_xive(SpaprMachineState *spapr,
Error **errp)
spapr_xive_mmio_set_enabled(spapr->xive, true);
}
-static void spapr_irq_init_kvm_xive(SpaprMachineState *spapr, Error **errp)
-{
- if (kvm_enabled()) {
- kvmppc_xive_connect(SPAPR_INTC(spapr->xive), errp);
- }
-}
-
SpaprIrq spapr_irq_xive = {
.nr_xirqs = SPAPR_NR_XIRQS,
.nr_msis = SPAPR_NR_MSIS,
@@ -185,7 +164,6 @@ SpaprIrq spapr_irq_xive = {
.post_load = spapr_irq_post_load_xive,
.reset = spapr_irq_reset_xive,
- .init_kvm = spapr_irq_init_kvm_xive,
};
/*
@@ -251,7 +229,6 @@ SpaprIrq spapr_irq_dual = {
.post_load = spapr_irq_post_load_dual,
.reset = spapr_irq_reset_dual,
- .init_kvm = NULL, /* should not be used */
};
@@ -675,7 +652,6 @@ SpaprIrq spapr_irq_xics_legacy = {
.post_load = spapr_irq_post_load_xics,
.reset = spapr_irq_reset_xics,
- .init_kvm = spapr_irq_init_kvm_xics,
};
static void spapr_irq_register_types(void)
diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h
index 0df95e1b5a..06179b271f 100644
--- a/include/hw/ppc/spapr_irq.h
+++ b/include/hw/ppc/spapr_irq.h
@@ -85,7 +85,6 @@ typedef struct SpaprIrq {
int (*post_load)(SpaprMachineState *spapr, int version_id);
void (*reset)(SpaprMachineState *spapr, Error **errp);
- void (*init_kvm)(SpaprMachineState *spapr, Error **errp);
} SpaprIrq;
extern SpaprIrq spapr_irq_xics;
--
2.21.0
- [PULL 02/28] xics: Make some device types not user creatable, (continued)
- [PULL 02/28] xics: Make some device types not user creatable, David Gibson, 2019/10/24
- [PULL 06/28] spapr: Set VSMT to smp_threads by default, David Gibson, 2019/10/24
- [PULL 07/28] spapr, xics, xive: Introduce SpaprInterruptController QOM interface, David Gibson, 2019/10/24
- [PULL 03/28] target/ppc: Fix for optimized vsl/vsr instructions, David Gibson, 2019/10/24
- [PULL 11/28] spapr, xics, xive: Move set_irq from SpaprIrq to SpaprInterruptController, David Gibson, 2019/10/24
- [PULL 08/28] spapr, xics, xive: Move cpu_intc_create from SpaprIrq to SpaprInterruptController, David Gibson, 2019/10/24
- [PULL 12/28] spapr, xics, xive: Move print_info from SpaprIrq to SpaprInterruptController, David Gibson, 2019/10/24
- [PULL 23/28] spapr_cpu_core: Implement DeviceClass::reset, David Gibson, 2019/10/24
- [PULL 28/28] spapr/xive: Set the OS CAM line at reset, David Gibson, 2019/10/24
- [PULL 10/28] spapr: Formalize notion of active interrupt controller, David Gibson, 2019/10/24
- [PULL 15/28] spapr: Remove SpaprIrq::init_kvm hook,
David Gibson <=
- [PULL 21/28] spapr: Don't request to unplug the same core twice, David Gibson, 2019/10/24
- [PULL 09/28] spapr, xics, xive: Move irq claim and free from SpaprIrq to SpaprInterruptController, David Gibson, 2019/10/24
- [PULL 17/28] spapr, xics, xive: Move SpaprIrq::post_load hook to backends, David Gibson, 2019/10/24
- [PULL 13/28] spapr, xics, xive: Move dt_populate from SpaprIrq to SpaprInterruptController, David Gibson, 2019/10/24
- [PULL 27/28] ppc/pnv: Fix naming of routines realizing the CPUs, David Gibson, 2019/10/24
- [PULL 22/28] spapr: move CPU reset after presenter creation, David Gibson, 2019/10/24
- [PULL 18/28] spapr: Remove SpaprIrq::nr_msis, David Gibson, 2019/10/24
- [PULL 24/28] ppc/pnv: Introduce a PnvCore reset handler, David Gibson, 2019/10/24
- [PULL 14/28] spapr, xics, xive: Match signatures for XICS and XIVE KVM connect routines, David Gibson, 2019/10/24
- [PULL 20/28] pseries: Update SLOF firmware image, David Gibson, 2019/10/24