[PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends

Markus Armbruster posted 46 patches 5 years, 5 months ago
There is a newer version of this series
[PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Markus Armbruster 5 years, 5 months ago
Convert

    foo(..., &err);
    if (err) {
        ...
    }

to

    if (!foo(..., &err)) {
        ...
    }

for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
wrappers isa_realize_and_unref(), pci_realize_and_unref(),
sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
Coccinelle script:

    @@
    identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
    expression list args, args2;
    typedef Error;
    Error *err;
    identifier errp;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, errp, args2)) {
	       ... when != err
    -	   error_propagate(errp, err);
	       ...
	   }

    @@
    identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
    expression list args, args2;
    typedef Error;
    Error *err;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, &err, args2)) {
	       ...
	   }

Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
ARMSSE being used both as typedef and function-like macro there.
Convert manually.

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.  Clean up whitespace.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/arm/allwinner-a10.c          |  21 ++-----
 hw/arm/armsse.c                 | 104 ++++++++------------------------
 hw/arm/armv7m.c                 |  12 +---
 hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
 hw/arm/aspeed_soc.c             |  60 +++++-------------
 hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
 hw/arm/bcm2836.c                |  12 +---
 hw/arm/cubieboard.c             |   3 +-
 hw/arm/digic.c                  |  12 +---
 hw/arm/digic_boards.c           |   3 +-
 hw/arm/fsl-imx25.c              |  44 ++++----------
 hw/arm/fsl-imx31.c              |  32 +++-------
 hw/arm/fsl-imx6.c               |  48 ++++-----------
 hw/arm/msf2-soc.c               |  21 ++-----
 hw/arm/nrf51_soc.c              |  24 ++------
 hw/arm/stm32f205_soc.c          |  29 +++------
 hw/arm/stm32f405_soc.c          |  32 +++-------
 hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
 hw/block/fdc.c                  |   4 +-
 hw/block/xen-block.c            |   3 +-
 hw/char/serial-pci-multi.c      |   5 +-
 hw/char/serial-pci.c            |   5 +-
 hw/char/serial.c                |  10 +--
 hw/core/cpu.c                   |   3 +-
 hw/cpu/a15mpcore.c              |   5 +-
 hw/cpu/a9mpcore.c               |  21 ++-----
 hw/cpu/arm11mpcore.c            |  17 ++----
 hw/cpu/realview_mpcore.c        |   9 +--
 hw/display/virtio-gpu-pci.c     |   6 +-
 hw/display/virtio-vga.c         |   5 +-
 hw/intc/armv7m_nvic.c           |   9 +--
 hw/intc/pnv_xive.c              |   8 +--
 hw/intc/realview_gic.c          |   5 +-
 hw/intc/spapr_xive.c            |   8 +--
 hw/intc/xics.c                  |   5 +-
 hw/intc/xive.c                  |   3 +-
 hw/isa/piix4.c                  |   5 +-
 hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
 hw/mips/cps.c                   |  17 ++----
 hw/misc/macio/cuda.c            |   5 +-
 hw/misc/macio/macio.c           |  25 ++------
 hw/misc/macio/pmu.c             |   5 +-
 hw/pci-host/pnv_phb3.c          |  13 +---
 hw/pci-host/pnv_phb4.c          |   5 +-
 hw/pci-host/pnv_phb4_pec.c      |   5 +-
 hw/ppc/e500.c                   |   5 +-
 hw/ppc/pnv.c                    |  53 ++++------------
 hw/ppc/pnv_core.c               |   4 +-
 hw/ppc/pnv_psi.c                |   9 +--
 hw/ppc/spapr_cpu_core.c         |   3 +-
 hw/ppc/spapr_irq.c              |   5 +-
 hw/riscv/opentitan.c            |   9 +--
 hw/riscv/sifive_e.c             |   6 +-
 hw/riscv/sifive_u.c             |   5 +-
 hw/s390x/event-facility.c       |  13 ++--
 hw/s390x/s390-pci-bus.c         |   3 +-
 hw/s390x/sclp.c                 |   3 +-
 hw/s390x/virtio-ccw-crypto.c    |   5 +-
 hw/s390x/virtio-ccw-rng.c       |   5 +-
 hw/scsi/scsi-bus.c              |   4 +-
 hw/sd/aspeed_sdhci.c            |   4 +-
 hw/sd/ssi-sd.c                  |   3 +-
 hw/usb/bus.c                    |   3 +-
 hw/virtio/virtio-rng-pci.c      |   5 +-
 qdev-monitor.c                  |   3 +-
 65 files changed, 248 insertions(+), 768 deletions(-)

diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 52e0d83760..3e45aa4141 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -72,17 +72,12 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
 {
     AwA10State *s = AW_A10(dev);
     SysBusDevice *sysbusdev;
-    Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->intc);
@@ -93,9 +88,7 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
     qdev_pass_gpios(DEVICE(&s->intc), dev, NULL);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->timer);
@@ -117,18 +110,14 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
         qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
         qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->emac);
     sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE);
     sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 55));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE);
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index e2cf43ee0b..b306d95538 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -566,9 +566,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         object_property_set_link(cpuobj, OBJECT(&s->cpu_container[i]),
                                  "memory", &error_abort);
         object_property_set_link(cpuobj, OBJECT(s), "idau", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(cpuobj), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(cpuobj), errp)) {
             return;
         }
         /*
@@ -577,9 +575,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
          * CPU must exist and have been parented into the cluster before
          * the cluster is realized.
          */
-        qdev_realize(DEVICE(&s->cluster[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cluster[i]), NULL, errp)) {
             return;
         }
 
@@ -613,9 +609,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                     error_propagate(errp, err);
                     return;
                 }
-                qdev_realize(DEVICE(splitter), NULL, &err);
-                if (err) {
-                    error_propagate(errp, err);
+                if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
                     return;
                 }
                 for (cpunum = 0; cpunum < info->num_cpus; cpunum++) {
@@ -646,9 +640,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     }
 
     /* Security controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->secctl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->secctl), errp)) {
         return;
     }
     sbd_secctl = SYS_BUS_DEVICE(&s->secctl);
@@ -669,9 +661,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, errp)) {
         return;
     }
     dev_splitter = DEVICE(&s->sec_resp_splitter);
@@ -693,9 +683,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         }
         object_property_set_link(OBJECT(&s->mpc[i]), OBJECT(&s->sram[i]),
                                  "downstream", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), errp)) {
             return;
         }
         /* Map the upstream end of the MPC into the right place... */
@@ -716,9 +704,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->mpc_irq_orgate), 0,
@@ -735,9 +721,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      * map its upstream ends to the right place in the container.
      */
     qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer0), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer0), 0,
@@ -747,9 +731,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                              &error_abort);
 
     qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer1), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer1), 0,
@@ -759,9 +741,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                              &error_abort);
 
     qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dualtimer), 0,
@@ -785,9 +765,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             int cpunum;
             SysBusDevice *mhu_sbd = SYS_BUS_DEVICE(&s->mhu[i]);
 
-            sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), errp)) {
                 return;
             }
             port = g_strdup_printf("port[%d]", i + 3);
@@ -812,9 +790,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         }
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), errp)) {
         return;
     }
 
@@ -861,9 +837,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->ppc_irq_orgate), 0,
@@ -884,9 +858,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             qdev_prop_set_string(DEVICE(&s->cachectrl[i]), "name", name);
             g_free(name);
             qdev_prop_set_uint64(DEVICE(&s->cachectrl[i]), "size", 0x1000);
-            sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), errp)) {
                 return;
             }
 
@@ -902,9 +874,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             qdev_prop_set_string(DEVICE(&s->cpusecctrl[i]), "name", name);
             g_free(name);
             qdev_prop_set_uint64(DEVICE(&s->cpusecctrl[i]), "size", 0x1000);
-            sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), errp)) {
                 return;
             }
 
@@ -917,9 +887,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             MemoryRegion *mr;
 
             qdev_prop_set_uint32(DEVICE(&s->cpuid[i]), "CPUID", i);
-            sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), errp)) {
                 return;
             }
 
@@ -933,9 +901,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      *   0x4002f000: S32K timer
      */
     qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
-    sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32ktimer), 0,
@@ -944,9 +910,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     object_property_set_link(OBJECT(&s->apb_ppc1), OBJECT(mr), "port[0]",
                              &error_abort);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), errp)) {
         return;
     }
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->apb_ppc1), 0);
@@ -982,9 +946,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), errp)) {
         return;
     }
     /* System information registers */
@@ -998,9 +960,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                             "INITSVTOR0_RST", &error_abort);
     object_property_set_int(OBJECT(&s->sysctl), s->init_svtor,
                             "INITSVTOR1_RST", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysctl), 0, 0x50021000);
@@ -1033,18 +993,14 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->nmi_orgate), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->nmi_orgate), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->nmi_orgate), 0,
                           qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
 
     qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
-    sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32kwatchdog), 0,
@@ -1054,9 +1010,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     /* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
 
     qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->nswatchdog), 0,
@@ -1064,9 +1018,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
 
     qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->swatchdog), 0,
@@ -1081,9 +1033,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        qdev_realize(DEVICE(splitter), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
             return;
         }
     }
@@ -1128,9 +1078,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        qdev_realize(DEVICE(splitter), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
             return;
         }
 
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index 3308211e9c..5d6bded386 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -213,16 +213,12 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
     s->cpu->env.nvic = &s->nvic;
     s->nvic.cpu = s->cpu;
 
-    qdev_realize(DEVICE(s->cpu), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(s->cpu), NULL, errp)) {
         return;
     }
 
     /* Note that we must realize the NVIC after the CPU */
-    sysbus_realize(SYS_BUS_DEVICE(&s->nvic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvic), errp)) {
         return;
     }
 
@@ -254,9 +250,7 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
             }
             object_property_set_link(obj, OBJECT(s->board_memory),
                                      "source-memory", &error_abort);
-            sysbus_realize(SYS_BUS_DEVICE(obj), &err);
-            if (err != NULL) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
                 return;
             }
 
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
index 59a7a1370b..aa02755d3f 100644
--- a/hw/arm/aspeed_ast2600.c
+++ b/hw/arm/aspeed_ast2600.c
@@ -259,9 +259,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
          * is needed when using -kernel
          */
 
-        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -301,17 +299,13 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                                 sc->memmap[ASPEED_SRAM], &s->sram);
 
     /* SCU */
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
 
     /* RTC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
@@ -321,9 +315,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     /* Timer */
     object_property_set_link(OBJECT(&s->timerctrl),
                              OBJECT(&s->scu), "scu", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
@@ -343,9 +335,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     /* I2C */
     object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
@@ -368,9 +358,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
@@ -385,9 +373,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                                  "dram", &error_abort);
         object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
                                 &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
@@ -398,9 +384,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
     /* EHCI */
     for (i = 0; i < sc->ehcis_num; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
@@ -410,9 +394,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 
     /* SDMC - SDRAM Memory Controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
@@ -423,9 +405,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
         object_property_set_link(OBJECT(&s->wdt[i]),
                                  OBJECT(&s->scu), "scu", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
@@ -436,9 +416,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->macs_num; i++) {
         object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
@@ -448,9 +426,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
         object_property_set_link(OBJECT(&s->mii[i]), OBJECT(&s->ftgmac100[i]),
                                  "nic", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), errp)) {
             return;
         }
 
@@ -459,9 +435,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 
     /* XDMA */
-    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
@@ -470,18 +444,14 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_XDMA));
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
                        aspeed_soc_get_irq(s, ASPEED_GPIO));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio_1_8v), 0,
@@ -490,9 +460,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_GPIO_1_8V));
 
     /* SDHCI */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
@@ -501,9 +469,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_SDHCI));
 
     /* eMMC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->emmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, sc->memmap[ASPEED_EMMC]);
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index 311458aa76..6faffc13cc 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -230,9 +230,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
     /* CPU */
     for (i = 0; i < sc->num_cpus; i++) {
-        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -248,17 +246,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                                 sc->memmap[ASPEED_SRAM], &s->sram);
 
     /* SCU */
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
 
     /* VIC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->vic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->vic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_VIC]);
@@ -268,9 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
     /* RTC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
@@ -280,9 +272,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     /* Timer */
     object_property_set_link(OBJECT(&s->timerctrl),
                              OBJECT(&s->scu), "scu", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
@@ -302,9 +292,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     /* I2C */
     object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
@@ -320,9 +308,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
@@ -335,9 +321,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->spis_num; i++) {
         object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
                                 &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
@@ -348,9 +332,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
     /* EHCI */
     for (i = 0; i < sc->ehcis_num; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
@@ -360,9 +342,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     }
 
     /* SDMC - SDRAM Memory Controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
@@ -373,9 +353,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
         object_property_set_link(OBJECT(&s->wdt[i]),
                                  OBJECT(&s->scu), "scu", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
@@ -386,9 +364,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->macs_num; i++) {
         object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
@@ -398,9 +374,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     }
 
     /* XDMA */
-    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
@@ -409,9 +383,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_XDMA));
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
@@ -419,9 +391,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_GPIO));
 
     /* SDHCI */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 7ffdf62067..8313410ffe 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -161,9 +161,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     }
 
     /* Interrupt Controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->ic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ic), errp)) {
         return;
     }
 
@@ -172,9 +170,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     sysbus_pass_irq(SYS_BUS_DEVICE(s), SYS_BUS_DEVICE(&s->ic));
 
     /* Sys Timer */
-    sysbus_realize(SYS_BUS_DEVICE(&s->systmr), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systmr), errp)) {
         return;
     }
     memory_region_add_subregion(&s->peri_mr, ST_OFFSET,
@@ -185,9 +181,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
 
     /* UART0 */
     qdev_prop_set_chr(DEVICE(&s->uart0), "chardev", serial_hd(0));
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart0), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart0), errp)) {
         return;
     }
 
@@ -200,9 +194,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     /* AUX / UART1 */
     qdev_prop_set_chr(DEVICE(&s->aux), "chardev", serial_hd(1));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->aux), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->aux), errp)) {
         return;
     }
 
@@ -213,9 +205,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_AUX));
 
     /* Mailboxes */
-    sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), errp)) {
         return;
     }
 
@@ -239,9 +229,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->fb), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fb), errp)) {
         return;
     }
 
@@ -251,9 +239,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                        qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_FB));
 
     /* Property channel */
-    sysbus_realize(SYS_BUS_DEVICE(&s->property), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->property), errp)) {
         return;
     }
 
@@ -264,9 +250,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                       qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_PROPERTY));
 
     /* Random Number Generator */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
         return;
     }
 
@@ -289,9 +273,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                              &error_abort);
     object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
         return;
     }
 
@@ -302,9 +284,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_ARASANSDIO));
 
     /* SDHOST */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), errp)) {
         return;
     }
 
@@ -315,9 +295,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_SDIO));
 
     /* DMA Channels */
-    sysbus_realize(SYS_BUS_DEVICE(&s->dma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dma), errp)) {
         return;
     }
 
@@ -334,18 +312,14 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     }
 
     /* THERMAL */
-    sysbus_realize(SYS_BUS_DEVICE(&s->thermal), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->thermal), errp)) {
         return;
     }
     memory_region_add_subregion(&s->peri_mr, THERMAL_OFFSET,
                 sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->thermal), 0));
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
 
@@ -355,9 +329,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->gpio), "sd-bus");
 
     /* Mphi */
-    sysbus_realize(SYS_BUS_DEVICE(&s->mphi), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mphi), errp)) {
         return;
     }
 
@@ -368,9 +340,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_HOSTPORT));
 
     /* DWC2 */
-    sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), errp)) {
         return;
     }
 
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index ed1793f7b7..51d156f0c5 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -86,9 +86,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
 
     object_property_add_const_link(OBJECT(&s->peripherals), "ram", obj);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), errp)) {
         return;
     }
 
@@ -99,9 +97,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
                             info->peri_base, 1);
 
     /* bcm2836 interrupt controller (and mailboxes, etc.) */
-    sysbus_realize(SYS_BUS_DEVICE(&s->control), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->control), errp)) {
         return;
     }
 
@@ -133,9 +129,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
             return;
         }
 
-        qdev_realize(DEVICE(&s->cpu[n].core), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[n].core), NULL, errp)) {
             return;
         }
 
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 5cbd115c53..c720e24ced 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -80,8 +80,7 @@ static void cubieboard_init(MachineState *machine)
         exit(1);
     }
 
-    qdev_realize(DEVICE(a10), NULL, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(a10), NULL, &err)) {
         error_reportf_err(err, "Couldn't realize Allwinner A10: ");
         exit(1);
     }
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index 13a83f7430..9fbb2258c9 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -62,16 +62,12 @@ static void digic_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
     for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
 
@@ -80,9 +76,7 @@ static void digic_realize(DeviceState *dev, Error **errp)
     }
 
     qdev_prop_set_chr(DEVICE(&s->uart), "chardev", serial_hd(0));
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
         return;
     }
 
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index b6452d918c..d5524d3e72 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -62,8 +62,7 @@ static void digic4_board_init(MachineState *machine, DigicBoard *board)
         exit(EXIT_FAILURE);
     }
 
-    qdev_realize(DEVICE(s), NULL, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(s), NULL, &err)) {
         error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
         exit(1);
     }
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
index 7ab5c98fbe..f5418c8c12 100644
--- a/hw/arm/fsl-imx25.c
+++ b/hw/arm/fsl-imx25.c
@@ -85,15 +85,11 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
     uint8_t i;
     Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX25_AVIC_ADDR);
@@ -102,9 +98,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX25_CCM_ADDR);
@@ -124,9 +118,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);
@@ -149,9 +141,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         s->gpt[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, gpt_table[i].addr);
@@ -172,9 +162,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0, epit_table[i].addr);
@@ -185,18 +173,14 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
     qdev_set_nic_properties(DEVICE(&s->fec), &nd_table[0]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->fec), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fec), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fec), 0, FSL_IMX25_FEC_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->fec), 0,
                        qdev_get_gpio_in(DEVICE(&s->avic), FSL_IMX25_FEC_IRQ));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->rngc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rngc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rngc), 0, FSL_IMX25_RNGC_ADDR);
@@ -214,9 +198,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             { FSL_IMX25_I2C3_ADDR, FSL_IMX25_I2C3_IRQ }
         };
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, i2c_table[i].addr);
@@ -237,9 +219,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
         };
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
@@ -267,9 +247,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
         object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
                                  "vendor",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
index 42cca529c3..8326f5ff81 100644
--- a/hw/arm/fsl-imx31.c
+++ b/hw/arm/fsl-imx31.c
@@ -66,15 +66,11 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
     uint16_t i;
     Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX31_AVIC_ADDR);
@@ -83,9 +79,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX31_CCM_ADDR);
@@ -102,9 +96,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
 
@@ -116,9 +108,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
     s->gpt.ccm = IMX_CCM(&s->ccm);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
         return;
     }
 
@@ -138,9 +128,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
             return;
         }
 
