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:
parent
a9c2cdace0
commit
17548fe64a
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user