[RFC PATCH v2 037/137] hw/scsi: Give onboard devices a QOM parent

Alexander Graf <[email protected]>
Newsgroups org.nongnu.qemu-arm,org.nongnu.qemu-devel,org.nongnu.qemu-riscv
Message-ID <[email protected]>
Convert the *_orphan() device-creation calls in hw/scsi to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.

The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children.  Names follow existing QOM conventions.

Per-site rationale (reviewers: dispute the modeling here):

hw/scsi/lasi_ncr710.c:234 | qdev_new | parent | "scsi" | thread Object *parent as first arg; single caller in hw/hppa/machine.c board init passes OBJECT(machine)
hw/scsi/ncr53c710.c:2379 | qdev_new | parent | "scsi" | thread Object *parent as first arg; no in-tree callers, header updated
hw/scsi/ncr53c710.c:2397 | qdev_new | parent | "scsi" | thread Object *parent as first arg; no in-tree callers, header updated
hw/scsi/scsi-bus.c:448 | qdev_new | OBJECT(bus) | name | collapse existing object_property_add_child(OBJECT(bus), name, dev); keep dynamic legacy[%d] name
hw/scsi/spapr_vscsi.c:1238 | qdev_new | parent | "vscsi[*]" | thread Object *parent as first arg; single caller in hw/ppc/spapr.c board init loop passes OBJECT(spapr)

Link: https://lore.kernel.org/qemu-devel/[email protected]/
AI-used-for: code (refactoring)
Signed-off-by: Alexander Graf <[email protected]>
---
 hw/hppa/machine.c          |  2 +-
 hw/ppc/spapr.c             |  2 +-
 hw/scsi/lasi_ncr710.c      |  8 ++++----
 hw/scsi/lasi_ncr710.h      |  4 ++--
 hw/scsi/ncr53c710.c        | 15 ++++++++-------
 hw/scsi/ncr53c710.h        |  7 ++++---
 hw/scsi/scsi-bus.c         |  5 ++---
 hw/scsi/spapr_vscsi.c      |  6 +++---
 include/hw/ppc/spapr_vio.h |  2 +-
 9 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index e50f9adf41..e3c9053bf2 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -631,7 +631,7 @@ static void machine_HP_715_init(MachineState *machine)
                                                        1));
     /* SCSI disk setup. */
     if (drive_get_max_bus(IF_SCSI) >= 0) {
-        dev = lasi_ncr710_init(addr_space,
+        dev = lasi_ncr710_init(OBJECT(machine), addr_space,
                                translate(NULL, LASI_HPA_715 + 0x6000),
                                qdev_get_gpio_in(lasi_dev, LASI_IRQ_SCSI_HPA));
         assert(dev);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e09b529ebc..91f9d873b8 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3062,7 +3062,7 @@ static void spapr_machine_init(MachineState *machine)
     pci_init_nic_devices(phb->bus, NULL);
 
     for (i = 0; i <= drive_get_max_bus(IF_SCSI); i++) {
-        spapr_vscsi_create(spapr->vio_bus);
+        spapr_vscsi_create(OBJECT(spapr), spapr->vio_bus);
     }
 
     /* Graphics */
diff --git a/hw/scsi/lasi_ncr710.c b/hw/scsi/lasi_ncr710.c
index e1a1f68aaa..d40bc62157 100644
--- a/hw/scsi/lasi_ncr710.c
+++ b/hw/scsi/lasi_ncr710.c
@@ -224,18 +224,18 @@ void lasi_ncr710_handle_legacy_cmdline(DeviceState *lasi_dev)
     }
 }
 
-DeviceState *lasi_ncr710_init(MemoryRegion *addr_space, hwaddr hpa,
-                               qemu_irq irq)
+DeviceState *lasi_ncr710_init(Object *parent, MemoryRegion *addr_space,
+                              hwaddr hpa, qemu_irq irq)
 {
     DeviceState *dev;
     LasiNCR710State *s;
     SysBusDevice *sbd;
 
-    dev = qdev_new_orphan(TYPE_LASI_NCR710);
+    dev = qdev_new(parent, "scsi", TYPE_LASI_NCR710);
     s = LASI_NCR710(dev);
     sbd = SYS_BUS_DEVICE(dev);
     s->lasi_irq = irq;
-    sysbus_realize_and_unref(sbd, &error_fatal);
+    sysbus_realize(sbd, &error_fatal);
     memory_region_add_subregion(addr_space, hpa,
                                sysbus_mmio_get_region(sbd, 0));
     return dev;
diff --git a/hw/scsi/lasi_ncr710.h b/hw/scsi/lasi_ncr710.h
index 450fb7e1c3..e963a6511f 100644
--- a/hw/scsi/lasi_ncr710.h
+++ b/hw/scsi/lasi_ncr710.h
@@ -48,8 +48,8 @@ typedef struct LasiNCR710State {
     NCR710State ncr710;
 } LasiNCR710State;
 
-DeviceState *lasi_ncr710_init(MemoryRegion *addr_space, hwaddr hpa,
-                               qemu_irq irq);
+DeviceState *lasi_ncr710_init(Object *parent, MemoryRegion *addr_space,
+                              hwaddr hpa, qemu_irq irq);
 void lasi_ncr710_handle_legacy_cmdline(DeviceState *lasi_dev);
 
 #endif
diff --git a/hw/scsi/ncr53c710.c b/hw/scsi/ncr53c710.c
index 54ce2df641..633a76c70b 100644
--- a/hw/scsi/ncr53c710.c
+++ b/hw/scsi/ncr53c710.c
@@ -2371,22 +2371,23 @@ static const VMStateDescription vmstate_sysbus_ncr710 = {
     }
 };
 
-DeviceState *ncr710_device_create_sysbus(hwaddr addr, qemu_irq irq)
+DeviceState *ncr710_device_create_sysbus(Object *parent, hwaddr addr,
+                                          qemu_irq irq)
 {
     DeviceState *dev;
     SysBusDevice *sysbus;
 
-    dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
+    dev = qdev_new(parent, "scsi", TYPE_SYSBUS_NCR710_SCSI);
     sysbus = SYS_BUS_DEVICE(dev);
 
-    qdev_realize_and_unref(dev, NULL, &error_abort);
+    qdev_realize(dev, NULL, &error_abort);
     sysbus_mmio_map(sysbus, 0, addr);
     sysbus_connect_irq(sysbus, 0, irq);
     return dev;
 }
 
-DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
-                             qemu_irq irq)
+DeviceState *ncr53c710_init(Object *parent, MemoryRegion *address_space,
+                            hwaddr addr, qemu_irq irq)
 {
     DeviceState *dev;
     SysBusDevice *sysbus;
@@ -2394,10 +2395,10 @@ DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
 
     /* trace_ncr710_device_init(addr); */
 
-    dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
+    dev = qdev_new(parent, "scsi", TYPE_SYSBUS_NCR710_SCSI);
     sysbus = SYS_BUS_DEVICE(dev);
 
-    qdev_realize_and_unref(dev, NULL, &error_abort);
+    qdev_realize(dev, NULL, &error_abort);
     sysbus_mmio_map(sysbus, 0, addr);
     sysbus_connect_irq(sysbus, 0, irq);
 
diff --git a/hw/scsi/ncr53c710.h b/hw/scsi/ncr53c710.h
index 00b6a01577..6e466d6a36 100644
--- a/hw/scsi/ncr53c710.h
+++ b/hw/scsi/ncr53c710.h
@@ -229,9 +229,10 @@ static inline SysBusNCR710State *sysbus_from_ncr710(NCR710State *s)
     return container_of(s, SysBusNCR710State, ncr710);
 }
 
-DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
-                             qemu_irq irq);
-DeviceState *ncr710_device_create_sysbus(hwaddr addr, qemu_irq irq);
+DeviceState *ncr53c710_init(Object *parent, MemoryRegion *address_space,
+                            hwaddr addr, qemu_irq irq);
+DeviceState *ncr710_device_create_sysbus(Object *parent, hwaddr addr,
+                                          qemu_irq irq);
 void ncr710_reg_write(void *opaque, hwaddr addr, uint64_t val, unsigned size);
 uint64_t ncr710_reg_read(void *opaque, hwaddr addr, unsigned size);
 void ncr710_soft_reset(NCR710State *s);
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index 806a20baee..bc7cfea6ed 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -445,9 +445,8 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
             driver = "scsi-hd";
         }
     }
-    dev = qdev_new_orphan(driver);
     name = g_strdup_printf("legacy[%d]", unit);
-    object_property_add_child(OBJECT(bus), name, OBJECT(dev));
+    dev = qdev_new(OBJECT(bus), name, driver);
     g_free(name);
 
     s = SCSI_DEVICE(dev);
@@ -473,7 +472,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
         return NULL;
     }
 
-    if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) {
+    if (!qdev_realize(dev, &bus->qbus, errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index 492d7d18a2..95cd21ffbb 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -1231,13 +1231,13 @@ static void spapr_vscsi_realize(SpaprVioDevice *dev, Error **errp)
     qbus_set_hotplug_handler(BUS(&s->bus), NULL);
 }
 
-void spapr_vscsi_create(SpaprVioBus *bus)
+void spapr_vscsi_create(Object *parent, SpaprVioBus *bus)
 {
     DeviceState *dev;
 
-    dev = qdev_new_orphan("spapr-vscsi");
+    dev = qdev_new(parent, "vscsi[*]", "spapr-vscsi");
 
-    qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
+    qdev_realize(dev, &bus->bus, &error_fatal);
     scsi_bus_legacy_handle_cmdline(&VIO_SPAPR_VSCSI_DEVICE(dev)->bus);
 }
 
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index 0ea0dbae8b..72baef6919 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -139,7 +139,7 @@ SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg);
 void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len);
 void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev);
 void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd);
-void spapr_vscsi_create(SpaprVioBus *bus);
+void spapr_vscsi_create(Object *parent, SpaprVioBus *bus);
 
 SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus);
 
-- 
2.47.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.