@@ -162,9 +150,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
         };
 
         /* Initialize the I2C */
-        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
             return;
         }
         /* Map I2C memory */
@@ -188,9 +174,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         object_property_set_bool(OBJECT(&s->gpio[i]), false, "has-edge-sel",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 4ae3c3efc2..4c2da277ec 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -130,9 +130,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                                      "start-powered-off", &error_abort);
         }
 
-        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -144,9 +142,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                             FSL_IMX6_MAX_IRQ + GIC_INTERNAL, "num-irq",
                             &error_abort);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->a9mpcore), 0, FSL_IMX6_A9MPCORE_ADDR);
@@ -158,16 +154,12 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                            qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_FIQ));
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX6_CCM_ADDR);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->src), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->src), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->src), 0, FSL_IMX6_SRC_ADDR);
@@ -187,9 +179,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
 
@@ -201,9 +191,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
     s->gpt.ccm = IMX_CCM(&s->ccm);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
         return;
     }
 
@@ -224,9 +212,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
             return;
         }
 
@@ -247,9 +233,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
             { FSL_IMX6_I2C3_ADDR, FSL_IMX6_I2C3_IRQ }
         };
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
             return;
         }
 
@@ -307,9 +291,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                                  &error_abort);
         object_property_set_bool(OBJECT(&s->gpio[i]), true, "has-upper-pin-irq",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
         }
 
@@ -343,9 +325,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
         object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
                                  "vendor",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
@@ -390,9 +370,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
         };
 
         /* Initialize the SPI */
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
 
@@ -403,9 +381,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
     }
 
     qdev_set_nic_properties(DEVICE(&s->eth), &nd_table[0]);
-    sysbus_realize(SYS_BUS_DEVICE(&s->eth), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->eth), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth), 0, FSL_IMX6_ENET_ADDR);
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
index 3235c76194..b6143fba92 100644
--- a/hw/arm/msf2-soc.c
+++ b/hw/arm/msf2-soc.c
@@ -93,7 +93,6 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     MSF2State *s = MSF2_SOC(dev_soc);
     DeviceState *dev, *armv7m;
     SysBusDevice *busdev;
-    Error *err = NULL;
     int i;
 
     MemoryRegion *system_memory = get_system_memory();
@@ -125,9 +124,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
     object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
                                      "memory", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
 
@@ -153,9 +150,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     dev = DEVICE(&s->timer);
     /* APB0 clock is the timer input clock */
     qdev_prop_set_uint32(dev, "clock-frequency", s->m3clk / s->apb0div);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -168,9 +163,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     dev = DEVICE(&s->sysreg);
     qdev_prop_set_uint32(dev, "apb0divisor", s->apb0div);
     qdev_prop_set_uint32(dev, "apb1divisor", s->apb1div);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -179,9 +172,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < MSF2_NUM_SPIS; i++) {
         gchar *bus_name;
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
 
@@ -199,9 +190,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     dev = DEVICE(&s->emac);
     object_property_set_link(OBJECT(&s->emac), OBJECT(get_system_memory()),
                              "ahb-bus", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
index 20dd8b5897..a398bdfab8 100644
--- a/hw/arm/nrf51_soc.c
+++ b/hw/arm/nrf51_soc.c
@@ -67,9 +67,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
 
     object_property_set_link(OBJECT(&s->cpu), OBJECT(&s->container), "memory",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->cpu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
         return;
     }
 
@@ -84,9 +82,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
     memory_region_add_subregion(&s->container, NRF51_SRAM_BASE, &s->sram);
 
     /* UART */
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
         return;
     }
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->uart), 0);
@@ -96,9 +92,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
                        BASE_TO_IRQ(NRF51_UART_BASE)));
 
     /* RNG */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
         return;
     }
 
@@ -116,9 +110,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->nvm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvm), errp)) {
         return;
     }
 
@@ -132,9 +124,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
     memory_region_add_subregion_overlap(&s->container, NRF51_FLASH_BASE, mr, 0);
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
 
@@ -151,9 +141,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
 
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
index 56aef686c9..5b008722e5 100644
--- a/hw/arm/stm32f205_soc.c
+++ b/hw/arm/stm32f205_soc.c
@@ -81,7 +81,6 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     STM32F205State *s = STM32F205_SOC(dev_soc);
     DeviceState *dev, *armv7m;
     SysBusDevice *busdev;
-    Error *err = NULL;
     int i;
 
     MemoryRegion *system_memory = get_system_memory();
@@ -107,17 +106,13 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
     object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
                                      "memory", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
 
     /* System configuration controller */
     dev = DEVICE(&s->syscfg);
-    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -128,9 +123,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_USARTS; i++) {
         dev = DEVICE(&(s->usart[i]));
         qdev_prop_set_chr(dev, "chardev", serial_hd(i));
-        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -142,9 +135,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_TIMERS; i++) {
         dev = DEVICE(&(s->timer[i]));
         qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -155,9 +146,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     /* ADC 1 to 3 */
     object_property_set_int(OBJECT(s->adc_irqs), STM_NUM_ADCS,
                             "num-lines", &error_abort);
-    qdev_realize(DEVICE(s->adc_irqs), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(s->adc_irqs), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(s->adc_irqs), 0,
@@ -165,9 +154,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
 
     for (i = 0; i < STM_NUM_ADCS; i++) {
         dev = DEVICE(&(s->adc[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -179,9 +166,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     /* SPI 1 and 2 */
     for (i = 0; i < STM_NUM_SPIS; i++) {
         dev = DEVICE(&(s->spi[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
index cf9228d8e7..48b7181665 100644
--- a/hw/arm/stm32f405_soc.c
+++ b/hw/arm/stm32f405_soc.c
@@ -118,17 +118,13 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
     object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory),
                                      "memory", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
 
     /* System configuration controller */
     dev = DEVICE(&s->syscfg);
-    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -139,9 +135,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_USARTS; i++) {
         dev = DEVICE(&(s->usart[i]));
         qdev_prop_set_chr(dev, "chardev", serial_hd(i));
-        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -153,9 +147,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_TIMERS; i++) {
         dev = DEVICE(&(s->timer[i]));
         qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -173,9 +165,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     }
     object_property_set_int(OBJECT(&s->adc_irqs), STM_NUM_ADCS,
                             "num-lines", &error_abort);
-    qdev_realize(DEVICE(&s->adc_irqs), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->adc_irqs), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->adc_irqs), 0,
@@ -183,9 +173,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
 
     for (i = 0; i < STM_NUM_ADCS; i++) {
         dev = DEVICE(&(s->adc[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -197,9 +185,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     /* SPI devices */
     for (i = 0; i < STM_NUM_SPIS; i++) {
         dev = DEVICE(&(s->spi[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -209,9 +195,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
 
     /* EXTI device */
     dev = DEVICE(&s->exti);
-    sysbus_realize(SYS_BUS_DEVICE(&s->exti), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->exti), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 1de9d4a89d..33e63a2c4e 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -176,7 +176,6 @@ static inline int arm_gic_ppi_index(int cpu_nr, int ppi_index)
 static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
                                    const char *boot_cpu, Error **errp)
 {
-    Error *err = NULL;
     int i;
     int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS,
                        XLNX_ZYNQMP_NUM_RPU_CPUS);
@@ -209,9 +208,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
 
         object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs",
                                  &error_abort);
-        qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -367,16 +364,12 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
                                 "reset-cbar", &error_abort);
         object_property_set_int(OBJECT(&s->apu_cpu[i]), num_apus,
                                 "core-count", &error_abort);
-        qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, errp)) {
             return;
         }
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
 
@@ -470,9 +463,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
                                 &error_abort);
         object_property_set_int(OBJECT(&s->gem[i]), 2, "num-priority-queues",
                                 &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem[i]), 0, gem_addr[i]);
@@ -482,9 +473,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_UARTS; i++) {
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, uart_addr[i]);
@@ -494,9 +483,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
 
     object_property_set_int(OBJECT(&s->sata), SATA_NUM_PORTS, "num-ports",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
         return;
     }
 
@@ -528,9 +515,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        sysbus_realize(SYS_BUS_DEVICE(sdhci), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(sdhci), errp)) {
             return;
         }
         sysbus_mmio_map(sbd, 0, sdhci_addr[i]);
@@ -545,9 +530,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < XLNX_ZYNQMP_NUM_SPIS; i++) {
         gchar *bus_name;
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
 
@@ -562,9 +545,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
         g_free(bus_name);
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->qspi), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->qspi), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
@@ -584,17 +565,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
         g_free(target_bus);
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->dp), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dp), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->dp), 0, DP_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dp), 0, gic_spi[DP_IRQ]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), errp)) {
         return;
     }
     object_property_set_link(OBJECT(&s->dp), OBJECT(&s->dpdma), "dpdma",
@@ -602,17 +579,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->dpdma), 0, DPDMA_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dpdma), 0, gic_spi[DPDMA_IRQ]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ipi), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ipi), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ipi), 0, IPI_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->ipi), 0, gic_spi[IPI_IRQ]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, RTC_ADDR);
@@ -624,9 +597,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), errp)) {
             return;
         }
 
@@ -636,9 +607,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     }
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_ADMA_CH; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), errp)) {
             return;
         }
 
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index f4493d6afa..fe0ae2d146 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -2574,9 +2574,7 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
             return;
         }
 
-        qdev_realize_and_unref(dev, &fdctrl->bus.bus, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize_and_unref(dev, &fdctrl->bus.bus, errp)) {
             return;
         }
     }
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 1b7bc5de08..10c44dfda2 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -961,8 +961,7 @@ static void xen_block_device_create(XenBackendInstance *backend,
     blockdev->iothread = iothread;
     blockdev->drive = drive;
 
-    qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err);
-    if (local_err) {
+    if (!qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err)) {
         error_propagate_prepend(errp, local_err,
                                 "realization of device %s failed: ",
                                 type);
diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index 56f915e7c9..2cf3e44177 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -95,7 +95,6 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
     SerialState *s;
-    Error *err = NULL;
     size_t i, nports = multi_serial_get_port_count(pc);
 
     pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
@@ -106,9 +105,7 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
 
     for (i = 0; i < nports; i++) {
         s = pci->state + i;
-        qdev_realize(DEVICE(s), NULL, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(s), NULL, errp)) {
             multi_serial_pci_exit(dev);
             return;
         }
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 298f3adba7..cd56924a43 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -47,11 +47,8 @@ static void serial_pci_realize(PCIDevice *dev, Error **errp)
 {
     PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
     SerialState *s = &pci->state;
-    Error *err = NULL;
 
-    qdev_realize(DEVICE(s), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(s), NULL, errp)) {
         return;
     }
 
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 9eebcb27e7..2386479492 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -989,11 +989,8 @@ static void serial_io_realize(DeviceState *dev, Error **errp)
 {
     SerialIO *sio = SERIAL_IO(dev);
     SerialState *s = &sio->serial;
-    Error *local_err = NULL;
 
-    qdev_realize(DEVICE(s), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(s), NULL, errp)) {
         return;
     }
 
@@ -1096,11 +1093,8 @@ static void serial_mm_realize(DeviceState *dev, Error **errp)
 {
     SerialMM *smm = SERIAL_MM(dev);
     SerialState *s = &smm->serial;
-    Error *local_err = NULL;
 
-    qdev_realize(DEVICE(s), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(s), NULL, errp)) {
         return;
     }
 
diff --git a/hw/core/cpu.c b/hw/core/cpu.c
index 0f23409f1d..594441a150 100644
--- a/hw/core/cpu.c
+++ b/hw/core/cpu.c
@@ -59,8 +59,7 @@ CPUState *cpu_create(const char *typename)
 {
     Error *err = NULL;
     CPUState *cpu = CPU(object_new(typename));
-    qdev_realize(DEVICE(cpu), NULL, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(cpu), NULL, &err)) {
         error_report_err(err);
         object_unref(OBJECT(cpu));
         exit(EXIT_FAILURE);
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
index e6085f5d44..c377be398d 100644
--- a/hw/cpu/a15mpcore.c
+++ b/hw/cpu/a15mpcore.c
@@ -53,7 +53,6 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *gicdev;
     SysBusDevice *busdev;
     int i;
-    Error *err = NULL;
     bool has_el3;
     bool has_el2 = false;
     Object *cpuobj;
@@ -76,9 +75,7 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
         qdev_prop_set_bit(gicdev, "has-virtualization-extensions", has_el2);
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(&s->gic);
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index 642363d2f4..351295e518 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -50,16 +50,13 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *scudev, *gicdev, *gtimerdev, *mptimerdev, *wdtdev;
     SysBusDevice *scubusdev, *gicbusdev, *gtimerbusdev, *mptimerbusdev,
                  *wdtbusdev;
-    Error *err = NULL;
     int i;
     bool has_el3;
     Object *cpuobj;
 
     scudev = DEVICE(&s->scu);
     qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
     scubusdev = SYS_BUS_DEVICE(&s->scu);
@@ -78,9 +75,7 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
         object_property_get_bool(cpuobj, "has_el3", &error_abort);
     qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
     gicbusdev = SYS_BUS_DEVICE(&s->gic);
@@ -93,27 +88,21 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
 
     gtimerdev = DEVICE(&s->gtimer);
     qdev_prop_set_uint32(gtimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), errp)) {
         return;
     }
     gtimerbusdev = SYS_BUS_DEVICE(&s->gtimer);
 
     mptimerdev = DEVICE(&s->mptimer);
     qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
         return;
     }
     mptimerbusdev = SYS_BUS_DEVICE(&s->mptimer);
 
     wdtdev = DEVICE(&s->wdt);
     qdev_prop_set_uint32(wdtdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt), errp)) {
         return;
     }
     wdtbusdev = SYS_BUS_DEVICE(&s->wdt);
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
index a2afb992fb..89c4e35143 100644
--- a/hw/cpu/arm11mpcore.c
+++ b/hw/cpu/arm11mpcore.c
@@ -76,12 +76,9 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *gicdev = DEVICE(&s->gic);
     DeviceState *mptimerdev = DEVICE(&s->mptimer);
     DeviceState *wdtimerdev = DEVICE(&s->wdtimer);
-    Error *err = NULL;
 
     qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
 
@@ -91,9 +88,7 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
                          ARM11MPCORE_NUM_GIC_PRIORITY_BITS);
 
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
 
@@ -104,16 +99,12 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
     qdev_init_gpio_in(dev, mpcore_priv_set_irq, s->num_irq - 32);
 
     qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
         return;
     }
 
     qdev_prop_set_uint32(wdtimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), errp)) {
         return;
     }
 
diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
index d2e426fa45..96f4d2517a 100644
--- a/hw/cpu/realview_mpcore.c
+++ b/hw/cpu/realview_mpcore.c
@@ -65,14 +65,11 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
     DeviceState *priv = DEVICE(&s->priv);
     DeviceState *gic;
     SysBusDevice *gicbusdev;
-    Error *err = NULL;
     int n;
     int i;
 
     qdev_prop_set_uint32(priv, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->priv), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->priv), errp)) {
         return;
     }
     sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->priv));
@@ -81,9 +78,7 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
     }
     /* ??? IRQ routing is hardcoded to "normal" mode.  */
     for (n = 0; n < 4; n++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), errp)) {
             return;
         }
         gic = DEVICE(&s->gic[n]);
diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c
index 41b88b878d..93ba5956ed 100644
--- a/hw/display/virtio-gpu-pci.c
+++ b/hw/display/virtio-gpu-pci.c
@@ -31,13 +31,9 @@ static void virtio_gpu_pci_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     VirtIOGPUBase *g = vgpu->vgpu;
     DeviceState *vdev = DEVICE(g);
     int i;
-    Error *local_error = NULL;
 
     virtio_pci_force_virtio_1(vpci_dev);
-    qdev_realize(vdev, BUS(&vpci_dev->bus), &local_error);
-
-    if (local_error) {
-        error_propagate(errp, local_error);
+    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
index 67f409e106..fd550b35c8 100644
--- a/hw/display/virtio-vga.c
+++ b/hw/display/virtio-vga.c
@@ -93,7 +93,6 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     VirtIOVGABase *vvga = VIRTIO_VGA_BASE(vpci_dev);
     VirtIOGPUBase *g = vvga->vgpu;
     VGACommonState *vga = &vvga->vga;
-    Error *err = NULL;
     uint32_t offset;
     int i;
 
@@ -138,9 +137,7 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
 
     /* init virtio bits */
     virtio_pci_force_virtio_1(vpci_dev);
-    qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
index af9f4c5a85..3c4b6e6d70 100644
--- a/hw/intc/armv7m_nvic.c
+++ b/hw/intc/armv7m_nvic.c
@@ -2619,7 +2619,6 @@ static void nvic_systick_trigger(void *opaque, int n, int level)
 static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
 {
     NVICState *s = NVIC(dev);
-    Error *err = NULL;
     int regionlen;
 
     /* The armv7m container object will have set our CPU pointer */
@@ -2640,9 +2639,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
 
     s->num_prio_bits = arm_feature(&s->cpu->env, ARM_FEATURE_V7) ? 8 : 2;
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), 0,
@@ -2657,9 +2654,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
         object_initialize_child(OBJECT(dev), "systick-reg-s",
                                 &s->systick[M_REG_S], TYPE_SYSTICK);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), errp)) {
             return;
         }
         sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_S]), 0,
diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
index 85ba0b4655..7d33457e81 100644
--- a/hw/intc/pnv_xive.c
+++ b/hw/intc/pnv_xive.c
@@ -1833,9 +1833,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
 
@@ -1843,9 +1841,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
         return;
     }
 
diff --git a/hw/intc/realview_gic.c b/hw/intc/realview_gic.c
index f11fb5259a..9b12116b2a 100644
--- a/hw/intc/realview_gic.c
+++ b/hw/intc/realview_gic.c
@@ -26,7 +26,6 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     RealViewGICState *s = REALVIEW_GIC(dev);
     SysBusDevice *busdev;
-    Error *err = NULL;
     /* The GICs on the RealView boards have a fixed nonconfigurable
      * number of interrupt lines, so we don't need to expose this as
      * a qdev property.
@@ -34,9 +33,7 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
     int numirq = 96;
 
     qdev_prop_set_uint32(DEVICE(&s->gic), "num-irq", numirq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(&s->gic);
diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
index b7fc8dde7a..4e9ee90353 100644
--- a/hw/intc/spapr_xive.c
+++ b/hw/intc/spapr_xive.c
@@ -312,9 +312,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
     sysbus_init_mmio(SYS_BUS_DEVICE(xive), &xsrc->esb_mmio);
@@ -326,9 +324,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
         return;
     }
     sysbus_init_mmio(SYS_BUS_DEVICE(xive), &end_xsrc->esb_mmio);
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index d365eeca66..0d336fb033 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -376,7 +376,6 @@ static const TypeInfo icp_info = {
 
 Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
 {
-    Error *local_err = NULL;
     Object *obj;
 
     obj = object_new(type);
@@ -384,10 +383,8 @@ Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
     object_unref(obj);
     object_property_set_link(obj, OBJECT(xi), ICP_PROP_XICS, &error_abort);
     object_property_set_link(obj, cpu, ICP_PROP_CPU, &error_abort);
-    qdev_realize(DEVICE(obj), NULL, &local_err);
-    if (local_err) {
+    if (!qdev_realize(DEVICE(obj), NULL, errp)) {
         object_unparent(obj);
-        error_propagate(errp, local_err);
         obj = NULL;
     }
 
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index 2c30dc53d8..8e167306e7 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -765,8 +765,7 @@ Object *xive_tctx_create(Object *cpu, XivePresenter *xptr, Error **errp)
     object_unref(obj);
     object_property_set_link(obj, cpu, "cpu", &error_abort);
     object_property_set_link(obj, OBJECT(xptr), "presenter", &error_abort);
-    qdev_realize(DEVICE(obj), NULL, &local_err);
-    if (local_err) {
+    if (!qdev_realize(DEVICE(obj), NULL, &local_err)) {
         goto error;
     }
 
diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
index f634bcb2d1..ac044afa95 100644
--- a/hw/isa/piix4.c
+++ b/hw/isa/piix4.c
@@ -150,7 +150,6 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
     PIIX4State *s = PIIX4_PCI_DEVICE(dev);
     ISABus *isa_bus;
     qemu_irq *i8259_out_irq;
-    Error *err = NULL;
 
     isa_bus = isa_bus_new(DEVICE(dev), pci_address_space(dev),
                           pci_address_space_io(dev), errp);
@@ -183,9 +182,7 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
 
     /* RTC */
     qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000);
-    qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), errp)) {
         return;
     }
     isa_init_irq(ISA_DEVICE(&s->rtc), &s->rtc.irq, RTC_ISA_IRQ);
diff --git a/hw/microblaze/xlnx-zynqmp-pmu.c b/hw/microblaze/xlnx-zynqmp-pmu.c
index abebc7e2ef..cd4f3427d8 100644
--- a/hw/microblaze/xlnx-zynqmp-pmu.c
+++ b/hw/microblaze/xlnx-zynqmp-pmu.c
@@ -76,7 +76,6 @@ static void xlnx_zynqmp_pmu_soc_init(Object *obj)
 static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
 {
     XlnxZynqMPPMUSoCState *s = XLNX_ZYNQMP_PMU_SOC(dev);
-    Error *err = NULL;
 
     object_property_set_uint(OBJECT(&s->cpu), XLNX_ZYNQMP_PMU_ROM_ADDR,
                              "base-vectors", &error_abort);
@@ -96,9 +95,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
     object_property_set_str(OBJECT(&s->cpu), "8.40.b", "version",
                             &error_abort);
     object_property_set_uint(OBJECT(&s->cpu), 0, "pvr", &error_abort);
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
@@ -108,9 +105,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
                              &error_abort);
     object_property_set_uint(OBJECT(&s->intc), 0xffff, "intc-positive",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->intc), 0, XLNX_ZYNQMP_PMU_INTC_ADDR);
diff --git a/hw/mips/cps.c b/hw/mips/cps.c
index 0d7f3cf673..b4f2306596 100644
--- a/hw/mips/cps.c
+++ b/hw/mips/cps.c
@@ -71,7 +71,6 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
     CPUMIPSState *env;
     MIPSCPU *cpu;
     int i;
-    Error *err = NULL;
     target_ulong gcr_base;
     bool itu_present = false;
     bool saar_present = false;
@@ -109,9 +108,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
         if (saar_present) {
             s->itu.saar = &env->CP0_SAAR;
         }
-        sysbus_realize(SYS_BUS_DEVICE(&s->itu), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->itu), errp)) {
             return;
         }
 
@@ -125,9 +122,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
                             &error_abort);
     object_property_set_int(OBJECT(&s->cpc), 1, "vp-start-running",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->cpc), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpc), errp)) {
         return;
     }
 
@@ -140,9 +135,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
                             &error_abort);
     object_property_set_int(OBJECT(&s->gic), 128, "num-irq",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
 
@@ -163,9 +156,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
                              &error_abort);
     object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->cpc.mr), "cpc",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gcr), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gcr), errp)) {
         return;
     }
 
diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index 47aa3b0552..0d29d53116 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -524,13 +524,10 @@ static void cuda_reset(DeviceState *dev)
 static void cuda_realize(DeviceState *dev, Error **errp)
 {
     CUDAState *s = CUDA(dev);
-    Error *err = NULL;
     SysBusDevice *sbd;
     struct tm tm;
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), errp)) {
         return;
     }
 
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index 3251c79f46..7cfe357cc4 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -98,11 +98,8 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
 {
     MacIOState *s = MACIO(d);
     SysBusDevice *sysbus_dev;
-    Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&s->dbdma);
@@ -116,9 +113,7 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
     qdev_prop_set_chr(DEVICE(&s->escc), "chrB", serial_hd(1));
     qdev_prop_set_uint32(DEVICE(&s->escc), "chnBtype", escc_serial);
     qdev_prop_set_uint32(DEVICE(&s->escc), "chnAtype", escc_serial);
-    qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), errp)) {
         return;
     }
 
@@ -159,9 +154,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
 
     qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
                          s->frequency);
-    qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
@@ -176,9 +169,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
     sysbus_connect_irq(sysbus_dev, 1, qdev_get_gpio_in(pic_dev,
                                                        OLDWORLD_ESCCA_IRQ));
 
-    qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&os->nvram);
@@ -345,9 +336,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
         object_property_set_link(OBJECT(&s->pmu), OBJECT(sysbus_dev), "gpio",
                                  &error_abort);
         qdev_prop_set_bit(DEVICE(&s->pmu), "has-adb", ns->has_adb);
-        qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), errp)) {
             return;
         }
         sysbus_dev = SYS_BUS_DEVICE(&s->pmu);
@@ -363,9 +352,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
         qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
                              s->frequency);
 
-        qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
             return;
         }
         sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
diff --git a/hw/misc/macio/pmu.c b/hw/misc/macio/pmu.c
index 41b626c46c..4b0983697c 100644
--- a/hw/misc/macio/pmu.c
+++ b/hw/misc/macio/pmu.c
@@ -741,13 +741,10 @@ static void pmu_reset(DeviceState *dev)
 static void pmu_realize(DeviceState *dev, Error **errp)
 {
     PMUState *s = VIA_PMU(dev);
-    Error *err = NULL;
     SysBusDevice *sbd;
     struct tm tm;
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), errp)) {
         return;
     }
 
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index 3ec904a55f..d85ca709d9 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -990,7 +990,6 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
     PnvPHB3 *phb = PNV_PHB3(dev);
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
-    Error *local_err = NULL;
     int i;
 
     if (phb->phb_id >= PNV8_CHIP_PHB3_MAX) {
@@ -1003,9 +1002,7 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
                                    &error_abort);
     object_property_set_int(OBJECT(&phb->lsis), PNV_PHB3_NUM_LSI, "nr-irqs",
                             &error_abort);
-    qdev_realize(DEVICE(&phb->lsis), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&phb->lsis), NULL, errp)) {
         return;
     }
 
@@ -1022,18 +1019,14 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
                                    &error_abort);
     object_property_set_int(OBJECT(&phb->msis), PHB3_MAX_MSI, "nr-irqs",
                             &error_abort);
-    qdev_realize(DEVICE(&phb->msis), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&phb->msis), NULL, errp)) {
         return;
     }
 
     /* Power Bus Common Queue */
     object_property_set_link(OBJECT(&phb->pbcq), OBJECT(phb), "phb",
                                    &error_abort);
-    qdev_realize(DEVICE(&phb->pbcq), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&phb->pbcq), NULL, errp)) {
         return;
     }
 
diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
index 10716d759d..7739fd5984 100644
--- a/hw/pci-host/pnv_phb4.c
+++ b/hw/pci-host/pnv_phb4.c
@@ -1169,7 +1169,6 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
     PnvPHB4 *phb = PNV_PHB4(dev);
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     XiveSource *xsrc = &phb->xsrc;
-    Error *local_err = NULL;
     int nr_irqs;
     char name[32];
 
@@ -1218,9 +1217,7 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
     }
     object_property_set_int(OBJECT(xsrc), nr_irqs, "nr-irqs", &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(phb), "xive", &error_fatal);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
 
diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
index 2d634c838e..40f993bd06 100644
--- a/hw/pci-host/pnv_phb4_pec.c
+++ b/hw/pci-host/pnv_phb4_pec.c
@@ -377,7 +377,6 @@ static void pnv_pec_instance_init(Object *obj)
 static void pnv_pec_realize(DeviceState *dev, Error **errp)
 {
     PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
-    Error *local_err = NULL;
     char name[64];
     int i;
 
@@ -390,9 +389,7 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
 
         object_property_set_int(stk_obj, i, "stack-no", &error_abort);
         object_property_set_link(stk_obj, OBJECT(pec), "pec", &error_abort);
-        qdev_realize(DEVICE(stk_obj), NULL, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
             return;
         }
     }
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 51bf95b303..5448d101d9 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -764,16 +764,13 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
 static DeviceState *ppce500_init_mpic_kvm(const PPCE500MachineClass *pmc,
                                           IrqLines *irqs, Error **errp)
 {
-    Error *err = NULL;
     DeviceState *dev;
     CPUState *cs;
 
     dev = qdev_new(TYPE_KVM_OPENPIC);
     qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
 
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 8bd03f3b10..392aa138de 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1137,9 +1137,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
                             "bar", &error_fatal);
     object_property_set_link(OBJECT(&chip8->psi), OBJECT(chip8->xics),
                              ICS_PROP_XICS, &error_abort);
-    qdev_realize(DEVICE(&chip8->psi), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip8->psi), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE,
@@ -1168,9 +1166,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
     /* Create the simplified OCC model */
     object_property_set_link(OBJECT(&chip8->occ), OBJECT(&chip8->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip8->occ), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip8->occ), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip8->occ.xscom_regs);
@@ -1182,9 +1178,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
     /* HOMER */
     object_property_set_link(OBJECT(&chip8->homer), OBJECT(chip), "chip",
                              &error_abort);
-    qdev_realize(DEVICE(&chip8->homer), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip8->homer), NULL, errp)) {
         return;
     }
     /* Homer Xscom region */
@@ -1202,9 +1196,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
         object_property_set_int(OBJECT(phb), i, "index", &error_fatal);
         object_property_set_int(OBJECT(phb), chip->chip_id, "chip-id",
                                 &error_fatal);
-        sysbus_realize(SYS_BUS_DEVICE(phb), &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(phb), errp)) {
             return;
         }
 
@@ -1359,7 +1351,6 @@ static void pnv_chip_quad_realize(Pnv9Chip *chip9, Error **errp)
 static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
 {
     Pnv9Chip *chip9 = PNV9_CHIP(chip);
-    Error *local_err = NULL;
     int i, j;
     int phb_id = 0;
 
@@ -1381,9 +1372,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
                                  &error_fatal);
         object_property_set_link(OBJECT(pec), OBJECT(get_system_memory()),
                                  "system-memory", &error_abort);
-        qdev_realize(DEVICE(pec), NULL, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize(DEVICE(pec), NULL, errp)) {
             return;
         }
 
@@ -1406,9 +1395,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
             object_property_set_int(obj, PNV_PHB4_DEVICE_ID, "device-id",
                                     &error_fatal);
             object_property_set_link(obj, OBJECT(stack), "stack", &error_abort);
-            sysbus_realize(SYS_BUS_DEVICE(obj), &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
                 return;
             }
 
@@ -1466,9 +1453,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
                             "tm-bar", &error_fatal);
     object_property_set_link(OBJECT(&chip9->xive), OBJECT(chip), "chip",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE,
@@ -1477,9 +1462,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* Processor Service Interface (PSI) Host Bridge */
     object_property_set_int(OBJECT(&chip9->psi), PNV9_PSIHB_BASE(chip),
                             "bar", &error_fatal);
-    qdev_realize(DEVICE(&chip9->psi), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->psi), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE,
@@ -1488,9 +1471,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* LPC */
     object_property_set_link(OBJECT(&chip9->lpc), OBJECT(&chip9->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip9->lpc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->lpc), NULL, errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), PNV9_LPCM_BASE(chip),
@@ -1502,9 +1483,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* Create the simplified OCC model */
     object_property_set_link(OBJECT(&chip9->occ), OBJECT(&chip9->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip9->occ), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->occ), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_OCC_BASE, &chip9->occ.xscom_regs);
@@ -1516,9 +1495,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* HOMER */
     object_property_set_link(OBJECT(&chip9->homer), OBJECT(chip), "chip",
                              &error_abort);
-    qdev_realize(DEVICE(&chip9->homer), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->homer), NULL, errp)) {
         return;
     }
     /* Homer Xscom region */
@@ -1598,9 +1575,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
     /* Processor Service Interface (PSI) Host Bridge */
     object_property_set_int(OBJECT(&chip10->psi), PNV10_PSIHB_BASE(chip),
                             "bar", &error_fatal);
-    qdev_realize(DEVICE(&chip10->psi), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip10->psi), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV10_XSCOM_PSIHB_BASE,
@@ -1609,9 +1584,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
     /* LPC */
     object_property_set_link(OBJECT(&chip10->lpc), OBJECT(&chip10->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip10->lpc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip10->lpc), NULL, errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), PNV10_LPCM_BASE(chip),
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index c986c16db1..4724ddf96c 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -173,9 +173,7 @@ static void pnv_core_cpu_realize(PnvCore *pc, PowerPCCPU *cpu, Error **errp)
     Error *local_err = NULL;
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(pc->chip);
 
-    qdev_realize(DEVICE(cpu), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
         return;
     }
 
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 75b8ae9703..08756a79cd 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -510,9 +510,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(ics), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(ics), NULL, errp)) {
         return;
     }
 
@@ -842,7 +840,6 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
 {
     PnvPsi *psi = PNV_PSI(dev);
     XiveSource *xsrc = &PNV9_PSI(psi)->source;
-    Error *local_err = NULL;
     int i;
 
     /* This is the only device with 4k ESB pages */
@@ -851,9 +848,7 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
     object_property_set_int(OBJECT(xsrc), PSIHB9_NUM_IRQS, "nr-irqs",
                             &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(psi), "xive", &error_abort);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
 
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 26ad566f42..85330d08a1 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -239,8 +239,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
     CPUState *cs = CPU(cpu);
     Error *local_err = NULL;
 
-    qdev_realize(DEVICE(cpu), NULL, &local_err);
-    if (local_err) {
+    if (!qdev_realize(DEVICE(cpu), NULL, &local_err)) {
         goto error;
     }
 
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index 897bf98587..a61d39ad71 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -302,7 +302,6 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
     spapr_irq_msi_init(spapr);
 
     if (spapr->irq->xics) {
-        Error *local_err = NULL;
         Object *obj;
 
         obj = object_new(TYPE_ICS_SPAPR);
@@ -311,9 +310,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
         object_property_set_link(obj, OBJECT(spapr), ICS_PROP_XICS,
                                  &error_abort);
         object_property_set_int(obj, smc->nr_xirqs, "nr-irqs", &error_abort);
-        qdev_realize(DEVICE(obj), NULL, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize(DEVICE(obj), NULL, errp)) {
             return;
         }
 
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
index 19223e4c29..d40f065a6a 100644
--- a/hw/riscv/opentitan.c
+++ b/hw/riscv/opentitan.c
@@ -106,7 +106,6 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
     MachineState *ms = MACHINE(qdev_get_machine());
     LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
     MemoryRegion *sys_mem = get_system_memory();
-    Error *err = NULL;
 
     object_property_set_str(OBJECT(&s->cpus), ms->cpu_type, "cpu-type",
                             &error_abort);
@@ -127,18 +126,14 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
                                 &s->flash_mem);
 
     /* PLIC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->plic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->plic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0, memmap[IBEX_PLIC].base);
 
     /* UART */
     qdev_prop_set_chr(DEVICE(&(s->uart)), "chardev", serial_hd(0));
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart), 0, memmap[IBEX_UART].base);
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 0cb66ac4e2..416adfcce0 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -185,8 +185,6 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
 {
     MachineState *ms = MACHINE(qdev_get_machine());
     const struct MemmapEntry *memmap = sifive_e_memmap;
-    Error *err = NULL;
-
     SiFiveESoCState *s = RISCV_E_SOC(dev);
     MemoryRegion *sys_mem = get_system_memory();
 
@@ -221,9 +219,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
 
     /* GPIO */
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
 
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index a1d2edfe13..12cd91b227 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -608,7 +608,6 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
     char *plic_hart_config;
     size_t plic_hart_config_len;
     int i;
-    Error *err = NULL;
     NICInfo *nd = &nd_table[0];
 
     sysbus_realize(SYS_BUS_DEVICE(&s->e_cpus), &error_abort);
@@ -710,9 +709,7 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
     }
     object_property_set_int(OBJECT(&s->gem), GEM_REVISION, "revision",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gem), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem), 0, memmap[SIFIVE_U_GEM].base);
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 164b1fd295..645b4080c5 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -442,18 +442,13 @@ static void init_event_facility(Object *obj)
 static void realize_event_facility(DeviceState *dev, Error **errp)
 {
     SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
-    Error *local_err = NULL;
 
-    qdev_realize(DEVICE(&event_facility->quiesce),
-                 BUS(&event_facility->sbus), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&event_facility->quiesce),
+                      BUS(&event_facility->sbus), errp)) {
         return;
     }
-    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
-                 BUS(&event_facility->sbus), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
+                      BUS(&event_facility->sbus), errp)) {
         qdev_unrealize(DEVICE(&event_facility->quiesce));
         return;
     }
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 142e52a8ff..0517901024 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -829,8 +829,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
                                 "zPCI device could not be created: ");
         return NULL;
     }
-    qdev_realize_and_unref(dev, BUS(s->bus), &local_err);
-    if (local_err) {
+    if (!qdev_realize_and_unref(dev, BUS(s->bus), &local_err)) {
         object_unparent(OBJECT(dev));
         error_propagate_prepend(errp, local_err,
                                 "zPCI device could not be created: ");
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index d39f6d7785..03364343eb 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -338,8 +338,7 @@ static void sclp_realize(DeviceState *dev, Error **errp)
      * as we can't find a fitting bus via the qom tree, we have to add the
      * event facility to the sysbus, so e.g. a sclp console can be created.
      */
-    sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err);
-    if (err) {
+    if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err)) {
         goto out;
     }
 
diff --git a/hw/s390x/virtio-ccw-crypto.c b/hw/s390x/virtio-ccw-crypto.c
index ca6753bff3..438626cf37 100644
--- a/hw/s390x/virtio-ccw-crypto.c
+++ b/hw/s390x/virtio-ccw-crypto.c
@@ -19,11 +19,8 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 {
     VirtIOCryptoCcw *dev = VIRTIO_CRYPTO_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
-    Error *err = NULL;
 
-    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/s390x/virtio-ccw-rng.c b/hw/s390x/virtio-ccw-rng.c
index 4077160f49..aefe6b1b51 100644
--- a/hw/s390x/virtio-ccw-rng.c
+++ b/hw/s390x/virtio-ccw-rng.c
@@ -20,11 +20,8 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 {
     VirtIORNGCcw *dev = VIRTIO_RNG_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
-    Error *err = NULL;
 
-    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index b878a08080..f3d2d63de8 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -293,9 +293,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
     qdev_prop_set_enum(dev, "rerror", rerror);
     qdev_prop_set_enum(dev, "werror", werror);
 
-    qdev_realize_and_unref(dev, &bus->qbus, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
index 538d3bad3d..ad0bb6fdb4 100644
--- a/hw/sd/aspeed_sdhci.c
+++ b/hw/sd/aspeed_sdhci.c
@@ -145,9 +145,7 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
             return;
         }
 
-        sysbus_realize(sbd_slot, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(sbd_slot, errp)) {
             return;
         }
 
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index 25cec2ddea..0df0edb51d 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -266,8 +266,7 @@ static void ssi_sd_realize(SSISlave *d, Error **errp)
         goto fail;
     }
 
-    qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err);
-    if (err) {
+    if (!qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err)) {
         goto fail;
     }
 
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 957559b18d..ba27afe9f2 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -704,8 +704,7 @@ USBDevice *usbdevice_create(const char *cmdline)
         error_report("Failed to create USB device '%s'", f->name);
         return NULL;
     }
