mirror of https://github.com/xemu-project/xemu.git
hw/pci-bridge: Make pxb_dev_realize_common() return if it succeeded
For the CXL PXB there is additional code after pxb_dev_realize_common()
is called. If that realize failed (e.g. due to an out of range numa_node)
we will get a segfault. Return a bool so the caller can check if the
pxb_dev_realize_common() succeeded or not without having to poke around
in the errp.
Fixes: 4f8db8711c
("hw/pxb: Allow creation of a CXL PXB (host bridge)")
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Message-Id: <20241014121902.2146424-8-Jonathan.Cameron@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
d1978226c8
commit
d4d5212c54
|
@ -330,7 +330,7 @@ static gint pxb_compare(gconstpointer a, gconstpointer b)
|
||||||
0;
|
0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
|
static bool pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
PXBDev *pxb = PXB_DEV(dev);
|
PXBDev *pxb = PXB_DEV(dev);
|
||||||
|
@ -342,13 +342,13 @@ static void pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
|
||||||
|
|
||||||
if (ms->numa_state == NULL) {
|
if (ms->numa_state == NULL) {
|
||||||
error_setg(errp, "NUMA is not supported by this machine-type");
|
error_setg(errp, "NUMA is not supported by this machine-type");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pxb->numa_node != NUMA_NODE_UNASSIGNED &&
|
if (pxb->numa_node != NUMA_NODE_UNASSIGNED &&
|
||||||
pxb->numa_node >= ms->numa_state->num_nodes) {
|
pxb->numa_node >= ms->numa_state->num_nodes) {
|
||||||
error_setg(errp, "Illegal numa node %d", pxb->numa_node);
|
error_setg(errp, "Illegal numa node %d", pxb->numa_node);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->qdev.id && *dev->qdev.id) {
|
if (dev->qdev.id && *dev->qdev.id) {
|
||||||
|
@ -394,12 +394,13 @@ static void pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
|
||||||
pci_config_set_class(dev->config, PCI_CLASS_BRIDGE_HOST);
|
pci_config_set_class(dev->config, PCI_CLASS_BRIDGE_HOST);
|
||||||
|
|
||||||
pxb_dev_list = g_list_insert_sorted(pxb_dev_list, pxb, pxb_compare);
|
pxb_dev_list = g_list_insert_sorted(pxb_dev_list, pxb, pxb_compare);
|
||||||
return;
|
return true;
|
||||||
|
|
||||||
err_register_bus:
|
err_register_bus:
|
||||||
object_unref(OBJECT(bds));
|
object_unref(OBJECT(bds));
|
||||||
object_unparent(OBJECT(bus));
|
object_unparent(OBJECT(bus));
|
||||||
object_unref(OBJECT(ds));
|
object_unref(OBJECT(ds));
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pxb_dev_realize(PCIDevice *dev, Error **errp)
|
static void pxb_dev_realize(PCIDevice *dev, Error **errp)
|
||||||
|
@ -500,7 +501,9 @@ static void pxb_cxl_dev_realize(PCIDevice *dev, Error **errp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pxb_dev_realize_common(dev, CXL, errp);
|
if (!pxb_dev_realize_common(dev, CXL, errp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
pxb_cxl_dev_reset(DEVICE(dev));
|
pxb_cxl_dev_reset(DEVICE(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue