spapr: Add a return value to spapr_drc_attach()

As recommended in "qapi/error.h", return true on success and false on
failure. This allows to reduce error propagation overhead in the callers.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <20200914123505.612812-9-groug@kaod.org>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Greg Kurz 2020-09-14 14:34:58 +02:00 committed by David Gibson
parent a9c2cdace0
commit 17548fe64a
5 changed files with 9 additions and 23 deletions

View File

@ -3371,22 +3371,19 @@ static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
int i; int i;
uint64_t addr = addr_start; uint64_t addr = addr_start;
bool hotplugged = spapr_drc_hotplugged(dev); bool hotplugged = spapr_drc_hotplugged(dev);
Error *local_err = NULL;
for (i = 0; i < nr_lmbs; i++) { for (i = 0; i < nr_lmbs; i++) {
drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB, drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
addr / SPAPR_MEMORY_BLOCK_SIZE); addr / SPAPR_MEMORY_BLOCK_SIZE);
g_assert(drc); g_assert(drc);
spapr_drc_attach(drc, dev, &local_err); if (!spapr_drc_attach(drc, dev, errp)) {
if (local_err) {
while (addr > addr_start) { while (addr > addr_start) {
addr -= SPAPR_MEMORY_BLOCK_SIZE; addr -= SPAPR_MEMORY_BLOCK_SIZE;
drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB, drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
addr / SPAPR_MEMORY_BLOCK_SIZE); addr / SPAPR_MEMORY_BLOCK_SIZE);
spapr_drc_detach(drc); spapr_drc_detach(drc);
} }
error_propagate(errp, local_err);
return; return;
} }
if (!hotplugged) { if (!hotplugged) {
@ -3767,7 +3764,6 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
CPUCore *cc = CPU_CORE(dev); CPUCore *cc = CPU_CORE(dev);
CPUState *cs; CPUState *cs;
SpaprDrc *drc; SpaprDrc *drc;
Error *local_err = NULL;
CPUArchId *core_slot; CPUArchId *core_slot;
int index; int index;
bool hotplugged = spapr_drc_hotplugged(dev); bool hotplugged = spapr_drc_hotplugged(dev);
@ -3785,9 +3781,7 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
g_assert(drc || !mc->has_hotpluggable_cpus); g_assert(drc || !mc->has_hotpluggable_cpus);
if (drc) { if (drc) {
spapr_drc_attach(drc, dev, &local_err); if (!spapr_drc_attach(drc, dev, errp)) {
if (local_err) {
error_propagate(errp, local_err);
return; return;
} }
@ -3939,7 +3933,6 @@ static void spapr_phb_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(dev); SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(dev);
SpaprDrc *drc; SpaprDrc *drc;
bool hotplugged = spapr_drc_hotplugged(dev); bool hotplugged = spapr_drc_hotplugged(dev);
Error *local_err = NULL;
if (!smc->dr_phb_enabled) { if (!smc->dr_phb_enabled) {
return; return;
@ -3949,9 +3942,7 @@ static void spapr_phb_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
/* hotplug hooks should check it's enabled before getting this far */ /* hotplug hooks should check it's enabled before getting this far */
assert(drc); assert(drc);
spapr_drc_attach(drc, dev, &local_err); if (!spapr_drc_attach(drc, dev, errp)) {
if (local_err) {
error_propagate(errp, local_err);
return; return;
} }

View File

@ -371,13 +371,13 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
} while (fdt_depth != 0); } while (fdt_depth != 0);
} }
void spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp) bool spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp)
{ {
trace_spapr_drc_attach(spapr_drc_index(drc)); trace_spapr_drc_attach(spapr_drc_index(drc));
if (drc->dev) { if (drc->dev) {
error_setg(errp, "an attached device is still awaiting release"); error_setg(errp, "an attached device is still awaiting release");
return; return false;
} }
g_assert((drc->state == SPAPR_DRC_STATE_LOGICAL_UNUSABLE) g_assert((drc->state == SPAPR_DRC_STATE_LOGICAL_UNUSABLE)
|| (drc->state == SPAPR_DRC_STATE_PHYSICAL_POWERON)); || (drc->state == SPAPR_DRC_STATE_PHYSICAL_POWERON));
@ -388,6 +388,7 @@ void spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp)
object_get_typename(OBJECT(drc->dev)), object_get_typename(OBJECT(drc->dev)),
(Object **)(&drc->dev), (Object **)(&drc->dev),
NULL, 0); NULL, 0);
return true;
} }
static void spapr_drc_release(SpaprDrc *drc) static void spapr_drc_release(SpaprDrc *drc)

View File

@ -91,14 +91,11 @@ void spapr_add_nvdimm(DeviceState *dev, uint64_t slot, Error **errp)
{ {
SpaprDrc *drc; SpaprDrc *drc;
bool hotplugged = spapr_drc_hotplugged(dev); bool hotplugged = spapr_drc_hotplugged(dev);
Error *local_err = NULL;
drc = spapr_drc_by_id(TYPE_SPAPR_DRC_PMEM, slot); drc = spapr_drc_by_id(TYPE_SPAPR_DRC_PMEM, slot);
g_assert(drc); g_assert(drc);
spapr_drc_attach(drc, dev, &local_err); if (!spapr_drc_attach(drc, dev, errp)) {
if (local_err) {
error_propagate(errp, local_err);
return; return;
} }

View File

@ -1539,7 +1539,6 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
PCIDevice *pdev = PCI_DEVICE(plugged_dev); PCIDevice *pdev = PCI_DEVICE(plugged_dev);
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(plugged_dev); PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(plugged_dev);
SpaprDrc *drc = drc_from_dev(phb, pdev); SpaprDrc *drc = drc_from_dev(phb, pdev);
Error *local_err = NULL;
PCIBus *bus = PCI_BUS(qdev_get_parent_bus(DEVICE(pdev))); PCIBus *bus = PCI_BUS(qdev_get_parent_bus(DEVICE(pdev)));
uint32_t slotnr = PCI_SLOT(pdev->devfn); uint32_t slotnr = PCI_SLOT(pdev->devfn);
@ -1578,9 +1577,7 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
return; return;
} }
spapr_drc_attach(drc, DEVICE(pdev), &local_err); if (!spapr_drc_attach(drc, DEVICE(pdev), errp)) {
if (local_err) {
error_propagate(errp, local_err);
return; return;
} }

View File

@ -235,7 +235,7 @@ SpaprDrc *spapr_drc_by_index(uint32_t index);
SpaprDrc *spapr_drc_by_id(const char *type, uint32_t id); SpaprDrc *spapr_drc_by_id(const char *type, uint32_t id);
int spapr_dt_drc(void *fdt, int offset, Object *owner, uint32_t drc_type_mask); int spapr_dt_drc(void *fdt, int offset, Object *owner, uint32_t drc_type_mask);
void spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp); bool spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp);
void spapr_drc_detach(SpaprDrc *drc); void spapr_drc_detach(SpaprDrc *drc);
/* Returns true if a hot plug/unplug request is pending */ /* Returns true if a hot plug/unplug request is pending */