From bf26ae32a92a8446bd9db569f9cdb53cc272aaad Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Thu, 27 Jul 2017 15:45:47 +0200 Subject: [PATCH 1/2] spapr_drc: fix realize and unrealize If object_property_add_alias() returns an error in realize(), we should propagate it to the caller and certainly not unref the DRC. Same thing goes for unrealize(). Since object_property_del() is the last call, we can even get rid of the intermediate Error *. And finally, unrealize() should undo all registrations performed by realize(). Signed-off-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_drc.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 15bae5c216..47d94e782a 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -506,11 +506,11 @@ static void realize(DeviceState *d, Error **errp) trace_spapr_drc_realize_child(spapr_drc_index(drc), child_name); object_property_add_alias(root_container, link_name, drc->owner, child_name, &err); - if (err) { - error_report_err(err); - object_unref(OBJECT(drc)); - } g_free(child_name); + if (err) { + error_propagate(errp, err); + return; + } vmstate_register(DEVICE(drc), spapr_drc_index(drc), &vmstate_spapr_drc, drc); qemu_register_reset(drc_reset, drc); @@ -522,16 +522,13 @@ static void unrealize(DeviceState *d, Error **errp) sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d); Object *root_container; char name[256]; - Error *err = NULL; trace_spapr_drc_unrealize(spapr_drc_index(drc)); + qemu_unregister_reset(drc_reset, drc); + vmstate_unregister(DEVICE(drc), &vmstate_spapr_drc, drc); root_container = container_get(object_get_root(), DRC_CONTAINER_PATH); snprintf(name, sizeof(name), "%x", spapr_drc_index(drc)); - object_property_del(root_container, name, &err); - if (err) { - error_report_err(err); - object_unref(OBJECT(drc)); - } + object_property_del(root_container, name, errp); } sPAPRDRConnector *spapr_dr_connector_new(Object *owner, const char *type, From fc7e0765fc385eed08c19a8823a970f4e98379b0 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Fri, 28 Jul 2017 13:38:50 +1000 Subject: [PATCH 2/2] Revert "spapr: populate device tree depending on XIVE_EXPLOIT option" This reverts commit b87680427e8a3ff682f66514e99a8344e7437247. I thought this was a harmless preliminary for XIVE enablement patches we expect later on. However, due to some subtle interactions between qemu and SLOF (guest firmware) this breaks some things. Revert it for now, we'll work out how to fix it when the rest of the XIVE patches are ready. Signed-off-by: David Gibson --- hw/ppc/spapr.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 2a3e53d5d5..f7a19720dc 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -776,11 +776,6 @@ static int spapr_dt_cas_updates(sPAPRMachineState *spapr, void *fdt, } } - /* /interrupt controller */ - if (!spapr_ovec_test(ov5_updates, OV5_XIVE_EXPLOIT)) { - spapr_dt_xics(xics_max_server_number(), fdt, PHANDLE_XICP); - } - offset = fdt_path_offset(fdt, "/chosen"); if (offset < 0) { offset = fdt_add_subnode(fdt, 0, "chosen"); @@ -804,7 +799,7 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr, size -= sizeof(hdr); - /* Create skeleton */ + /* Create sceleton */ fdt_skel = g_malloc0(size); _FDT((fdt_create(fdt_skel, size))); _FDT((fdt_begin_node(fdt_skel, ""))); @@ -1077,6 +1072,9 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, _FDT(fdt_setprop_cell(fdt, 0, "#address-cells", 2)); _FDT(fdt_setprop_cell(fdt, 0, "#size-cells", 2)); + /* /interrupt controller */ + spapr_dt_xics(xics_max_server_number(), fdt, PHANDLE_XICP); + ret = spapr_populate_memory(spapr, fdt); if (ret < 0) { error_report("couldn't setup memory nodes in fdt");