-    usb_realize_and_unref(dev, bus, &err);
-    if (err) {
+    if (!usb_realize_and_unref(dev, bus, &err)) {
         error_reportf_err(err, "Failed to initialize USB device '%s': ",
                           f->name);
         object_unparent(OBJECT(dev));
diff --git a/hw/virtio/virtio-rng-pci.c b/hw/virtio/virtio-rng-pci.c
index cf1afb47a6..b6cb0199a3 100644
--- a/hw/virtio/virtio-rng-pci.c
+++ b/hw/virtio/virtio-rng-pci.c
@@ -34,11 +34,8 @@ static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
 {
     VirtIORngPCI *vrng = VIRTIO_RNG_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&vrng->vdev);
-    Error *err = NULL;
 
-    qdev_realize(vdev, BUS(&vpci_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
         return;
     }
 
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 22da107484..13a13a811a 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -676,8 +676,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
     }
 
     dev->opts = opts;
-    qdev_realize(DEVICE(dev), bus, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(dev), bus, &err)) {
         dev->opts = NULL;
         goto err_del_dev;
     }
-- 
2.26.2


Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Vladimir Sementsov-Ogievskiy 5 years, 5 months ago
24.06.2020 19:43, Markus Armbruster wrote:
> Convert
> 
>      foo(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      if (!foo(..., &err)) {
>          ...
>      }
> 
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:

Please, also mention a command to run the script

> 
>      @@
>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>      expression list args, args2;
>      typedef Error;
>      Error *err;
>      identifier errp;
>      @@
>      -      fun(args, &err, args2);
>      -      if (err) {
>      +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>      -	   error_propagate(errp, err);
> 	       ...
> 	   }
> 
>      @@
>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>      expression list args, args2;
>      typedef Error;
>      Error *err;
>      @@
>      -      fun(args, &err, args2);
>      -      if (err) {
>      +      if (!fun(args, &err, args2)) {
> 	       ...
> 	   }
> 
> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.
> 
> Signed-off-by: Markus Armbruster<armbru@redhat.com>
> ---
>   hw/arm/allwinner-a10.c          |  21 ++-----
>   hw/arm/armsse.c                 | 104 ++++++++------------------------
>   hw/arm/armv7m.c                 |  12 +---
>   hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>   hw/arm/aspeed_soc.c             |  60 +++++-------------
>   hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>   hw/arm/bcm2836.c                |  12 +---
>   hw/arm/cubieboard.c             |   3 +-
>   hw/arm/digic.c                  |  12 +---
>   hw/arm/digic_boards.c           |   3 +-
>   hw/arm/fsl-imx25.c              |  44 ++++----------
>   hw/arm/fsl-imx31.c              |  32 +++-------
>   hw/arm/fsl-imx6.c               |  48 ++++-----------
>   hw/arm/msf2-soc.c               |  21 ++-----
>   hw/arm/nrf51_soc.c              |  24 ++------
>   hw/arm/stm32f205_soc.c          |  29 +++------
>   hw/arm/stm32f405_soc.c          |  32 +++-------
>   hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>   hw/block/fdc.c                  |   4 +-
>   hw/block/xen-block.c            |   3 +-
>   hw/char/serial-pci-multi.c      |   5 +-
>   hw/char/serial-pci.c            |   5 +-
>   hw/char/serial.c                |  10 +--
>   hw/core/cpu.c                   |   3 +-
>   hw/cpu/a15mpcore.c              |   5 +-
>   hw/cpu/a9mpcore.c               |  21 ++-----
>   hw/cpu/arm11mpcore.c            |  17 ++----
>   hw/cpu/realview_mpcore.c        |   9 +--
>   hw/display/virtio-gpu-pci.c     |   6 +-
>   hw/display/virtio-vga.c         |   5 +-
>   hw/intc/armv7m_nvic.c           |   9 +--
>   hw/intc/pnv_xive.c              |   8 +--
>   hw/intc/realview_gic.c          |   5 +-
>   hw/intc/spapr_xive.c            |   8 +--
>   hw/intc/xics.c                  |   5 +-
>   hw/intc/xive.c                  |   3 +-
>   hw/isa/piix4.c                  |   5 +-
>   hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>   hw/mips/cps.c                   |  17 ++----
>   hw/misc/macio/cuda.c            |   5 +-
>   hw/misc/macio/macio.c           |  25 ++------
>   hw/misc/macio/pmu.c             |   5 +-
>   hw/pci-host/pnv_phb3.c          |  13 +---
>   hw/pci-host/pnv_phb4.c          |   5 +-
>   hw/pci-host/pnv_phb4_pec.c      |   5 +-
>   hw/ppc/e500.c                   |   5 +-
>   hw/ppc/pnv.c                    |  53 ++++------------
>   hw/ppc/pnv_core.c               |   4 +-
>   hw/ppc/pnv_psi.c                |   9 +--
>   hw/ppc/spapr_cpu_core.c         |   3 +-
>   hw/ppc/spapr_irq.c              |   5 +-
>   hw/riscv/opentitan.c            |   9 +--
>   hw/riscv/sifive_e.c             |   6 +-
>   hw/riscv/sifive_u.c             |   5 +-
>   hw/s390x/event-facility.c       |  13 ++--
>   hw/s390x/s390-pci-bus.c         |   3 +-
>   hw/s390x/sclp.c                 |   3 +-
>   hw/s390x/virtio-ccw-crypto.c    |   5 +-
>   hw/s390x/virtio-ccw-rng.c       |   5 +-
>   hw/scsi/scsi-bus.c              |   4 +-
>   hw/sd/aspeed_sdhci.c            |   4 +-
>   hw/sd/ssi-sd.c                  |   3 +-
>   hw/usb/bus.c                    |   3 +-
>   hw/virtio/virtio-rng-pci.c      |   5 +-
>   qdev-monitor.c                  |   3 +-
>  65 files changed, 248 insertions(+), 768 deletions(-)

Almost all of this diff-stat may be generated by more obvious script:

@rule1@
identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
expression list args;
typedef Error;
Error *err;
identifier errp;
@@

-      fun(args, &err);
-      if (err)
+      if (!fun(args, errp))
        {
-              error_propagate(errp, err);
            return;
        }

@depends on rule1@
identifier err;
@@

-    Error *err = NULL;
      ... when != err


===
Script started by command
spatch --sp-file x.cocci --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff --max-width 80 --use-gitgrep hw

You see, I consider only obvious case, where we have only error_propagate + return in the if. I suggest to make a separate generated patch, based on my cocci script (it's mostly yours, actually), and as a second patch - the remaining of your patch. I do think that this will simplify the review.

diffstat generated by my cocci script:
  50 files changed, 230 insertions(+), 725 deletions(-)

Difference with your patch, considering only files, touched by new script is very small:

[root@kvm error-smooth-my-try]# git diff --name-only | xargs git diff bbdd4596d3e3290 --
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 416adfcce0..cacfcbac54 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -185,6 +185,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
  {
      MachineState *ms = MACHINE(qdev_get_machine());
      const struct MemmapEntry *memmap = sifive_e_memmap;
+
      SiFiveESoCState *s = RISCV_E_SOC(dev);
      MemoryRegion *sys_mem = get_system_memory();
  
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 645b4080c5..32ff015c2c 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -442,13 +442,15 @@ static void init_event_facility(Object *obj)
  static void realize_event_facility(DeviceState *dev, Error **errp)
  {
      SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
+    Error *local_err = NULL;
  
-    if (!qdev_realize(DEVICE(&event_facility->quiesce),
-                      BUS(&event_facility->sbus), errp)) {
+    if (!qdev_realize(DEVICE(&event_facility->quiesce), BUS(&event_facility->sbus), errp)) {
          return;
      }
-    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
-                      BUS(&event_facility->sbus), errp)) {
+    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
+                 BUS(&event_facility->sbus), &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
          qdev_unrealize(DEVICE(&event_facility->quiesce));
          return;
      }



- Hmm, strange, "--max-width 80" doesn't help. So, we may keep the patch fully-generated with only one over-80 line, or write in commit message that the only manual fix is one over-80 line wrapping in hw/s390x/event-facility.c


-- 
Best regards,
Vladimir

Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Markus Armbruster 5 years, 5 months ago
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> Convert
>>
>>      foo(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      if (!foo(..., &err)) {
>>          ...
>>      }
>>
>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>> Coccinelle script:
>
> Please, also mention a command to run the script
>
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      identifier errp;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, errp, args2)) {
>> 	       ... when != err
>>      -	   error_propagate(errp, err);
>> 	       ...
>> 	   }
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, &err, args2)) {
>> 	       ...
>> 	   }
>>
>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>> ARMSSE being used both as typedef and function-like macro there.
>> Convert manually.
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.  Clean up whitespace.
>>
>> Signed-off-by: Markus Armbruster<armbru@redhat.com>
>> ---
[...]
>>  65 files changed, 248 insertions(+), 768 deletions(-)
>
> Almost all of this diff-stat may be generated by more obvious script:
>
> @rule1@
> identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
> expression list args;
> typedef Error;
> Error *err;
> identifier errp;
> @@
>
> -      fun(args, &err);
> -      if (err)
> +      if (!fun(args, errp))
>        {

Funny: the placement of { makes a difference.

When I use

  -      if (err) {
  +      if (!fun(args, errp)) {

out of QEMU coding style habit, I get an extra line containing only
spaces in the output.  Easy enough to clean up with sed, but putting the
brace in the place where Coccinelle doesn't produce such litter is
better.

> -              error_propagate(errp, err);
>            return;
>        }
>
[...]


Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Markus Armbruster 5 years, 5 months ago
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> Convert
>>
>>      foo(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      if (!foo(..., &err)) {
>>          ...
>>      }
>>
>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>> Coccinelle script:
>
> Please, also mention a command to run the script
>
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      identifier errp;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, errp, args2)) {
>> 	       ... when != err
>>      -	   error_propagate(errp, err);
>> 	       ...
>> 	   }
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, &err, args2)) {
>> 	       ...
>> 	   }
>>
>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>> ARMSSE being used both as typedef and function-like macro there.
>> Convert manually.
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.  Clean up whitespace.
>>
>> Signed-off-by: Markus Armbruster<armbru@redhat.com>
>> ---
>>   hw/arm/allwinner-a10.c          |  21 ++-----
>>   hw/arm/armsse.c                 | 104 ++++++++------------------------
>>   hw/arm/armv7m.c                 |  12 +---
>>   hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>>   hw/arm/aspeed_soc.c             |  60 +++++-------------
>>   hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>>   hw/arm/bcm2836.c                |  12 +---
>>   hw/arm/cubieboard.c             |   3 +-
>>   hw/arm/digic.c                  |  12 +---
>>   hw/arm/digic_boards.c           |   3 +-
>>   hw/arm/fsl-imx25.c              |  44 ++++----------
>>   hw/arm/fsl-imx31.c              |  32 +++-------
>>   hw/arm/fsl-imx6.c               |  48 ++++-----------
>>   hw/arm/msf2-soc.c               |  21 ++-----
>>   hw/arm/nrf51_soc.c              |  24 ++------
>>   hw/arm/stm32f205_soc.c          |  29 +++------
>>   hw/arm/stm32f405_soc.c          |  32 +++-------
>>   hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>>   hw/block/fdc.c                  |   4 +-
>>   hw/block/xen-block.c            |   3 +-
>>   hw/char/serial-pci-multi.c      |   5 +-
>>   hw/char/serial-pci.c            |   5 +-
>>   hw/char/serial.c                |  10 +--
>>   hw/core/cpu.c                   |   3 +-
>>   hw/cpu/a15mpcore.c              |   5 +-
>>   hw/cpu/a9mpcore.c               |  21 ++-----
>>   hw/cpu/arm11mpcore.c            |  17 ++----
>>   hw/cpu/realview_mpcore.c        |   9 +--
>>   hw/display/virtio-gpu-pci.c     |   6 +-
>>   hw/display/virtio-vga.c         |   5 +-
>>   hw/intc/armv7m_nvic.c           |   9 +--
>>   hw/intc/pnv_xive.c              |   8 +--
>>   hw/intc/realview_gic.c          |   5 +-
>>   hw/intc/spapr_xive.c            |   8 +--
>>   hw/intc/xics.c                  |   5 +-
>>   hw/intc/xive.c                  |   3 +-
>>   hw/isa/piix4.c                  |   5 +-
>>   hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>>   hw/mips/cps.c                   |  17 ++----
>>   hw/misc/macio/cuda.c            |   5 +-
>>   hw/misc/macio/macio.c           |  25 ++------
>>   hw/misc/macio/pmu.c             |   5 +-
>>   hw/pci-host/pnv_phb3.c          |  13 +---
>>   hw/pci-host/pnv_phb4.c          |   5 +-
>>   hw/pci-host/pnv_phb4_pec.c      |   5 +-
>>   hw/ppc/e500.c                   |   5 +-
>>   hw/ppc/pnv.c                    |  53 ++++------------
>>   hw/ppc/pnv_core.c               |   4 +-
>>   hw/ppc/pnv_psi.c                |   9 +--
>>   hw/ppc/spapr_cpu_core.c         |   3 +-
>>   hw/ppc/spapr_irq.c              |   5 +-
>>   hw/riscv/opentitan.c            |   9 +--
>>   hw/riscv/sifive_e.c             |   6 +-
>>   hw/riscv/sifive_u.c             |   5 +-
>>   hw/s390x/event-facility.c       |  13 ++--
>>   hw/s390x/s390-pci-bus.c         |   3 +-
>>   hw/s390x/sclp.c                 |   3 +-
>>   hw/s390x/virtio-ccw-crypto.c    |   5 +-
>>   hw/s390x/virtio-ccw-rng.c       |   5 +-
>>   hw/scsi/scsi-bus.c              |   4 +-
>>   hw/sd/aspeed_sdhci.c            |   4 +-
>>   hw/sd/ssi-sd.c                  |   3 +-
>>   hw/usb/bus.c                    |   3 +-
>>   hw/virtio/virtio-rng-pci.c      |   5 +-
>>   qdev-monitor.c                  |   3 +-
>>  65 files changed, 248 insertions(+), 768 deletions(-)
>
> Almost all of this diff-stat may be generated by more obvious script:
>
> @rule1@
> identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
> expression list args;
> typedef Error;
> Error *err;
> identifier errp;
> @@
>
> -      fun(args, &err);
> -      if (err)
> +      if (!fun(args, errp))
>        {
> -              error_propagate(errp, err);
>            return;
>        }
>
> @depends on rule1@
> identifier err;
> @@
>
> -    Error *err = NULL;
>      ... when != err
>
>
> ===
> Script started by command
> spatch --sp-file x.cocci --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff --max-width 80 --use-gitgrep hw
>
> You see, I consider only obvious case, where we have only error_propagate + return in the if. I suggest to make a separate generated patch, based on my cocci script (it's mostly yours, actually), and as a second patch - the remaining of your patch. I do think that this will simplify the review.

I can try this idea.  It's not just this patch, though, it's four more:
PATCH 17+23+38+42.

> diffstat generated by my cocci script:
>  50 files changed, 230 insertions(+), 725 deletions(-)
>
> Difference with your patch, considering only files, touched by new script is very small:
>
> [root@kvm error-smooth-my-try]# git diff --name-only | xargs git diff bbdd4596d3e3290 --
> diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
> index 416adfcce0..cacfcbac54 100644
> --- a/hw/riscv/sifive_e.c
> +++ b/hw/riscv/sifive_e.c
> @@ -185,6 +185,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
>  {
>      MachineState *ms = MACHINE(qdev_get_machine());
>      const struct MemmapEntry *memmap = sifive_e_memmap;
> +
>      SiFiveESoCState *s = RISCV_E_SOC(dev);
>      MemoryRegion *sys_mem = get_system_memory();
>  diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
> index 645b4080c5..32ff015c2c 100644
> --- a/hw/s390x/event-facility.c
> +++ b/hw/s390x/event-facility.c
> @@ -442,13 +442,15 @@ static void init_event_facility(Object *obj)
>  static void realize_event_facility(DeviceState *dev, Error **errp)
>  {
>      SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
> +    Error *local_err = NULL;
>  -    if (!qdev_realize(DEVICE(&event_facility->quiesce),
> -                      BUS(&event_facility->sbus), errp)) {
> +    if (!qdev_realize(DEVICE(&event_facility->quiesce), BUS(&event_facility->sbus), errp)) {
>          return;
>      }
> -    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> -                      BUS(&event_facility->sbus), errp)) {
> +    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> +                 BUS(&event_facility->sbus), &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
>          qdev_unrealize(DEVICE(&event_facility->quiesce));
>          return;
>      }
>
>
>
> - Hmm, strange, "--max-width 80" doesn't help. So, we may keep the patch fully-generated with only one over-80 line, or write in commit message that the only manual fix is one over-80 line wrapping in hw/s390x/event-facility.c

In my experience, I need to correct Coccinelle's spacing more often than
not.  I usually don't bother to enumerate my corrections one by one, I
only document what kind of corrections I made.


Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Markus Armbruster 5 years, 5 months ago
Markus Armbruster <armbru@redhat.com> writes:

> Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:
>
>> 24.06.2020 19:43, Markus Armbruster wrote:
>>> Convert
>>>
>>>      foo(..., &err);
>>>      if (err) {
>>>          ...
>>>      }
>>>
>>> to
>>>
>>>      if (!foo(..., &err)) {
>>>          ...
>>>      }
>>>
>>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>>> Coccinelle script:
>>
>> Please, also mention a command to run the script
>>
>>>
>>>      @@
>>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>>      expression list args, args2;
>>>      typedef Error;
>>>      Error *err;
>>>      identifier errp;
>>>      @@
>>>      -      fun(args, &err, args2);
>>>      -      if (err) {
>>>      +      if (!fun(args, errp, args2)) {
>>> 	       ... when != err
>>>      -	   error_propagate(errp, err);
>>> 	       ...
>>> 	   }
>>>
>>>      @@
>>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>>      expression list args, args2;
>>>      typedef Error;
>>>      Error *err;
>>>      @@
>>>      -      fun(args, &err, args2);
>>>      -      if (err) {
>>>      +      if (!fun(args, &err, args2)) {
>>> 	       ...
>>> 	   }
>>>
>>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>>> ARMSSE being used both as typedef and function-like macro there.
>>> Convert manually.
>>>
>>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>>> that are now unused.  Clean up whitespace.
>>>
>>> Signed-off-by: Markus Armbruster<armbru@redhat.com>
>>> ---
>>>   hw/arm/allwinner-a10.c          |  21 ++-----
>>>   hw/arm/armsse.c                 | 104 ++++++++------------------------
>>>   hw/arm/armv7m.c                 |  12 +---
>>>   hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>>>   hw/arm/aspeed_soc.c             |  60 +++++-------------
>>>   hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>>>   hw/arm/bcm2836.c                |  12 +---
>>>   hw/arm/cubieboard.c             |   3 +-
>>>   hw/arm/digic.c                  |  12 +---
>>>   hw/arm/digic_boards.c           |   3 +-
>>>   hw/arm/fsl-imx25.c              |  44 ++++----------
>>>   hw/arm/fsl-imx31.c              |  32 +++-------
>>>   hw/arm/fsl-imx6.c               |  48 ++++-----------
>>>   hw/arm/msf2-soc.c               |  21 ++-----
>>>   hw/arm/nrf51_soc.c              |  24 ++------
>>>   hw/arm/stm32f205_soc.c          |  29 +++------
>>>   hw/arm/stm32f405_soc.c          |  32 +++-------
>>>   hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>>>   hw/block/fdc.c                  |   4 +-
>>>   hw/block/xen-block.c            |   3 +-
>>>   hw/char/serial-pci-multi.c      |   5 +-
>>>   hw/char/serial-pci.c            |   5 +-
>>>   hw/char/serial.c                |  10 +--
>>>   hw/core/cpu.c                   |   3 +-
>>>   hw/cpu/a15mpcore.c              |   5 +-
>>>   hw/cpu/a9mpcore.c               |  21 ++-----
>>>   hw/cpu/arm11mpcore.c            |  17 ++----
>>>   hw/cpu/realview_mpcore.c        |   9 +--
>>>   hw/display/virtio-gpu-pci.c     |   6 +-
>>>   hw/display/virtio-vga.c         |   5 +-
>>>   hw/intc/armv7m_nvic.c           |   9 +--
>>>   hw/intc/pnv_xive.c              |   8 +--
>>>   hw/intc/realview_gic.c          |   5 +-
>>>   hw/intc/spapr_xive.c            |   8 +--
>>>   hw/intc/xics.c                  |   5 +-
>>>   hw/intc/xive.c                  |   3 +-
>>>   hw/isa/piix4.c                  |   5 +-
>>>   hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>>>   hw/mips/cps.c                   |  17 ++----
>>>   hw/misc/macio/cuda.c            |   5 +-
>>>   hw/misc/macio/macio.c           |  25 ++------
>>>   hw/misc/macio/pmu.c             |   5 +-
>>>   hw/pci-host/pnv_phb3.c          |  13 +---
>>>   hw/pci-host/pnv_phb4.c          |   5 +-
>>>   hw/pci-host/pnv_phb4_pec.c      |   5 +-
>>>   hw/ppc/e500.c                   |   5 +-
>>>   hw/ppc/pnv.c                    |  53 ++++------------
>>>   hw/ppc/pnv_core.c               |   4 +-
>>>   hw/ppc/pnv_psi.c                |   9 +--
>>>   hw/ppc/spapr_cpu_core.c         |   3 +-
>>>   hw/ppc/spapr_irq.c              |   5 +-
>>>   hw/riscv/opentitan.c            |   9 +--
>>>   hw/riscv/sifive_e.c             |   6 +-
>>>   hw/riscv/sifive_u.c             |   5 +-
>>>   hw/s390x/event-facility.c       |  13 ++--
>>>   hw/s390x/s390-pci-bus.c         |   3 +-
>>>   hw/s390x/sclp.c                 |   3 +-
>>>   hw/s390x/virtio-ccw-crypto.c    |   5 +-
>>>   hw/s390x/virtio-ccw-rng.c       |   5 +-
>>>   hw/scsi/scsi-bus.c              |   4 +-
>>>   hw/sd/aspeed_sdhci.c            |   4 +-
>>>   hw/sd/ssi-sd.c                  |   3 +-
>>>   hw/usb/bus.c                    |   3 +-
>>>   hw/virtio/virtio-rng-pci.c      |   5 +-
>>>   qdev-monitor.c                  |   3 +-
>>>  65 files changed, 248 insertions(+), 768 deletions(-)
>>
>> Almost all of this diff-stat may be generated by more obvious script:
>>
>> @rule1@
>> identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
>> expression list args;
>> typedef Error;
>> Error *err;
>> identifier errp;
>> @@
>>
>> -      fun(args, &err);
>> -      if (err)
>> +      if (!fun(args, errp))
>>        {
>> -              error_propagate(errp, err);
>>            return;
>>        }
>>
>> @depends on rule1@
>> identifier err;
>> @@
>>
>> -    Error *err = NULL;
>>      ... when != err
>>
>>
>> ===
>> Script started by command
>> spatch --sp-file x.cocci --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff --max-width 80 --use-gitgrep hw
>>
>> You see, I consider only obvious case, where we have only error_propagate + return in the if. I suggest to make a separate generated patch, based on my cocci script (it's mostly yours, actually), and as a second patch - the remaining of your patch. I do think that this will simplify the review.
>
> I can try this idea.  It's not just this patch, though, it's four more:
> PATCH 17+23+38+42.

I did this instead for v2:

* Use a trivial, safe script for converting to use the returned bool to
  check for failure.

  65 files changed, 248 insertions(+), 495 deletions(-)
  32 files changed, 71 insertions(+), 132 deletions(-)
  46 files changed, 97 insertions(+), 188 deletions(-)
  28 files changed, 96 insertions(+), 142 deletions(-)
  3 files changed, 4 insertions(+), 7 deletions(-)

* Use a an admittedly more complex script for eliminating many
  error_propagate().  I consider the script safe.  I believe it's
  reasonably easy to understand.

  114 files changed, 376 insertions(+), 884 deletions(-)

* Use an unsafe variant of the same script for eliminating a few more:

  23 files changed, 32 insertions(+), 78 deletions(-)

Even though rather I like how it came out, it may have been a bad idea,
because time's awfully short now.


Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Greg Kurz 5 years, 5 months ago
On Wed, 24 Jun 2020 18:43:01 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Convert
> 
>     foo(..., &err);
>     if (err) {
>         ...
>     }
> 
> to
> 
>     if (!foo(..., &err)) {
>         ...
>     }
> 
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:
> 
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     identifier errp;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>     -	   error_propagate(errp, err);
> 	       ...
> 	   }
> 
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, &err, args2)) {
> 	       ...
> 	   }
> 
> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  hw/arm/allwinner-a10.c          |  21 ++-----
>  hw/arm/armsse.c                 | 104 ++++++++------------------------
>  hw/arm/armv7m.c                 |  12 +---
>  hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>  hw/arm/aspeed_soc.c             |  60 +++++-------------
>  hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>  hw/arm/bcm2836.c                |  12 +---
>  hw/arm/cubieboard.c             |   3 +-
>  hw/arm/digic.c                  |  12 +---
>  hw/arm/digic_boards.c           |   3 +-
>  hw/arm/fsl-imx25.c              |  44 ++++----------
>  hw/arm/fsl-imx31.c              |  32 +++-------
>  hw/arm/fsl-imx6.c               |  48 ++++-----------
>  hw/arm/msf2-soc.c               |  21 ++-----
>  hw/arm/nrf51_soc.c              |  24 ++------
>  hw/arm/stm32f205_soc.c          |  29 +++------
>  hw/arm/stm32f405_soc.c          |  32 +++-------
>  hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>  hw/block/fdc.c                  |   4 +-
>  hw/block/xen-block.c            |   3 +-
>  hw/char/serial-pci-multi.c      |   5 +-
>  hw/char/serial-pci.c            |   5 +-
>  hw/char/serial.c                |  10 +--
>  hw/core/cpu.c                   |   3 +-
>  hw/cpu/a15mpcore.c              |   5 +-
>  hw/cpu/a9mpcore.c               |  21 ++-----
>  hw/cpu/arm11mpcore.c            |  17 ++----
>  hw/cpu/realview_mpcore.c        |   9 +--
>  hw/display/virtio-gpu-pci.c     |   6 +-
>  hw/display/virtio-vga.c         |   5 +-
>  hw/intc/armv7m_nvic.c           |   9 +--
>  hw/intc/pnv_xive.c              |   8 +--
>  hw/intc/realview_gic.c          |   5 +-
>  hw/intc/spapr_xive.c            |   8 +--
>  hw/intc/xics.c                  |   5 +-
>  hw/intc/xive.c                  |   3 +-
>  hw/isa/piix4.c                  |   5 +-
>  hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>  hw/mips/cps.c                   |  17 ++----
>  hw/misc/macio/cuda.c            |   5 +-
>  hw/misc/macio/macio.c           |  25 ++------
>  hw/misc/macio/pmu.c             |   5 +-
>  hw/pci-host/pnv_phb3.c          |  13 +---
>  hw/pci-host/pnv_phb4.c          |   5 +-
>  hw/pci-host/pnv_phb4_pec.c      |   5 +-
>  hw/ppc/e500.c                   |   5 +-
>  hw/ppc/pnv.c                    |  53 ++++------------
>  hw/ppc/pnv_core.c               |   4 +-
>  hw/ppc/pnv_psi.c                |   9 +--
>  hw/ppc/spapr_cpu_core.c         |   3 +-
>  hw/ppc/spapr_irq.c              |   5 +-
>  hw/riscv/opentitan.c            |   9 +--
>  hw/riscv/sifive_e.c             |   6 +-
>  hw/riscv/sifive_u.c             |   5 +-
>  hw/s390x/event-facility.c       |  13 ++--
>  hw/s390x/s390-pci-bus.c         |   3 +-
>  hw/s390x/sclp.c                 |   3 +-
>  hw/s390x/virtio-ccw-crypto.c    |   5 +-
>  hw/s390x/virtio-ccw-rng.c       |   5 +-
>  hw/scsi/scsi-bus.c              |   4 +-
>  hw/sd/aspeed_sdhci.c            |   4 +-
>  hw/sd/ssi-sd.c                  |   3 +-
>  hw/usb/bus.c                    |   3 +-
>  hw/virtio/virtio-rng-pci.c      |   5 +-
>  qdev-monitor.c                  |   3 +-
>  65 files changed, 248 insertions(+), 768 deletions(-)
> 
> diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
> index 52e0d83760..3e45aa4141 100644
> --- a/hw/arm/allwinner-a10.c
> +++ b/hw/arm/allwinner-a10.c
> @@ -72,17 +72,12 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
>  {
>      AwA10State *s = AW_A10(dev);
>      SysBusDevice *sysbusdev;
> -    Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
>          return;
>      }
>      sysbusdev = SYS_BUS_DEVICE(&s->intc);
> @@ -93,9 +88,7 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>      qdev_pass_gpios(DEVICE(&s->intc), dev, NULL);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
>          return;
>      }
>      sysbusdev = SYS_BUS_DEVICE(&s->timer);
> @@ -117,18 +110,14 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
>          qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
>          qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
>          return;
>      }
>      sysbusdev = SYS_BUS_DEVICE(&s->emac);
>      sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE);
>      sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 55));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE);
> diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
> index e2cf43ee0b..b306d95538 100644
> --- a/hw/arm/armsse.c
> +++ b/hw/arm/armsse.c
> @@ -566,9 +566,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          object_property_set_link(cpuobj, OBJECT(&s->cpu_container[i]),
>                                   "memory", &error_abort);
>          object_property_set_link(cpuobj, OBJECT(s), "idau", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(cpuobj), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(cpuobj), errp)) {
>              return;
>          }
>          /*
> @@ -577,9 +575,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>           * CPU must exist and have been parented into the cluster before
>           * the cluster is realized.
>           */
> -        qdev_realize(DEVICE(&s->cluster[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cluster[i]), NULL, errp)) {
>              return;
>          }
>  
> @@ -613,9 +609,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                      error_propagate(errp, err);
>                      return;
>                  }
> -                qdev_realize(DEVICE(splitter), NULL, &err);
> -                if (err) {
> -                    error_propagate(errp, err);
> +                if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
>                      return;
>                  }
>                  for (cpunum = 0; cpunum < info->num_cpus; cpunum++) {
> @@ -646,9 +640,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* Security controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->secctl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->secctl), errp)) {
>          return;
>      }
>      sbd_secctl = SYS_BUS_DEVICE(&s->secctl);
> @@ -669,9 +661,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, errp)) {
>          return;
>      }
>      dev_splitter = DEVICE(&s->sec_resp_splitter);
> @@ -693,9 +683,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          }
>          object_property_set_link(OBJECT(&s->mpc[i]), OBJECT(&s->sram[i]),
>                                   "downstream", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), errp)) {
>              return;
>          }
>          /* Map the upstream end of the MPC into the right place... */
> @@ -716,9 +704,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->mpc_irq_orgate), 0,
> @@ -735,9 +721,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>       * map its upstream ends to the right place in the container.
>       */
>      qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer0), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer0), 0,
> @@ -747,9 +731,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>  
>      qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer1), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer1), 0,
> @@ -759,9 +741,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>  
>      qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->dualtimer), 0,
> @@ -785,9 +765,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              int cpunum;
>              SysBusDevice *mhu_sbd = SYS_BUS_DEVICE(&s->mhu[i]);
>  
> -            sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), errp)) {
>                  return;
>              }
>              port = g_strdup_printf("port[%d]", i + 3);
> @@ -812,9 +790,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          }
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), errp)) {
>          return;
>      }
>  
> @@ -861,9 +837,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->ppc_irq_orgate), 0,
> @@ -884,9 +858,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              qdev_prop_set_string(DEVICE(&s->cachectrl[i]), "name", name);
>              g_free(name);
>              qdev_prop_set_uint64(DEVICE(&s->cachectrl[i]), "size", 0x1000);
> -            sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), errp)) {
>                  return;
>              }
>  
> @@ -902,9 +874,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              qdev_prop_set_string(DEVICE(&s->cpusecctrl[i]), "name", name);
>              g_free(name);
>              qdev_prop_set_uint64(DEVICE(&s->cpusecctrl[i]), "size", 0x1000);
> -            sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), errp)) {
>                  return;
>              }
>  
> @@ -917,9 +887,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              MemoryRegion *mr;
>  
>              qdev_prop_set_uint32(DEVICE(&s->cpuid[i]), "CPUID", i);
> -            sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), errp)) {
>                  return;
>              }
>  
> @@ -933,9 +901,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>       *   0x4002f000: S32K timer
>       */
>      qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32ktimer), 0,
> @@ -944,9 +910,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      object_property_set_link(OBJECT(&s->apb_ppc1), OBJECT(mr), "port[0]",
>                               &error_abort);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), errp)) {
>          return;
>      }
>      mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->apb_ppc1), 0);
> @@ -982,9 +946,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), errp)) {
>          return;
>      }
>      /* System information registers */
> @@ -998,9 +960,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                              "INITSVTOR0_RST", &error_abort);
>      object_property_set_int(OBJECT(&s->sysctl), s->init_svtor,
>                              "INITSVTOR1_RST", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysctl), 0, 0x50021000);
> @@ -1033,18 +993,14 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->nmi_orgate), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->nmi_orgate), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->nmi_orgate), 0,
>                            qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
>  
>      qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32kwatchdog), 0,
> @@ -1054,9 +1010,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      /* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
>  
>      qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->nswatchdog), 0,
> @@ -1064,9 +1018,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
>  
>      qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->swatchdog), 0,
> @@ -1081,9 +1033,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        qdev_realize(DEVICE(splitter), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
>              return;
>          }
>      }
> @@ -1128,9 +1078,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        qdev_realize(DEVICE(splitter), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
>              return;
>          }
>  
> diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
> index 3308211e9c..5d6bded386 100644
> --- a/hw/arm/armv7m.c
> +++ b/hw/arm/armv7m.c
> @@ -213,16 +213,12 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
>      s->cpu->env.nvic = &s->nvic;
>      s->nvic.cpu = s->cpu;
>  
> -    qdev_realize(DEVICE(s->cpu), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(s->cpu), NULL, errp)) {
>          return;
>      }
>  
>      /* Note that we must realize the NVIC after the CPU */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->nvic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvic), errp)) {
>          return;
>      }
>  
> @@ -254,9 +250,7 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
>              }
>              object_property_set_link(obj, OBJECT(s->board_memory),
>                                       "source-memory", &error_abort);
> -            sysbus_realize(SYS_BUS_DEVICE(obj), &err);
> -            if (err != NULL) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
>                  return;
>              }
>  
> diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
> index 59a7a1370b..aa02755d3f 100644
> --- a/hw/arm/aspeed_ast2600.c
> +++ b/hw/arm/aspeed_ast2600.c
> @@ -259,9 +259,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>           * is needed when using -kernel
>           */
>  
> -        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -301,17 +299,13 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                                  sc->memmap[ASPEED_SRAM], &s->sram);
>  
>      /* SCU */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
>  
>      /* RTC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
> @@ -321,9 +315,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      /* Timer */
>      object_property_set_link(OBJECT(&s->timerctrl),
>                               OBJECT(&s->scu), "scu", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
> @@ -343,9 +335,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      /* I2C */
>      object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
> @@ -368,9 +358,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
> @@ -385,9 +373,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                                   "dram", &error_abort);
>          object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
>                                  &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
> @@ -398,9 +384,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>  
>      /* EHCI */
>      for (i = 0; i < sc->ehcis_num; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
> @@ -410,9 +394,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* SDMC - SDRAM Memory Controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
> @@ -423,9 +405,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_link(OBJECT(&s->wdt[i]),
>                                   OBJECT(&s->scu), "scu", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
> @@ -436,9 +416,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < sc->macs_num; i++) {
>          object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
> @@ -448,9 +426,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_link(OBJECT(&s->mii[i]), OBJECT(&s->ftgmac100[i]),
>                                   "nic", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), errp)) {
>              return;
>          }
>  
> @@ -459,9 +435,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* XDMA */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
> @@ -470,18 +444,14 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_XDMA));
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
>                         aspeed_soc_get_irq(s, ASPEED_GPIO));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio_1_8v), 0,
> @@ -490,9 +460,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_GPIO_1_8V));
>  
>      /* SDHCI */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
> @@ -501,9 +469,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_SDHCI));
>  
>      /* eMMC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->emmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, sc->memmap[ASPEED_EMMC]);
> diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
> index 311458aa76..6faffc13cc 100644
> --- a/hw/arm/aspeed_soc.c
> +++ b/hw/arm/aspeed_soc.c
> @@ -230,9 +230,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>  
>      /* CPU */
>      for (i = 0; i < sc->num_cpus; i++) {
> -        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -248,17 +246,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                                  sc->memmap[ASPEED_SRAM], &s->sram);
>  
>      /* SCU */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
>  
>      /* VIC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->vic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->vic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_VIC]);
> @@ -268,9 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>  
>      /* RTC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
> @@ -280,9 +272,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      /* Timer */
>      object_property_set_link(OBJECT(&s->timerctrl),
>                               OBJECT(&s->scu), "scu", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
> @@ -302,9 +292,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      /* I2C */
>      object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
> @@ -320,9 +308,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
> @@ -335,9 +321,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < sc->spis_num; i++) {
>          object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
>                                  &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
> @@ -348,9 +332,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>  
>      /* EHCI */
>      for (i = 0; i < sc->ehcis_num; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
> @@ -360,9 +342,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* SDMC - SDRAM Memory Controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
> @@ -373,9 +353,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_link(OBJECT(&s->wdt[i]),
>                                   OBJECT(&s->scu), "scu", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
> @@ -386,9 +364,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < sc->macs_num; i++) {
>          object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
> @@ -398,9 +374,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* XDMA */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
> @@ -409,9 +383,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_XDMA));
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
> @@ -419,9 +391,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_GPIO));
>  
>      /* SDHCI */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
> index 7ffdf62067..8313410ffe 100644
> --- a/hw/arm/bcm2835_peripherals.c
> +++ b/hw/arm/bcm2835_peripherals.c
> @@ -161,9 +161,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* Interrupt Controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ic), errp)) {
>          return;
>      }
>  
> @@ -172,9 +170,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      sysbus_pass_irq(SYS_BUS_DEVICE(s), SYS_BUS_DEVICE(&s->ic));
>  
>      /* Sys Timer */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->systmr), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systmr), errp)) {
>          return;
>      }
>      memory_region_add_subregion(&s->peri_mr, ST_OFFSET,
> @@ -185,9 +181,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>  
>      /* UART0 */
>      qdev_prop_set_chr(DEVICE(&s->uart0), "chardev", serial_hd(0));
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart0), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart0), errp)) {
>          return;
>      }
>  
> @@ -200,9 +194,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      /* AUX / UART1 */
>      qdev_prop_set_chr(DEVICE(&s->aux), "chardev", serial_hd(1));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->aux), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->aux), errp)) {
>          return;
>      }
>  
> @@ -213,9 +205,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_AUX));
>  
>      /* Mailboxes */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), errp)) {
>          return;
>      }
>  
> @@ -239,9 +229,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fb), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fb), errp)) {
>          return;
>      }
>  
> @@ -251,9 +239,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                         qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_FB));
>  
>      /* Property channel */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->property), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->property), errp)) {
>          return;
>      }
>  
> @@ -264,9 +250,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                        qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_PROPERTY));
>  
>      /* Random Number Generator */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
>          return;
>      }
>  
> @@ -289,9 +273,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>      object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
>          return;
>      }
>  
> @@ -302,9 +284,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_ARASANSDIO));
>  
>      /* SDHOST */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), errp)) {
>          return;
>      }
>  
> @@ -315,9 +295,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_SDIO));
>  
>      /* DMA Channels */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dma), errp)) {
>          return;
>      }
>  
> @@ -334,18 +312,14 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* THERMAL */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->thermal), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->thermal), errp)) {
>          return;
>      }
>      memory_region_add_subregion(&s->peri_mr, THERMAL_OFFSET,
>                  sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->thermal), 0));
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>  
> @@ -355,9 +329,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->gpio), "sd-bus");
>  
>      /* Mphi */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mphi), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mphi), errp)) {
>          return;
>      }
>  
> @@ -368,9 +340,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_HOSTPORT));
>  
>      /* DWC2 */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), errp)) {
>          return;
>      }
>  
> diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
> index ed1793f7b7..51d156f0c5 100644
> --- a/hw/arm/bcm2836.c
> +++ b/hw/arm/bcm2836.c
> @@ -86,9 +86,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
>  
>      object_property_add_const_link(OBJECT(&s->peripherals), "ram", obj);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), errp)) {
>          return;
>      }
>  
> @@ -99,9 +97,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
>                              info->peri_base, 1);
>  
>      /* bcm2836 interrupt controller (and mailboxes, etc.) */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->control), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->control), errp)) {
>          return;
>      }
>  
> @@ -133,9 +129,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
>              return;
>          }
>  
> -        qdev_realize(DEVICE(&s->cpu[n].core), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[n].core), NULL, errp)) {
>              return;
>          }
>  
> diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
> index 5cbd115c53..c720e24ced 100644
> --- a/hw/arm/cubieboard.c
> +++ b/hw/arm/cubieboard.c
> @@ -80,8 +80,7 @@ static void cubieboard_init(MachineState *machine)
>          exit(1);
>      }
>  
> -    qdev_realize(DEVICE(a10), NULL, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(a10), NULL, &err)) {
>          error_reportf_err(err, "Couldn't realize Allwinner A10: ");
>          exit(1);
>      }
> diff --git a/hw/arm/digic.c b/hw/arm/digic.c
> index 13a83f7430..9fbb2258c9 100644
> --- a/hw/arm/digic.c
> +++ b/hw/arm/digic.c
> @@ -62,16 +62,12 @@ static void digic_realize(DeviceState *dev, Error **errp)
>          return;
>      }
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
>      for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>  
> @@ -80,9 +76,7 @@ static void digic_realize(DeviceState *dev, Error **errp)
>      }
>  
>      qdev_prop_set_chr(DEVICE(&s->uart), "chardev", serial_hd(0));
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
>          return;
>      }
>  
> diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
> index b6452d918c..d5524d3e72 100644
> --- a/hw/arm/digic_boards.c
> +++ b/hw/arm/digic_boards.c
> @@ -62,8 +62,7 @@ static void digic4_board_init(MachineState *machine, DigicBoard *board)
>          exit(EXIT_FAILURE);
>      }
>  
> -    qdev_realize(DEVICE(s), NULL, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(s), NULL, &err)) {
>          error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
>          exit(1);
>      }
> diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
> index 7ab5c98fbe..f5418c8c12 100644
> --- a/hw/arm/fsl-imx25.c
> +++ b/hw/arm/fsl-imx25.c
> @@ -85,15 +85,11 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>      uint8_t i;
>      Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX25_AVIC_ADDR);
> @@ -102,9 +98,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX25_CCM_ADDR);
> @@ -124,9 +118,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);
> @@ -149,9 +141,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>          s->gpt[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, gpt_table[i].addr);
> @@ -172,9 +162,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>          s->epit[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0, epit_table[i].addr);
> @@ -185,18 +173,14 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>      qdev_set_nic_properties(DEVICE(&s->fec), &nd_table[0]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fec), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fec), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->fec), 0, FSL_IMX25_FEC_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->fec), 0,
>                         qdev_get_gpio_in(DEVICE(&s->avic), FSL_IMX25_FEC_IRQ));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rngc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rngc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rngc), 0, FSL_IMX25_RNGC_ADDR);
> @@ -214,9 +198,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>              { FSL_IMX25_I2C3_ADDR, FSL_IMX25_I2C3_IRQ }
>          };
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, i2c_table[i].addr);
> @@ -237,9 +219,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>              { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
>          };
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
> @@ -267,9 +247,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>          object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
>                                   "vendor",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
> diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
> index 42cca529c3..8326f5ff81 100644
> --- a/hw/arm/fsl-imx31.c
> +++ b/hw/arm/fsl-imx31.c
> @@ -66,15 +66,11 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>      uint16_t i;
>      Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX31_AVIC_ADDR);
> @@ -83,9 +79,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX31_CCM_ADDR);
> @@ -102,9 +96,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>  
> @@ -116,9 +108,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>      s->gpt.ccm = IMX_CCM(&s->ccm);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
>          return;
>      }
>  
> @@ -138,9 +128,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>          s->epit[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
>              return;
>          }
>  
> @@ -162,9 +150,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>          };
>  
>          /* Initialize the I2C */
> -        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
>              return;
>          }
>          /* Map I2C memory */
> @@ -188,9 +174,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_bool(OBJECT(&s->gpio[i]), false, "has-edge-sel",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
> diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
> index 4ae3c3efc2..4c2da277ec 100644
> --- a/hw/arm/fsl-imx6.c
> +++ b/hw/arm/fsl-imx6.c
> @@ -130,9 +130,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                                       "start-powered-off", &error_abort);
>          }
>  
> -        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -144,9 +142,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                              FSL_IMX6_MAX_IRQ + GIC_INTERNAL, "num-irq",
>                              &error_abort);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->a9mpcore), 0, FSL_IMX6_A9MPCORE_ADDR);
> @@ -158,16 +154,12 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                             qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_FIQ));
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX6_CCM_ADDR);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->src), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->src), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->src), 0, FSL_IMX6_SRC_ADDR);
> @@ -187,9 +179,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>  
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>  
> @@ -201,9 +191,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>  
>      s->gpt.ccm = IMX_CCM(&s->ccm);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
>          return;
>      }
>  
> @@ -224,9 +212,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>  
>          s->epit[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
>              return;
>          }
>  
> @@ -247,9 +233,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>              { FSL_IMX6_I2C3_ADDR, FSL_IMX6_I2C3_IRQ }
>          };
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
>              return;
>          }
>  
> @@ -307,9 +291,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                                   &error_abort);
>          object_property_set_bool(OBJECT(&s->gpio[i]), true, "has-upper-pin-irq",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
>              return;
>          }
>  
> @@ -343,9 +325,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>          object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
>                                   "vendor",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
> @@ -390,9 +370,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>          };
>  
>          /* Initialize the SPI */
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>  
> @@ -403,9 +381,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>      }
>  
>      qdev_set_nic_properties(DEVICE(&s->eth), &nd_table[0]);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->eth), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->eth), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth), 0, FSL_IMX6_ENET_ADDR);
> diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
> index 3235c76194..b6143fba92 100644
> --- a/hw/arm/msf2-soc.c
> +++ b/hw/arm/msf2-soc.c
> @@ -93,7 +93,6 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      MSF2State *s = MSF2_SOC(dev_soc);
>      DeviceState *dev, *armv7m;
>      SysBusDevice *busdev;
> -    Error *err = NULL;
>      int i;
>  
>      MemoryRegion *system_memory = get_system_memory();
> @@ -125,9 +124,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      qdev_prop_set_bit(armv7m, "enable-bitband", true);
>      object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
>                                       "memory", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
>          return;
>      }
>  
> @@ -153,9 +150,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      dev = DEVICE(&s->timer);
>      /* APB0 clock is the timer input clock */
>      qdev_prop_set_uint32(dev, "clock-frequency", s->m3clk / s->apb0div);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -168,9 +163,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      dev = DEVICE(&s->sysreg);
>      qdev_prop_set_uint32(dev, "apb0divisor", s->apb0div);
>      qdev_prop_set_uint32(dev, "apb1divisor", s->apb1div);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -179,9 +172,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < MSF2_NUM_SPIS; i++) {
>          gchar *bus_name;
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>  
> @@ -199,9 +190,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      dev = DEVICE(&s->emac);
>      object_property_set_link(OBJECT(&s->emac), OBJECT(get_system_memory()),
>                               "ahb-bus", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
> index 20dd8b5897..a398bdfab8 100644
> --- a/hw/arm/nrf51_soc.c
> +++ b/hw/arm/nrf51_soc.c
> @@ -67,9 +67,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      object_property_set_link(OBJECT(&s->cpu), OBJECT(&s->container), "memory",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->cpu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
>          return;
>      }
>  
> @@ -84,9 +82,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>      memory_region_add_subregion(&s->container, NRF51_SRAM_BASE, &s->sram);
>  
>      /* UART */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
>          return;
>      }
>      mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->uart), 0);
> @@ -96,9 +92,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>                         BASE_TO_IRQ(NRF51_UART_BASE)));
>  
>      /* RNG */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
>          return;
>      }
>  
> @@ -116,9 +110,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->nvm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvm), errp)) {
>          return;
>      }
>  
> @@ -132,9 +124,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>      memory_region_add_subregion_overlap(&s->container, NRF51_FLASH_BASE, mr, 0);
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>  
> @@ -151,9 +141,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>  
> diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
> index 56aef686c9..5b008722e5 100644
> --- a/hw/arm/stm32f205_soc.c
> +++ b/hw/arm/stm32f205_soc.c
> @@ -81,7 +81,6 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      STM32F205State *s = STM32F205_SOC(dev_soc);
>      DeviceState *dev, *armv7m;
>      SysBusDevice *busdev;
> -    Error *err = NULL;
>      int i;
>  
>      MemoryRegion *system_memory = get_system_memory();
> @@ -107,17 +106,13 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      qdev_prop_set_bit(armv7m, "enable-bitband", true);
>      object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
>                                       "memory", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
>          return;
>      }
>  
>      /* System configuration controller */
>      dev = DEVICE(&s->syscfg);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -128,9 +123,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_USARTS; i++) {
>          dev = DEVICE(&(s->usart[i]));
>          qdev_prop_set_chr(dev, "chardev", serial_hd(i));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -142,9 +135,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_TIMERS; i++) {
>          dev = DEVICE(&(s->timer[i]));
>          qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -155,9 +146,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      /* ADC 1 to 3 */
>      object_property_set_int(OBJECT(s->adc_irqs), STM_NUM_ADCS,
>                              "num-lines", &error_abort);
> -    qdev_realize(DEVICE(s->adc_irqs), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(s->adc_irqs), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(s->adc_irqs), 0,
> @@ -165,9 +154,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      for (i = 0; i < STM_NUM_ADCS; i++) {
>          dev = DEVICE(&(s->adc[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -179,9 +166,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      /* SPI 1 and 2 */
>      for (i = 0; i < STM_NUM_SPIS; i++) {
>          dev = DEVICE(&(s->spi[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
> index cf9228d8e7..48b7181665 100644
> --- a/hw/arm/stm32f405_soc.c
> +++ b/hw/arm/stm32f405_soc.c
> @@ -118,17 +118,13 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      qdev_prop_set_bit(armv7m, "enable-bitband", true);
>      object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory),
>                                       "memory", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
>          return;
>      }
>  
>      /* System configuration controller */
>      dev = DEVICE(&s->syscfg);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -139,9 +135,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_USARTS; i++) {
>          dev = DEVICE(&(s->usart[i]));
>          qdev_prop_set_chr(dev, "chardev", serial_hd(i));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -153,9 +147,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_TIMERS; i++) {
>          dev = DEVICE(&(s->timer[i]));
>          qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -173,9 +165,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      }
>      object_property_set_int(OBJECT(&s->adc_irqs), STM_NUM_ADCS,
>                              "num-lines", &error_abort);
> -    qdev_realize(DEVICE(&s->adc_irqs), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->adc_irqs), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->adc_irqs), 0,
> @@ -183,9 +173,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      for (i = 0; i < STM_NUM_ADCS; i++) {
>          dev = DEVICE(&(s->adc[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -197,9 +185,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      /* SPI devices */
>      for (i = 0; i < STM_NUM_SPIS; i++) {
>          dev = DEVICE(&(s->spi[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -209,9 +195,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      /* EXTI device */
>      dev = DEVICE(&s->exti);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->exti), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->exti), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
> index 1de9d4a89d..33e63a2c4e 100644
> --- a/hw/arm/xlnx-zynqmp.c
> +++ b/hw/arm/xlnx-zynqmp.c
> @@ -176,7 +176,6 @@ static inline int arm_gic_ppi_index(int cpu_nr, int ppi_index)
>  static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
>                                     const char *boot_cpu, Error **errp)
>  {
> -    Error *err = NULL;
>      int i;
>      int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS,
>                         XLNX_ZYNQMP_NUM_RPU_CPUS);
> @@ -209,9 +208,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
>  
>          object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs",
>                                   &error_abort);
> -        qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -367,16 +364,12 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>                                  "reset-cbar", &error_abort);
>          object_property_set_int(OBJECT(&s->apu_cpu[i]), num_apus,
>                                  "core-count", &error_abort);
> -        qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>  
> @@ -470,9 +463,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>                                  &error_abort);
>          object_property_set_int(OBJECT(&s->gem[i]), 2, "num-priority-queues",
>                                  &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem[i]), 0, gem_addr[i]);
> @@ -482,9 +473,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>  
>      for (i = 0; i < XLNX_ZYNQMP_NUM_UARTS; i++) {
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, uart_addr[i]);
> @@ -494,9 +483,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>  
>      object_property_set_int(OBJECT(&s->sata), SATA_NUM_PORTS, "num-ports",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
>          return;
>      }
>  
> @@ -528,9 +515,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(sdhci), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(sdhci), errp)) {
>              return;
>          }
>          sysbus_mmio_map(sbd, 0, sdhci_addr[i]);
> @@ -545,9 +530,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < XLNX_ZYNQMP_NUM_SPIS; i++) {
>          gchar *bus_name;
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>  
> @@ -562,9 +545,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>          g_free(bus_name);
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->qspi), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->qspi), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
> @@ -584,17 +565,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>          g_free(target_bus);
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dp), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dp), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->dp), 0, DP_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->dp), 0, gic_spi[DP_IRQ]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), errp)) {
>          return;
>      }
>      object_property_set_link(OBJECT(&s->dp), OBJECT(&s->dpdma), "dpdma",
> @@ -602,17 +579,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->dpdma), 0, DPDMA_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->dpdma), 0, gic_spi[DPDMA_IRQ]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ipi), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ipi), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ipi), 0, IPI_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->ipi), 0, gic_spi[IPI_IRQ]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, RTC_ADDR);
> @@ -624,9 +597,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), errp)) {
>              return;
>          }
>  
> @@ -636,9 +607,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>      }
>  
>      for (i = 0; i < XLNX_ZYNQMP_NUM_ADMA_CH; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), errp)) {
>              return;
>          }
>  
> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
> index f4493d6afa..fe0ae2d146 100644
> --- a/hw/block/fdc.c
> +++ b/hw/block/fdc.c
> @@ -2574,9 +2574,7 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
>              return;
>          }
>  
> -        qdev_realize_and_unref(dev, &fdctrl->bus.bus, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize_and_unref(dev, &fdctrl->bus.bus, errp)) {
>              return;
>          }
>      }
> diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
> index 1b7bc5de08..10c44dfda2 100644
> --- a/hw/block/xen-block.c
> +++ b/hw/block/xen-block.c
> @@ -961,8 +961,7 @@ static void xen_block_device_create(XenBackendInstance *backend,
>      blockdev->iothread = iothread;
>      blockdev->drive = drive;
>  
> -    qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err);
> -    if (local_err) {
> +    if (!qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err)) {
>          error_propagate_prepend(errp, local_err,
>                                  "realization of device %s failed: ",
>                                  type);
> diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
> index 56f915e7c9..2cf3e44177 100644
> --- a/hw/char/serial-pci-multi.c
> +++ b/hw/char/serial-pci-multi.c
> @@ -95,7 +95,6 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
>      PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
>      PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
>      SerialState *s;
> -    Error *err = NULL;
>      size_t i, nports = multi_serial_get_port_count(pc);
>  
>      pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
> @@ -106,9 +105,7 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
>  
>      for (i = 0; i < nports; i++) {
>          s = pci->state + i;
> -        qdev_realize(DEVICE(s), NULL, &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(s), NULL, errp)) {
>              multi_serial_pci_exit(dev);
>              return;
>          }
> diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
> index 298f3adba7..cd56924a43 100644
> --- a/hw/char/serial-pci.c
> +++ b/hw/char/serial-pci.c
> @@ -47,11 +47,8 @@ static void serial_pci_realize(PCIDevice *dev, Error **errp)
>  {
>      PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
>      SerialState *s = &pci->state;
> -    Error *err = NULL;
>  
> -    qdev_realize(DEVICE(s), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(s), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 9eebcb27e7..2386479492 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -989,11 +989,8 @@ static void serial_io_realize(DeviceState *dev, Error **errp)
>  {
>      SerialIO *sio = SERIAL_IO(dev);
>      SerialState *s = &sio->serial;
> -    Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(s), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(s), NULL, errp)) {
>          return;
>      }
>  
> @@ -1096,11 +1093,8 @@ static void serial_mm_realize(DeviceState *dev, Error **errp)
>  {
>      SerialMM *smm = SERIAL_MM(dev);
>      SerialState *s = &smm->serial;
> -    Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(s), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(s), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/core/cpu.c b/hw/core/cpu.c
> index 0f23409f1d..594441a150 100644
> --- a/hw/core/cpu.c
> +++ b/hw/core/cpu.c
> @@ -59,8 +59,7 @@ CPUState *cpu_create(const char *typename)
>  {
>      Error *err = NULL;
>      CPUState *cpu = CPU(object_new(typename));
> -    qdev_realize(DEVICE(cpu), NULL, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(cpu), NULL, &err)) {
>          error_report_err(err);
>          object_unref(OBJECT(cpu));
>          exit(EXIT_FAILURE);
> diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
> index e6085f5d44..c377be398d 100644
> --- a/hw/cpu/a15mpcore.c
> +++ b/hw/cpu/a15mpcore.c
> @@ -53,7 +53,6 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
>      DeviceState *gicdev;
>      SysBusDevice *busdev;
>      int i;
> -    Error *err = NULL;
>      bool has_el3;
>      bool has_el2 = false;
>      Object *cpuobj;
> @@ -76,9 +75,7 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
>          qdev_prop_set_bit(gicdev, "has-virtualization-extensions", has_el2);
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(&s->gic);
> diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
> index 642363d2f4..351295e518 100644
> --- a/hw/cpu/a9mpcore.c
> +++ b/hw/cpu/a9mpcore.c
> @@ -50,16 +50,13 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
>      DeviceState *scudev, *gicdev, *gtimerdev, *mptimerdev, *wdtdev;
>      SysBusDevice *scubusdev, *gicbusdev, *gtimerbusdev, *mptimerbusdev,
>                   *wdtbusdev;
> -    Error *err = NULL;
>      int i;
>      bool has_el3;
>      Object *cpuobj;
>  
>      scudev = DEVICE(&s->scu);
>      qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>      scubusdev = SYS_BUS_DEVICE(&s->scu);
> @@ -78,9 +75,7 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
>          object_property_get_bool(cpuobj, "has_el3", &error_abort);
>      qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>      gicbusdev = SYS_BUS_DEVICE(&s->gic);
> @@ -93,27 +88,21 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
>  
>      gtimerdev = DEVICE(&s->gtimer);
>      qdev_prop_set_uint32(gtimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), errp)) {
>          return;
>      }
>      gtimerbusdev = SYS_BUS_DEVICE(&s->gtimer);
>  
>      mptimerdev = DEVICE(&s->mptimer);
>      qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
>          return;
>      }
>      mptimerbusdev = SYS_BUS_DEVICE(&s->mptimer);
>  
>      wdtdev = DEVICE(&s->wdt);
>      qdev_prop_set_uint32(wdtdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt), errp)) {
>          return;
>      }
>      wdtbusdev = SYS_BUS_DEVICE(&s->wdt);
> diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
> index a2afb992fb..89c4e35143 100644
> --- a/hw/cpu/arm11mpcore.c
> +++ b/hw/cpu/arm11mpcore.c
> @@ -76,12 +76,9 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
>      DeviceState *gicdev = DEVICE(&s->gic);
>      DeviceState *mptimerdev = DEVICE(&s->mptimer);
>      DeviceState *wdtimerdev = DEVICE(&s->wdtimer);
> -    Error *err = NULL;
>  
>      qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>  
> @@ -91,9 +88,7 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
>                           ARM11MPCORE_NUM_GIC_PRIORITY_BITS);
>  
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>  
> @@ -104,16 +99,12 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
>      qdev_init_gpio_in(dev, mpcore_priv_set_irq, s->num_irq - 32);
>  
>      qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
>          return;
>      }
>  
>      qdev_prop_set_uint32(wdtimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), errp)) {
>          return;
>      }
>  
> diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
> index d2e426fa45..96f4d2517a 100644
> --- a/hw/cpu/realview_mpcore.c
> +++ b/hw/cpu/realview_mpcore.c
> @@ -65,14 +65,11 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
>      DeviceState *priv = DEVICE(&s->priv);
>      DeviceState *gic;
>      SysBusDevice *gicbusdev;
> -    Error *err = NULL;
>      int n;
>      int i;
>  
>      qdev_prop_set_uint32(priv, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->priv), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->priv), errp)) {
>          return;
>      }
>      sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->priv));
> @@ -81,9 +78,7 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
>      }
>      /* ??? IRQ routing is hardcoded to "normal" mode.  */
>      for (n = 0; n < 4; n++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), errp)) {
>              return;
>          }
>          gic = DEVICE(&s->gic[n]);
> diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c
> index 41b88b878d..93ba5956ed 100644
> --- a/hw/display/virtio-gpu-pci.c
> +++ b/hw/display/virtio-gpu-pci.c
> @@ -31,13 +31,9 @@ static void virtio_gpu_pci_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>      VirtIOGPUBase *g = vgpu->vgpu;
>      DeviceState *vdev = DEVICE(g);
>      int i;
> -    Error *local_error = NULL;
>  
>      virtio_pci_force_virtio_1(vpci_dev);
> -    qdev_realize(vdev, BUS(&vpci_dev->bus), &local_error);
> -
> -    if (local_error) {
> -        error_propagate(errp, local_error);
> +    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
> index 67f409e106..fd550b35c8 100644
> --- a/hw/display/virtio-vga.c
> +++ b/hw/display/virtio-vga.c
> @@ -93,7 +93,6 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>      VirtIOVGABase *vvga = VIRTIO_VGA_BASE(vpci_dev);
>      VirtIOGPUBase *g = vvga->vgpu;
>      VGACommonState *vga = &vvga->vga;
> -    Error *err = NULL;
>      uint32_t offset;
>      int i;
>  
> @@ -138,9 +137,7 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>  
>      /* init virtio bits */
>      virtio_pci_force_virtio_1(vpci_dev);
> -    qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
> index af9f4c5a85..3c4b6e6d70 100644
> --- a/hw/intc/armv7m_nvic.c
> +++ b/hw/intc/armv7m_nvic.c
> @@ -2619,7 +2619,6 @@ static void nvic_systick_trigger(void *opaque, int n, int level)
>  static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
>  {
>      NVICState *s = NVIC(dev);
> -    Error *err = NULL;
>      int regionlen;
>  
>      /* The armv7m container object will have set our CPU pointer */
> @@ -2640,9 +2639,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
>  
>      s->num_prio_bits = arm_feature(&s->cpu->env, ARM_FEATURE_V7) ? 8 : 2;
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), 0,
> @@ -2657,9 +2654,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
>          object_initialize_child(OBJECT(dev), "systick-reg-s",
>                                  &s->systick[M_REG_S], TYPE_SYSTICK);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), errp)) {
>              return;
>          }
>          sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_S]), 0,
> diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
> index 85ba0b4655..7d33457e81 100644
> --- a/hw/intc/pnv_xive.c
> +++ b/hw/intc/pnv_xive.c
> @@ -1833,9 +1833,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>  
> @@ -1843,9 +1841,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/intc/realview_gic.c b/hw/intc/realview_gic.c
> index f11fb5259a..9b12116b2a 100644
> --- a/hw/intc/realview_gic.c
> +++ b/hw/intc/realview_gic.c
> @@ -26,7 +26,6 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
>      SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
>      RealViewGICState *s = REALVIEW_GIC(dev);
>      SysBusDevice *busdev;
> -    Error *err = NULL;
>      /* The GICs on the RealView boards have a fixed nonconfigurable
>       * number of interrupt lines, so we don't need to expose this as
>       * a qdev property.
> @@ -34,9 +33,7 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
>      int numirq = 96;
>  
>      qdev_prop_set_uint32(DEVICE(&s->gic), "num-irq", numirq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(&s->gic);
> diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
> index b7fc8dde7a..4e9ee90353 100644
> --- a/hw/intc/spapr_xive.c
> +++ b/hw/intc/spapr_xive.c
> @@ -312,9 +312,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>      sysbus_init_mmio(SYS_BUS_DEVICE(xive), &xsrc->esb_mmio);
> @@ -326,9 +324,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
>          return;
>      }
>      sysbus_init_mmio(SYS_BUS_DEVICE(xive), &end_xsrc->esb_mmio);
> diff --git a/hw/intc/xics.c b/hw/intc/xics.c
> index d365eeca66..0d336fb033 100644
> --- a/hw/intc/xics.c
> +++ b/hw/intc/xics.c
> @@ -376,7 +376,6 @@ static const TypeInfo icp_info = {
>  
>  Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
>  {
> -    Error *local_err = NULL;
>      Object *obj;
>  
>      obj = object_new(type);
> @@ -384,10 +383,8 @@ Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
>      object_unref(obj);
>      object_property_set_link(obj, OBJECT(xi), ICP_PROP_XICS, &error_abort);
>      object_property_set_link(obj, cpu, ICP_PROP_CPU, &error_abort);
> -    qdev_realize(DEVICE(obj), NULL, &local_err);
> -    if (local_err) {
> +    if (!qdev_realize(DEVICE(obj), NULL, errp)) {
>          object_unparent(obj);
> -        error_propagate(errp, local_err);
>          obj = NULL;
>      }
>  
> diff --git a/hw/intc/xive.c b/hw/intc/xive.c
> index 2c30dc53d8..8e167306e7 100644
> --- a/hw/intc/xive.c
> +++ b/hw/intc/xive.c
> @@ -765,8 +765,7 @@ Object *xive_tctx_create(Object *cpu, XivePresenter *xptr, Error **errp)
>      object_unref(obj);
>      object_property_set_link(obj, cpu, "cpu", &error_abort);
>      object_property_set_link(obj, OBJECT(xptr), "presenter", &error_abort);
> -    qdev_realize(DEVICE(obj), NULL, &local_err);
> -    if (local_err) {
> +    if (!qdev_realize(DEVICE(obj), NULL, &local_err)) {
>          goto error;
>      }
>  
> diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
> index f634bcb2d1..ac044afa95 100644
> --- a/hw/isa/piix4.c
> +++ b/hw/isa/piix4.c
> @@ -150,7 +150,6 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
>      PIIX4State *s = PIIX4_PCI_DEVICE(dev);
>      ISABus *isa_bus;
>      qemu_irq *i8259_out_irq;
> -    Error *err = NULL;
>  
>      isa_bus = isa_bus_new(DEVICE(dev), pci_address_space(dev),
>                            pci_address_space_io(dev), errp);
> @@ -183,9 +182,7 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
>  
>      /* RTC */
>      qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000);
> -    qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), errp)) {
>          return;
>      }
>      isa_init_irq(ISA_DEVICE(&s->rtc), &s->rtc.irq, RTC_ISA_IRQ);
> diff --git a/hw/microblaze/xlnx-zynqmp-pmu.c b/hw/microblaze/xlnx-zynqmp-pmu.c
> index abebc7e2ef..cd4f3427d8 100644
> --- a/hw/microblaze/xlnx-zynqmp-pmu.c
> +++ b/hw/microblaze/xlnx-zynqmp-pmu.c
> @@ -76,7 +76,6 @@ static void xlnx_zynqmp_pmu_soc_init(Object *obj)
>  static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
>  {
>      XlnxZynqMPPMUSoCState *s = XLNX_ZYNQMP_PMU_SOC(dev);
> -    Error *err = NULL;
>  
>      object_property_set_uint(OBJECT(&s->cpu), XLNX_ZYNQMP_PMU_ROM_ADDR,
>                               "base-vectors", &error_abort);
> @@ -96,9 +95,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
>      object_property_set_str(OBJECT(&s->cpu), "8.40.b", "version",
>                              &error_abort);
>      object_property_set_uint(OBJECT(&s->cpu), 0, "pvr", &error_abort);
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> @@ -108,9 +105,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>      object_property_set_uint(OBJECT(&s->intc), 0xffff, "intc-positive",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->intc), 0, XLNX_ZYNQMP_PMU_INTC_ADDR);
> diff --git a/hw/mips/cps.c b/hw/mips/cps.c
> index 0d7f3cf673..b4f2306596 100644
> --- a/hw/mips/cps.c
> +++ b/hw/mips/cps.c
> @@ -71,7 +71,6 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>      CPUMIPSState *env;
>      MIPSCPU *cpu;
>      int i;
> -    Error *err = NULL;
>      target_ulong gcr_base;
>      bool itu_present = false;
>      bool saar_present = false;
> @@ -109,9 +108,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>          if (saar_present) {
>              s->itu.saar = &env->CP0_SAAR;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(&s->itu), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->itu), errp)) {
>              return;
>          }
>  
> @@ -125,9 +122,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>                              &error_abort);
>      object_property_set_int(OBJECT(&s->cpc), 1, "vp-start-running",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->cpc), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpc), errp)) {
>          return;
>      }
>  
> @@ -140,9 +135,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>                              &error_abort);
>      object_property_set_int(OBJECT(&s->gic), 128, "num-irq",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>  
> @@ -163,9 +156,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>      object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->cpc.mr), "cpc",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gcr), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gcr), errp)) {
>          return;
>      }
>  
> diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
> index 47aa3b0552..0d29d53116 100644
> --- a/hw/misc/macio/cuda.c
> +++ b/hw/misc/macio/cuda.c
> @@ -524,13 +524,10 @@ static void cuda_reset(DeviceState *dev)
>  static void cuda_realize(DeviceState *dev, Error **errp)
>  {
>      CUDAState *s = CUDA(dev);
> -    Error *err = NULL;
>      SysBusDevice *sbd;
>      struct tm tm;
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), errp)) {
>          return;
>      }
>  
> diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
> index 3251c79f46..7cfe357cc4 100644
> --- a/hw/misc/macio/macio.c
> +++ b/hw/misc/macio/macio.c
> @@ -98,11 +98,8 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
>  {
>      MacIOState *s = MACIO(d);
>      SysBusDevice *sysbus_dev;
> -    Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>      sysbus_dev = SYS_BUS_DEVICE(&s->dbdma);
> @@ -116,9 +113,7 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
>      qdev_prop_set_chr(DEVICE(&s->escc), "chrB", serial_hd(1));
>      qdev_prop_set_uint32(DEVICE(&s->escc), "chnBtype", escc_serial);
>      qdev_prop_set_uint32(DEVICE(&s->escc), "chnAtype", escc_serial);
> -    qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>  
> @@ -159,9 +154,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
>  
>      qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
>                           s->frequency);
> -    qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>      sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
> @@ -176,9 +169,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
>      sysbus_connect_irq(sysbus_dev, 1, qdev_get_gpio_in(pic_dev,
>                                                         OLDWORLD_ESCCA_IRQ));
>  
> -    qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>      sysbus_dev = SYS_BUS_DEVICE(&os->nvram);
> @@ -345,9 +336,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
>          object_property_set_link(OBJECT(&s->pmu), OBJECT(sysbus_dev), "gpio",
>                                   &error_abort);
>          qdev_prop_set_bit(DEVICE(&s->pmu), "has-adb", ns->has_adb);
> -        qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), errp)) {
>              return;
>          }
>          sysbus_dev = SYS_BUS_DEVICE(&s->pmu);
> @@ -363,9 +352,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
>          qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
>                               s->frequency);
>  
> -        qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
>              return;
>          }
>          sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
> diff --git a/hw/misc/macio/pmu.c b/hw/misc/macio/pmu.c
> index 41b626c46c..4b0983697c 100644
> --- a/hw/misc/macio/pmu.c
> +++ b/hw/misc/macio/pmu.c
> @@ -741,13 +741,10 @@ static void pmu_reset(DeviceState *dev)
>  static void pmu_realize(DeviceState *dev, Error **errp)
>  {
>      PMUState *s = VIA_PMU(dev);
> -    Error *err = NULL;
>      SysBusDevice *sbd;
>      struct tm tm;
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), errp)) {
>          return;
>      }
>  
> diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
> index 3ec904a55f..d85ca709d9 100644
> --- a/hw/pci-host/pnv_phb3.c
> +++ b/hw/pci-host/pnv_phb3.c
> @@ -990,7 +990,6 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>      PnvPHB3 *phb = PNV_PHB3(dev);
>      PCIHostState *pci = PCI_HOST_BRIDGE(dev);
>      PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
> -    Error *local_err = NULL;
>      int i;
>  
>      if (phb->phb_id >= PNV8_CHIP_PHB3_MAX) {
> @@ -1003,9 +1002,7 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>                                     &error_abort);
>      object_property_set_int(OBJECT(&phb->lsis), PNV_PHB3_NUM_LSI, "nr-irqs",
>                              &error_abort);
> -    qdev_realize(DEVICE(&phb->lsis), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&phb->lsis), NULL, errp)) {
>          return;
>      }
>  
> @@ -1022,18 +1019,14 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>                                     &error_abort);
>      object_property_set_int(OBJECT(&phb->msis), PHB3_MAX_MSI, "nr-irqs",
>                              &error_abort);
> -    qdev_realize(DEVICE(&phb->msis), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&phb->msis), NULL, errp)) {
>          return;
>      }
>  
>      /* Power Bus Common Queue */
>      object_property_set_link(OBJECT(&phb->pbcq), OBJECT(phb), "phb",
>                                     &error_abort);
> -    qdev_realize(DEVICE(&phb->pbcq), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&phb->pbcq), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
> index 10716d759d..7739fd5984 100644
> --- a/hw/pci-host/pnv_phb4.c
> +++ b/hw/pci-host/pnv_phb4.c
> @@ -1169,7 +1169,6 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
>      PnvPHB4 *phb = PNV_PHB4(dev);
>      PCIHostState *pci = PCI_HOST_BRIDGE(dev);
>      XiveSource *xsrc = &phb->xsrc;
> -    Error *local_err = NULL;
>      int nr_irqs;
>      char name[32];
>  
> @@ -1218,9 +1217,7 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
>      }
>      object_property_set_int(OBJECT(xsrc), nr_irqs, "nr-irqs", &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(phb), "xive", &error_fatal);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
> index 2d634c838e..40f993bd06 100644
> --- a/hw/pci-host/pnv_phb4_pec.c
> +++ b/hw/pci-host/pnv_phb4_pec.c
> @@ -377,7 +377,6 @@ static void pnv_pec_instance_init(Object *obj)
>  static void pnv_pec_realize(DeviceState *dev, Error **errp)
>  {
>      PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
> -    Error *local_err = NULL;
>      char name[64];
>      int i;
>  
> @@ -390,9 +389,7 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_int(stk_obj, i, "stack-no", &error_abort);
>          object_property_set_link(stk_obj, OBJECT(pec), "pec", &error_abort);
> -        qdev_realize(DEVICE(stk_obj), NULL, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
>              return;
>          }
>      }
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index 51bf95b303..5448d101d9 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -764,16 +764,13 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
>  static DeviceState *ppce500_init_mpic_kvm(const PPCE500MachineClass *pmc,
>                                            IrqLines *irqs, Error **errp)
>  {
> -    Error *err = NULL;
>      DeviceState *dev;
>      CPUState *cs;
>  
>      dev = qdev_new(TYPE_KVM_OPENPIC);
>      qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
>  
> -    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
>          object_unparent(OBJECT(dev));
>          return NULL;
>      }
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 8bd03f3b10..392aa138de 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1137,9 +1137,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>                              "bar", &error_fatal);
>      object_property_set_link(OBJECT(&chip8->psi), OBJECT(chip8->xics),
>                               ICS_PROP_XICS, &error_abort);
> -    qdev_realize(DEVICE(&chip8->psi), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip8->psi), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE,
> @@ -1168,9 +1166,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>      /* Create the simplified OCC model */
>      object_property_set_link(OBJECT(&chip8->occ), OBJECT(&chip8->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip8->occ), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip8->occ), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip8->occ.xscom_regs);
> @@ -1182,9 +1178,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>      /* HOMER */
>      object_property_set_link(OBJECT(&chip8->homer), OBJECT(chip), "chip",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip8->homer), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip8->homer), NULL, errp)) {
>          return;
>      }
>      /* Homer Xscom region */
> @@ -1202,9 +1196,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>          object_property_set_int(OBJECT(phb), i, "index", &error_fatal);
>          object_property_set_int(OBJECT(phb), chip->chip_id, "chip-id",
>                                  &error_fatal);
> -        sysbus_realize(SYS_BUS_DEVICE(phb), &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(phb), errp)) {
>              return;
>          }
>  
> @@ -1359,7 +1351,6 @@ static void pnv_chip_quad_realize(Pnv9Chip *chip9, Error **errp)
>  static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>  {
>      Pnv9Chip *chip9 = PNV9_CHIP(chip);
> -    Error *local_err = NULL;
>      int i, j;
>      int phb_id = 0;
>  
> @@ -1381,9 +1372,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>                                   &error_fatal);
>          object_property_set_link(OBJECT(pec), OBJECT(get_system_memory()),
>                                   "system-memory", &error_abort);
> -        qdev_realize(DEVICE(pec), NULL, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize(DEVICE(pec), NULL, errp)) {
>              return;
>          }
>  
> @@ -1406,9 +1395,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>              object_property_set_int(obj, PNV_PHB4_DEVICE_ID, "device-id",
>                                      &error_fatal);
>              object_property_set_link(obj, OBJECT(stack), "stack", &error_abort);
> -            sysbus_realize(SYS_BUS_DEVICE(obj), &local_err);
> -            if (local_err) {
> -                error_propagate(errp, local_err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
>                  return;
>              }
>  
> @@ -1466,9 +1453,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>                              "tm-bar", &error_fatal);
>      object_property_set_link(OBJECT(&chip9->xive), OBJECT(chip), "chip",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE,
> @@ -1477,9 +1462,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* Processor Service Interface (PSI) Host Bridge */
>      object_property_set_int(OBJECT(&chip9->psi), PNV9_PSIHB_BASE(chip),
>                              "bar", &error_fatal);
> -    qdev_realize(DEVICE(&chip9->psi), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->psi), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE,
> @@ -1488,9 +1471,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* LPC */
>      object_property_set_link(OBJECT(&chip9->lpc), OBJECT(&chip9->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip9->lpc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->lpc), NULL, errp)) {
>          return;
>      }
>      memory_region_add_subregion(get_system_memory(), PNV9_LPCM_BASE(chip),
> @@ -1502,9 +1483,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* Create the simplified OCC model */
>      object_property_set_link(OBJECT(&chip9->occ), OBJECT(&chip9->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip9->occ), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->occ), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV9_XSCOM_OCC_BASE, &chip9->occ.xscom_regs);
> @@ -1516,9 +1495,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* HOMER */
>      object_property_set_link(OBJECT(&chip9->homer), OBJECT(chip), "chip",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip9->homer), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->homer), NULL, errp)) {
>          return;
>      }
>      /* Homer Xscom region */
> @@ -1598,9 +1575,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
>      /* Processor Service Interface (PSI) Host Bridge */
>      object_property_set_int(OBJECT(&chip10->psi), PNV10_PSIHB_BASE(chip),
>                              "bar", &error_fatal);
> -    qdev_realize(DEVICE(&chip10->psi), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip10->psi), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV10_XSCOM_PSIHB_BASE,
> @@ -1609,9 +1584,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
>      /* LPC */
>      object_property_set_link(OBJECT(&chip10->lpc), OBJECT(&chip10->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip10->lpc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip10->lpc), NULL, errp)) {
>          return;
>      }
>      memory_region_add_subregion(get_system_memory(), PNV10_LPCM_BASE(chip),
> diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
> index c986c16db1..4724ddf96c 100644
> --- a/hw/ppc/pnv_core.c
> +++ b/hw/ppc/pnv_core.c
> @@ -173,9 +173,7 @@ static void pnv_core_cpu_realize(PnvCore *pc, PowerPCCPU *cpu, Error **errp)
>      Error *local_err = NULL;
>      PnvChipClass *pcc = PNV_CHIP_GET_CLASS(pc->chip);
>  
> -    qdev_realize(DEVICE(cpu), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
> index 75b8ae9703..08756a79cd 100644
> --- a/hw/ppc/pnv_psi.c
> +++ b/hw/ppc/pnv_psi.c
> @@ -510,9 +510,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(ics), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(ics), NULL, errp)) {
>          return;
>      }
>  
> @@ -842,7 +840,6 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
>  {
>      PnvPsi *psi = PNV_PSI(dev);
>      XiveSource *xsrc = &PNV9_PSI(psi)->source;
> -    Error *local_err = NULL;
>      int i;
>  
>      /* This is the only device with 4k ESB pages */
> @@ -851,9 +848,7 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
>      object_property_set_int(OBJECT(xsrc), PSIHB9_NUM_IRQS, "nr-irqs",
>                              &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(psi), "xive", &error_abort);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index 26ad566f42..85330d08a1 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -239,8 +239,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
>      CPUState *cs = CPU(cpu);
>      Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(cpu), NULL, &local_err);
> -    if (local_err) {
> +    if (!qdev_realize(DEVICE(cpu), NULL, &local_err)) {
>          goto error;
>      }
>  
> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> index 897bf98587..a61d39ad71 100644
> --- a/hw/ppc/spapr_irq.c
> +++ b/hw/ppc/spapr_irq.c
> @@ -302,7 +302,6 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
>      spapr_irq_msi_init(spapr);
>  
>      if (spapr->irq->xics) {
> -        Error *local_err = NULL;
>          Object *obj;
>  
>          obj = object_new(TYPE_ICS_SPAPR);
> @@ -311,9 +310,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
>          object_property_set_link(obj, OBJECT(spapr), ICS_PROP_XICS,
>                                   &error_abort);
>          object_property_set_int(obj, smc->nr_xirqs, "nr-irqs", &error_abort);
> -        qdev_realize(DEVICE(obj), NULL, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize(DEVICE(obj), NULL, errp)) {
>              return;
>          }
>  
> diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
> index 19223e4c29..d40f065a6a 100644
> --- a/hw/riscv/opentitan.c
> +++ b/hw/riscv/opentitan.c
> @@ -106,7 +106,6 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
>      MachineState *ms = MACHINE(qdev_get_machine());
>      LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
>      MemoryRegion *sys_mem = get_system_memory();
> -    Error *err = NULL;
>  
>      object_property_set_str(OBJECT(&s->cpus), ms->cpu_type, "cpu-type",
>                              &error_abort);
> @@ -127,18 +126,14 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
>                                  &s->flash_mem);
>  
>      /* PLIC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->plic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->plic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0, memmap[IBEX_PLIC].base);
>  
>      /* UART */
>      qdev_prop_set_chr(DEVICE(&(s->uart)), "chardev", serial_hd(0));
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart), 0, memmap[IBEX_UART].base);
> diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
> index 0cb66ac4e2..416adfcce0 100644
> --- a/hw/riscv/sifive_e.c
> +++ b/hw/riscv/sifive_e.c
> @@ -185,8 +185,6 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
>  {
>      MachineState *ms = MACHINE(qdev_get_machine());
>      const struct MemmapEntry *memmap = sifive_e_memmap;
> -    Error *err = NULL;
> -
>      SiFiveESoCState *s = RISCV_E_SOC(dev);
>      MemoryRegion *sys_mem = get_system_memory();
>  
> @@ -221,9 +219,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
>  
>      /* GPIO */
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>  
> diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
> index a1d2edfe13..12cd91b227 100644
> --- a/hw/riscv/sifive_u.c
> +++ b/hw/riscv/sifive_u.c
> @@ -608,7 +608,6 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
>      char *plic_hart_config;
>      size_t plic_hart_config_len;
>      int i;
> -    Error *err = NULL;
>      NICInfo *nd = &nd_table[0];
>  
>      sysbus_realize(SYS_BUS_DEVICE(&s->e_cpus), &error_abort);
> @@ -710,9 +709,7 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
>      }
>      object_property_set_int(OBJECT(&s->gem), GEM_REVISION, "revision",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gem), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem), 0, memmap[SIFIVE_U_GEM].base);
> diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
> index 164b1fd295..645b4080c5 100644
> --- a/hw/s390x/event-facility.c
> +++ b/hw/s390x/event-facility.c
> @@ -442,18 +442,13 @@ static void init_event_facility(Object *obj)
>  static void realize_event_facility(DeviceState *dev, Error **errp)
>  {
>      SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
> -    Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(&event_facility->quiesce),
> -                 BUS(&event_facility->sbus), &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&event_facility->quiesce),
> +                      BUS(&event_facility->sbus), errp)) {
>          return;
>      }
> -    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> -                 BUS(&event_facility->sbus), &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> +                      BUS(&event_facility->sbus), errp)) {
>          qdev_unrealize(DEVICE(&event_facility->quiesce));
>          return;
>      }
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index 142e52a8ff..0517901024 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -829,8 +829,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
>                                  "zPCI device could not be created: ");
>          return NULL;
>      }
> -    qdev_realize_and_unref(dev, BUS(s->bus), &local_err);
> -    if (local_err) {
> +    if (!qdev_realize_and_unref(dev, BUS(s->bus), &local_err)) {
>          object_unparent(OBJECT(dev));
>          error_propagate_prepend(errp, local_err,
>                                  "zPCI device could not be created: ");
> diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
> index d39f6d7785..03364343eb 100644
> --- a/hw/s390x/sclp.c
> +++ b/hw/s390x/sclp.c
> @@ -338,8 +338,7 @@ static void sclp_realize(DeviceState *dev, Error **errp)
>       * as we can't find a fitting bus via the qom tree, we have to add the
>       * event facility to the sysbus, so e.g. a sclp console can be created.
>       */
> -    sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err);
> -    if (err) {
> +    if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err)) {
>          goto out;
>      }
>  
> diff --git a/hw/s390x/virtio-ccw-crypto.c b/hw/s390x/virtio-ccw-crypto.c
> index ca6753bff3..438626cf37 100644
> --- a/hw/s390x/virtio-ccw-crypto.c
> +++ b/hw/s390x/virtio-ccw-crypto.c
> @@ -19,11 +19,8 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
>  {
>      VirtIOCryptoCcw *dev = VIRTIO_CRYPTO_CCW(ccw_dev);
>      DeviceState *vdev = DEVICE(&dev->vdev);
> -    Error *err = NULL;
>  
> -    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/s390x/virtio-ccw-rng.c b/hw/s390x/virtio-ccw-rng.c
> index 4077160f49..aefe6b1b51 100644
> --- a/hw/s390x/virtio-ccw-rng.c
> +++ b/hw/s390x/virtio-ccw-rng.c
> @@ -20,11 +20,8 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
>  {
>      VirtIORNGCcw *dev = VIRTIO_RNG_CCW(ccw_dev);
>      DeviceState *vdev = DEVICE(&dev->vdev);
> -    Error *err = NULL;
>  
> -    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index b878a08080..f3d2d63de8 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -293,9 +293,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
>      qdev_prop_set_enum(dev, "rerror", rerror);
>      qdev_prop_set_enum(dev, "werror", werror);
>  
> -    qdev_realize_and_unref(dev, &bus->qbus, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) {
>          object_unparent(OBJECT(dev));
>          return NULL;
>      }
> diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
> index 538d3bad3d..ad0bb6fdb4 100644
> --- a/hw/sd/aspeed_sdhci.c
> +++ b/hw/sd/aspeed_sdhci.c
> @@ -145,9 +145,7 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
>              return;
>          }
>  
> -        sysbus_realize(sbd_slot, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(sbd_slot, errp)) {
>              return;
>          }
>  
> diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
> index 25cec2ddea..0df0edb51d 100644
> --- a/hw/sd/ssi-sd.c
> +++ b/hw/sd/ssi-sd.c
> @@ -266,8 +266,7 @@ static void ssi_sd_realize(SSISlave *d, Error **errp)
>          goto fail;
>      }
>  
> -    qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err);
> -    if (err) {
> +    if (!qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err)) {
>          goto fail;
>      }
>  
> diff --git a/hw/usb/bus.c b/hw/usb/bus.c
> index 957559b18d..ba27afe9f2 100644
> --- a/hw/usb/bus.c
> +++ b/hw/usb/bus.c
> @@ -704,8 +704,7 @@ USBDevice *usbdevice_create(const char *cmdline)
>          error_report("Failed to create USB device '%s'", f->name);
>          return NULL;
>      }
> -    usb_realize_and_unref(dev, bus, &err);
> -    if (err) {
> +    if (!usb_realize_and_unref(dev, bus, &err)) {
>          error_reportf_err(err, "Failed to initialize USB device '%s': ",
>                            f->name);
>          object_unparent(OBJECT(dev));
> diff --git a/hw/virtio/virtio-rng-pci.c b/hw/virtio/virtio-rng-pci.c
> index cf1afb47a6..b6cb0199a3 100644
> --- a/hw/virtio/virtio-rng-pci.c
> +++ b/hw/virtio/virtio-rng-pci.c
> @@ -34,11 +34,8 @@ static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>  {
>      VirtIORngPCI *vrng = VIRTIO_RNG_PCI(vpci_dev);
>      DeviceState *vdev = DEVICE(&vrng->vdev);
> -    Error *err = NULL;
>  
> -    qdev_realize(vdev, BUS(&vpci_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index 22da107484..13a13a811a 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -676,8 +676,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>      }
>  
>      dev->opts = opts;
> -    qdev_realize(DEVICE(dev), bus, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(dev), bus, &err)) {
>          dev->opts = NULL;
>          goto err_del_dev;
>      }


Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Markus Armbruster 5 years, 5 months ago
Markus Armbruster <armbru@redhat.com> writes:

> Convert
>
>     foo(..., &err);
>     if (err) {
>         ...
>     }
>
> to
>
>     if (!foo(..., &err)) {
>         ...
>     }
>
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:
>
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     identifier errp;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>     -	   error_propagate(errp, err);
> 	       ...
> 	   }

Note that this rule is unsound: if err is read later on, we're screwed.
I checked manually it's not, but neglected to mention it in the commit
message.  I'll do that in v2.

The manual checking isn't that bad, most of the time we immediately
return.

>
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, &err, args2)) {
> 	       ...
> 	   }
>
> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
>
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>


Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Eric Blake 5 years, 5 months ago
On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Convert
> 
>      foo(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      if (!foo(..., &err)) {
>          ...
>      }
> 
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:

Automated patching is so much easier than manual :)

> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.

Well, so there's still some manual stuff.  But that's okay; hopefully we 
don't have too many stragglers reintroduced via pending patches.

> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

>   65 files changed, 248 insertions(+), 768 deletions(-)

Quite a big trim.  But I didn't spot any obvious problems.

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org


Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
Posted by Markus Armbruster 5 years, 5 months ago
Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> Convert
>>
>>      foo(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      if (!foo(..., &err)) {
>>          ...
>>      }
>>
>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>> Coccinelle script:
>
> Automated patching is so much easier than manual :)

Except when Coccinelle dies with some weird error, or refuses to play
ball without any explanation at all :)

Coccinelle is both awesome and terrible!

>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>> ARMSSE being used both as typedef and function-like macro there.
>> Convert manually.
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.  Clean up whitespace.
>
> Well, so there's still some manual stuff.  But that's okay; hopefully
> we don't have too many stragglers reintroduced via pending patches.

The first sentence is a leftover from an earlier, more manual version.
I'll delete it.

The manual stuff is really just deleting unused variables to make the
compiler happy, tidying up whitespace and breaking long lines to make
checkpatch happy, and tweak line breaks a bit more to make my reviewers
happy.

>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>>   65 files changed, 248 insertions(+), 768 deletions(-)
>
> Quite a big trim.  But I didn't spot any obvious problems.
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!