* [PATCH 0/5] bulk: Have object_child_foreach() take Error* and return boolean @ 2023-02-16 12:25 Philippe Mathieu-Daudé 2023-02-16 12:25 ` [PATCH 1/5] hw/nmi: Have nmi_monitor_handler() return a boolean indicating error Philippe Mathieu-Daudé ` (4 more replies) 0 siblings, 5 replies; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-16 12:25 UTC (permalink / raw) To: qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Philippe Mathieu-Daudé The objective of this series is to allow object_child_foreach() and object_child_foreach_recursive() propagate Error to their callers. Instead of adding temporary helpers with the new prototype, and converting per subsystem, a bulk conversion is done as a single patch... The changes aren't mechanical, but quite obvious. Philippe Mathieu-Daudé (5): hw/nmi: Have nmi_monitor_handler() return a boolean indicating error spapr/ddw: Remove confuse return value in spapr_phb_get_free_liobn() bulk: Have object_child_foreach() take Error* and return boolean hw/nmi: Simplify nmi_monitor_handle() and do_nmi() hw/ppc/pnv_bmc: Simplify pnv_bmc_find() chardev/char-mux.c | 6 ++-- chardev/char.c | 6 ++-- gdbstub/gdbstub.c | 8 +++--- hw/acpi/cxl.c | 7 +++-- hw/acpi/viot.c | 6 ++-- hw/arm/boot.c | 6 ++-- hw/arm/virt-acpi-build.c | 8 +++--- hw/core/machine-qmp-cmds.c | 18 ++++++------ hw/core/nmi.c | 44 +++++------------------------ hw/core/qdev.c | 8 ++++-- hw/core/sysbus.c | 10 +++---- hw/cpu/cluster.c | 7 +++-- hw/display/virtio-gpu-udmabuf.c | 7 +++-- hw/hppa/machine.c | 3 +- hw/i386/acpi-build.c | 16 +++++------ hw/i386/intel_iommu.c | 7 +++-- hw/i386/pc.c | 13 ++++----- hw/i386/sgx.c | 7 ++--- hw/i386/x86.c | 3 +- hw/intc/m68k_irqc.c | 4 ++- hw/m68k/q800.c | 4 ++- hw/mem/memory-device.c | 25 ++++++++--------- hw/mem/pc-dimm.c | 8 +++--- hw/misc/macio/gpio.c | 4 ++- hw/misc/mos6522.c | 6 ++-- hw/ppc/pnv.c | 18 ++++++------ hw/ppc/pnv_bmc.c | 28 ++++++++---------- hw/ppc/pnv_xscom.c | 6 ++-- hw/ppc/spapr.c | 3 +- hw/ppc/spapr_pci.c | 50 ++++++++++++++++----------------- hw/ppc/spapr_rtas_ddw.c | 17 ++++++----- hw/rdma/vmw/pvrdma_main.c | 7 +++-- hw/s390x/s390-virtio-ccw.c | 4 ++- hw/virtio/virtio-balloon.c | 7 ++--- include/hw/nmi.h | 3 +- include/qom/object.h | 28 ++++++++++-------- iothread.c | 8 +++--- monitor/hmp-cmds.c | 6 ++-- qom/object.c | 36 ++++++++++++------------ qom/qom-hmp-cmds.c | 7 +++-- scsi/pr-manager.c | 8 +++--- softmmu/physmem.c | 13 +++++---- softmmu/qdev-monitor.c | 9 +++--- tests/qtest/fuzz/generic_fuzz.c | 6 ++-- ui/dbus-chardev.c | 14 ++++----- util/nvdimm-utils.c | 8 +++--- 46 files changed, 256 insertions(+), 271 deletions(-) -- 2.38.1 ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/5] hw/nmi: Have nmi_monitor_handler() return a boolean indicating error 2023-02-16 12:25 [PATCH 0/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé @ 2023-02-16 12:25 ` Philippe Mathieu-Daudé 2023-02-23 15:26 ` Markus Armbruster 2023-02-16 12:25 ` [PATCH 2/5] spapr/ddw: Remove confuse return value in spapr_phb_get_free_liobn() Philippe Mathieu-Daudé ` (3 subsequent siblings) 4 siblings, 1 reply; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-16 12:25 UTC (permalink / raw) To: qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Philippe Mathieu-Daudé, Richard Henderson, Helge Deller, Paolo Bonzini, Eduardo Habkost, Michael S. Tsirkin, Marcel Apfelbaum, Laurent Vivier, Mark Cave-Ayland, Cédric Le Goater, Daniel Henrique Barboza, David Gibson, Greg Kurz, Thomas Huth, David Hildenbrand, Ilya Leoshkevich, Halil Pasic, Christian Borntraeger, Eric Farman Following the example documented since commit e3fe3988d7 ("error: Document Error API usage rules"), have the nmi_monitor_handler return a boolean indicating whether an error is set or not and convert its implementations. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- hw/core/nmi.c | 3 +-- hw/hppa/machine.c | 3 ++- hw/i386/x86.c | 3 ++- hw/intc/m68k_irqc.c | 4 +++- hw/m68k/q800.c | 4 +++- hw/misc/macio/gpio.c | 4 +++- hw/ppc/pnv.c | 3 ++- hw/ppc/spapr.c | 3 ++- hw/s390x/s390-virtio-ccw.c | 4 +++- include/hw/nmi.h | 3 ++- 10 files changed, 23 insertions(+), 11 deletions(-) diff --git a/hw/core/nmi.c b/hw/core/nmi.c index 481c4b3c7e..76cb3ba3b0 100644 --- a/hw/core/nmi.c +++ b/hw/core/nmi.c @@ -43,8 +43,7 @@ static int do_nmi(Object *o, void *opaque) NMIClass *nc = NMI_GET_CLASS(n); ns->handled = true; - nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err); - if (ns->err) { + if (!nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err)) { return -1; } } diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c index 7ac68c943f..da7c36c554 100644 --- a/hw/hppa/machine.c +++ b/hw/hppa/machine.c @@ -437,13 +437,14 @@ static void hppa_machine_reset(MachineState *ms, ShutdownCause reason) cpu[0]->env.gr[19] = FW_CFG_IO_BASE; } -static void hppa_nmi(NMIState *n, int cpu_index, Error **errp) +static bool hppa_nmi(NMIState *n, int cpu_index, Error **errp) { CPUState *cs; CPU_FOREACH(cs) { cpu_interrupt(cs, CPU_INTERRUPT_NMI); } + return true; } static void hppa_machine_init_class_init(ObjectClass *oc, void *data) diff --git a/hw/i386/x86.c b/hw/i386/x86.c index eaff4227bd..8bd0691705 100644 --- a/hw/i386/x86.c +++ b/hw/i386/x86.c @@ -501,7 +501,7 @@ const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms) return ms->possible_cpus; } -static void x86_nmi(NMIState *n, int cpu_index, Error **errp) +static bool x86_nmi(NMIState *n, int cpu_index, Error **errp) { /* cpu index isn't used */ CPUState *cs; @@ -515,6 +515,7 @@ static void x86_nmi(NMIState *n, int cpu_index, Error **errp) apic_deliver_nmi(cpu->apic_state); } } + return true; } static long get_file_size(FILE *f) diff --git a/hw/intc/m68k_irqc.c b/hw/intc/m68k_irqc.c index 0c515e4ecb..e05083e756 100644 --- a/hw/intc/m68k_irqc.c +++ b/hw/intc/m68k_irqc.c @@ -70,9 +70,11 @@ static void m68k_irqc_instance_init(Object *obj) qdev_init_gpio_in(DEVICE(obj), m68k_set_irq, M68K_IRQC_LEVEL_NUM); } -static void m68k_nmi(NMIState *n, int cpu_index, Error **errp) +static bool m68k_nmi(NMIState *n, int cpu_index, Error **errp) { m68k_set_irq(n, M68K_IRQC_LEVEL_7, 1); + + return true; } static const VMStateDescription vmstate_m68k_irqc = { diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index 9d52ca6613..8631a226cd 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -227,13 +227,15 @@ static void glue_auxmode_set_irq(void *opaque, int irq, int level) s->auxmode = level; } -static void glue_nmi(NMIState *n, int cpu_index, Error **errp) +static bool glue_nmi(NMIState *n, int cpu_index, Error **errp) { GLUEState *s = GLUE(n); /* Hold NMI active for 100ms */ GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 1); timer_mod(s->nmi_release, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 100); + + return true; } static void glue_nmi_release(void *opaque) diff --git a/hw/misc/macio/gpio.c b/hw/misc/macio/gpio.c index c8ac5633b2..0a7214421c 100644 --- a/hw/misc/macio/gpio.c +++ b/hw/misc/macio/gpio.c @@ -182,10 +182,12 @@ static void macio_gpio_reset(DeviceState *dev) macio_set_gpio(s, 1, true); } -static void macio_gpio_nmi(NMIState *n, int cpu_index, Error **errp) +static bool macio_gpio_nmi(NMIState *n, int cpu_index, Error **errp) { macio_set_gpio(MACIO_GPIO(n), 9, true); macio_set_gpio(MACIO_GPIO(n), 9, false); + + return true; } static void macio_gpio_class_init(ObjectClass *oc, void *data) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 44b1fbbc93..38e69f3b39 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -2309,13 +2309,14 @@ static void pnv_cpu_do_nmi_on_cpu(CPUState *cs, run_on_cpu_data arg) } } -static void pnv_nmi(NMIState *n, int cpu_index, Error **errp) +static bool pnv_nmi(NMIState *n, int cpu_index, Error **errp) { CPUState *cs; CPU_FOREACH(cs) { async_run_on_cpu(cs, pnv_cpu_do_nmi_on_cpu, RUN_ON_CPU_NULL); } + return true; } static void pnv_machine_class_init(ObjectClass *oc, void *data) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 4921198b9d..d298068169 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3464,13 +3464,14 @@ void spapr_do_system_reset_on_cpu(CPUState *cs, run_on_cpu_data arg) } } -static void spapr_nmi(NMIState *n, int cpu_index, Error **errp) +static bool spapr_nmi(NMIState *n, int cpu_index, Error **errp) { CPUState *cs; CPU_FOREACH(cs) { async_run_on_cpu(cs, spapr_do_system_reset_on_cpu, RUN_ON_CPU_NULL); } + return true; } int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index f22f61b8b6..af7e6c632a 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -570,11 +570,13 @@ static HotplugHandler *s390_get_hotplug_handler(MachineState *machine, return NULL; } -static void s390_nmi(NMIState *n, int cpu_index, Error **errp) +static bool s390_nmi(NMIState *n, int cpu_index, Error **errp) { CPUState *cs = qemu_get_cpu(cpu_index); s390_cpu_restart(S390_CPU(cs)); + + return true; } static ram_addr_t s390_fixup_ram_size(ram_addr_t sz) diff --git a/include/hw/nmi.h b/include/hw/nmi.h index fff41bebc6..3e827a254a 100644 --- a/include/hw/nmi.h +++ b/include/hw/nmi.h @@ -37,7 +37,8 @@ typedef struct NMIState NMIState; struct NMIClass { InterfaceClass parent_class; - void (*nmi_monitor_handler)(NMIState *n, int cpu_index, Error **errp); + /** Returns: %true on success, %false on error. */ + bool (*nmi_monitor_handler)(NMIState *n, int cpu_index, Error **errp); }; void nmi_monitor_handle(int cpu_index, Error **errp); -- 2.38.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/5] hw/nmi: Have nmi_monitor_handler() return a boolean indicating error 2023-02-16 12:25 ` [PATCH 1/5] hw/nmi: Have nmi_monitor_handler() return a boolean indicating error Philippe Mathieu-Daudé @ 2023-02-23 15:26 ` Markus Armbruster 0 siblings, 0 replies; 14+ messages in thread From: Markus Armbruster @ 2023-02-23 15:26 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Richard Henderson, Helge Deller, Paolo Bonzini, Eduardo Habkost, Michael S. Tsirkin, Marcel Apfelbaum, Laurent Vivier, Mark Cave-Ayland, Cédric Le Goater, Daniel Henrique Barboza, David Gibson, Greg Kurz, Thomas Huth, David Hildenbrand, Ilya Leoshkevich, Halil Pasic, Christian Borntraeger, Eric Farman Philippe Mathieu-Daudé <philmd@linaro.org> writes: > Following the example documented since commit e3fe3988d7 ("error: > Document Error API usage rules"), have the nmi_monitor_handler > return a boolean indicating whether an error is set or not and > convert its implementations. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > hw/core/nmi.c | 3 +-- > hw/hppa/machine.c | 3 ++- > hw/i386/x86.c | 3 ++- > hw/intc/m68k_irqc.c | 4 +++- > hw/m68k/q800.c | 4 +++- > hw/misc/macio/gpio.c | 4 +++- > hw/ppc/pnv.c | 3 ++- > hw/ppc/spapr.c | 3 ++- > hw/s390x/s390-virtio-ccw.c | 4 +++- > include/hw/nmi.h | 3 ++- > 10 files changed, 23 insertions(+), 11 deletions(-) > > diff --git a/hw/core/nmi.c b/hw/core/nmi.c > index 481c4b3c7e..76cb3ba3b0 100644 > --- a/hw/core/nmi.c > +++ b/hw/core/nmi.c > @@ -43,8 +43,7 @@ static int do_nmi(Object *o, void *opaque) > NMIClass *nc = NMI_GET_CLASS(n); > > ns->handled = true; > - nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err); > - if (ns->err) { > + if (!nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err)) { > return -1; > } > } > diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c > index 7ac68c943f..da7c36c554 100644 > --- a/hw/hppa/machine.c > +++ b/hw/hppa/machine.c > @@ -437,13 +437,14 @@ static void hppa_machine_reset(MachineState *ms, ShutdownCause reason) > cpu[0]->env.gr[19] = FW_CFG_IO_BASE; > } > > -static void hppa_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool hppa_nmi(NMIState *n, int cpu_index, Error **errp) > { > CPUState *cs; > > CPU_FOREACH(cs) { > cpu_interrupt(cs, CPU_INTERRUPT_NMI); > } > + return true; > } > > static void hppa_machine_init_class_init(ObjectClass *oc, void *data) > diff --git a/hw/i386/x86.c b/hw/i386/x86.c > index eaff4227bd..8bd0691705 100644 > --- a/hw/i386/x86.c > +++ b/hw/i386/x86.c > @@ -501,7 +501,7 @@ const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms) > return ms->possible_cpus; > } > > -static void x86_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool x86_nmi(NMIState *n, int cpu_index, Error **errp) > { > /* cpu index isn't used */ > CPUState *cs; > @@ -515,6 +515,7 @@ static void x86_nmi(NMIState *n, int cpu_index, Error **errp) > apic_deliver_nmi(cpu->apic_state); > } > } > + return true; > } > > static long get_file_size(FILE *f) > diff --git a/hw/intc/m68k_irqc.c b/hw/intc/m68k_irqc.c > index 0c515e4ecb..e05083e756 100644 > --- a/hw/intc/m68k_irqc.c > +++ b/hw/intc/m68k_irqc.c > @@ -70,9 +70,11 @@ static void m68k_irqc_instance_init(Object *obj) > qdev_init_gpio_in(DEVICE(obj), m68k_set_irq, M68K_IRQC_LEVEL_NUM); > } > > -static void m68k_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool m68k_nmi(NMIState *n, int cpu_index, Error **errp) > { > m68k_set_irq(n, M68K_IRQC_LEVEL_7, 1); > + > + return true; > } > > static const VMStateDescription vmstate_m68k_irqc = { > diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c > index 9d52ca6613..8631a226cd 100644 > --- a/hw/m68k/q800.c > +++ b/hw/m68k/q800.c > @@ -227,13 +227,15 @@ static void glue_auxmode_set_irq(void *opaque, int irq, int level) > s->auxmode = level; > } > > -static void glue_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool glue_nmi(NMIState *n, int cpu_index, Error **errp) > { > GLUEState *s = GLUE(n); > > /* Hold NMI active for 100ms */ > GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 1); > timer_mod(s->nmi_release, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 100); > + > + return true; > } > > static void glue_nmi_release(void *opaque) > diff --git a/hw/misc/macio/gpio.c b/hw/misc/macio/gpio.c > index c8ac5633b2..0a7214421c 100644 > --- a/hw/misc/macio/gpio.c > +++ b/hw/misc/macio/gpio.c > @@ -182,10 +182,12 @@ static void macio_gpio_reset(DeviceState *dev) > macio_set_gpio(s, 1, true); > } > > -static void macio_gpio_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool macio_gpio_nmi(NMIState *n, int cpu_index, Error **errp) > { > macio_set_gpio(MACIO_GPIO(n), 9, true); > macio_set_gpio(MACIO_GPIO(n), 9, false); > + > + return true; > } > > static void macio_gpio_class_init(ObjectClass *oc, void *data) > diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c > index 44b1fbbc93..38e69f3b39 100644 > --- a/hw/ppc/pnv.c > +++ b/hw/ppc/pnv.c > @@ -2309,13 +2309,14 @@ static void pnv_cpu_do_nmi_on_cpu(CPUState *cs, run_on_cpu_data arg) > } > } > > -static void pnv_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool pnv_nmi(NMIState *n, int cpu_index, Error **errp) > { > CPUState *cs; > > CPU_FOREACH(cs) { > async_run_on_cpu(cs, pnv_cpu_do_nmi_on_cpu, RUN_ON_CPU_NULL); > } > + return true; > } > > static void pnv_machine_class_init(ObjectClass *oc, void *data) > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 4921198b9d..d298068169 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -3464,13 +3464,14 @@ void spapr_do_system_reset_on_cpu(CPUState *cs, run_on_cpu_data arg) > } > } > > -static void spapr_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool spapr_nmi(NMIState *n, int cpu_index, Error **errp) > { > CPUState *cs; > > CPU_FOREACH(cs) { > async_run_on_cpu(cs, spapr_do_system_reset_on_cpu, RUN_ON_CPU_NULL); > } > + return true; > } > > int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c > index f22f61b8b6..af7e6c632a 100644 > --- a/hw/s390x/s390-virtio-ccw.c > +++ b/hw/s390x/s390-virtio-ccw.c > @@ -570,11 +570,13 @@ static HotplugHandler *s390_get_hotplug_handler(MachineState *machine, > return NULL; > } > > -static void s390_nmi(NMIState *n, int cpu_index, Error **errp) > +static bool s390_nmi(NMIState *n, int cpu_index, Error **errp) > { > CPUState *cs = qemu_get_cpu(cpu_index); > > s390_cpu_restart(S390_CPU(cs)); > + > + return true; > } > > static ram_addr_t s390_fixup_ram_size(ram_addr_t sz) > diff --git a/include/hw/nmi.h b/include/hw/nmi.h > index fff41bebc6..3e827a254a 100644 > --- a/include/hw/nmi.h > +++ b/include/hw/nmi.h > @@ -37,7 +37,8 @@ typedef struct NMIState NMIState; > struct NMIClass { > InterfaceClass parent_class; > > - void (*nmi_monitor_handler)(NMIState *n, int cpu_index, Error **errp); > + /** Returns: %true on success, %false on error. */ > + bool (*nmi_monitor_handler)(NMIState *n, int cpu_index, Error **errp); > }; > > void nmi_monitor_handle(int cpu_index, Error **errp); None of the handlers can actually fail. Evidence: you add only return true, never return false. Correct (I checked). I think I'd make it official and drop the handler's Error ** parameter instead of changing its return type. You decide. Reviewed-by: Markus Armbruster <armbru@redhat.com> ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/5] spapr/ddw: Remove confuse return value in spapr_phb_get_free_liobn() 2023-02-16 12:25 [PATCH 0/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé 2023-02-16 12:25 ` [PATCH 1/5] hw/nmi: Have nmi_monitor_handler() return a boolean indicating error Philippe Mathieu-Daudé @ 2023-02-16 12:25 ` Philippe Mathieu-Daudé 2023-02-17 10:31 ` Daniel Henrique Barboza 2023-02-16 12:25 ` [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé ` (2 subsequent siblings) 4 siblings, 1 reply; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-16 12:25 UTC (permalink / raw) To: qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Philippe Mathieu-Daudé, Daniel Henrique Barboza, Cédric Le Goater, David Gibson, Greg Kurz The '1' returned value isn't used because spapr_phb_get_free_liobn_cb() isn't called recursively (it is only called once in spapr_phb_get_free_liobn()). The next commit will convert object_child_foreach() handlers to return a boolean indicating error. Remove this value to avoid confusion. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- hw/ppc/spapr_rtas_ddw.c | 1 - 1 file changed, 1 deletion(-) diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c index 7ba11382bc..98f1310c6e 100644 --- a/hw/ppc/spapr_rtas_ddw.c +++ b/hw/ppc/spapr_rtas_ddw.c @@ -51,7 +51,6 @@ static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) tcet = (SpaprTceTable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE); if (tcet && !tcet->nb_table) { *(uint32_t *)opaque = tcet->liobn; - return 1; } return 0; } -- 2.38.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 2/5] spapr/ddw: Remove confuse return value in spapr_phb_get_free_liobn() 2023-02-16 12:25 ` [PATCH 2/5] spapr/ddw: Remove confuse return value in spapr_phb_get_free_liobn() Philippe Mathieu-Daudé @ 2023-02-17 10:31 ` Daniel Henrique Barboza 0 siblings, 0 replies; 14+ messages in thread From: Daniel Henrique Barboza @ 2023-02-17 10:31 UTC (permalink / raw) To: Philippe Mathieu-Daudé, qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Cédric Le Goater, David Gibson, Greg Kurz On 2/16/23 09:25, Philippe Mathieu-Daudé wrote: > The '1' returned value isn't used because > spapr_phb_get_free_liobn_cb() isn't called recursively > (it is only called once in spapr_phb_get_free_liobn()). > > The next commit will convert object_child_foreach() > handlers to return a boolean indicating error. > Remove this value to avoid confusion. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> > hw/ppc/spapr_rtas_ddw.c | 1 - > 1 file changed, 1 deletion(-) > > diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c > index 7ba11382bc..98f1310c6e 100644 > --- a/hw/ppc/spapr_rtas_ddw.c > +++ b/hw/ppc/spapr_rtas_ddw.c > @@ -51,7 +51,6 @@ static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) > tcet = (SpaprTceTable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE); > if (tcet && !tcet->nb_table) { > *(uint32_t *)opaque = tcet->liobn; > - return 1; > } > return 0; > } ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean 2023-02-16 12:25 [PATCH 0/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé 2023-02-16 12:25 ` [PATCH 1/5] hw/nmi: Have nmi_monitor_handler() return a boolean indicating error Philippe Mathieu-Daudé 2023-02-16 12:25 ` [PATCH 2/5] spapr/ddw: Remove confuse return value in spapr_phb_get_free_liobn() Philippe Mathieu-Daudé @ 2023-02-16 12:25 ` Philippe Mathieu-Daudé 2023-02-16 12:30 ` Michael S. Tsirkin 2023-02-23 15:40 ` Markus Armbruster 2023-02-16 12:25 ` [RFC PATCH 4/5] hw/nmi: Simplify nmi_monitor_handle() and do_nmi() Philippe Mathieu-Daudé 2023-02-16 12:25 ` [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() Philippe Mathieu-Daudé 4 siblings, 2 replies; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-16 12:25 UTC (permalink / raw) To: qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Philippe Mathieu-Daudé, Marc-André Lureau, Paolo Bonzini, Alex Bennée, Michael S. Tsirkin, Igor Mammedov, Ani Sinha, Jean-Philippe Brucker, Peter Maydell, Shannon Zhao, Eduardo Habkost, Marcel Apfelbaum, Yanan Wang, Daniel P. Berrangé, Gerd Hoffmann, Richard Henderson, Peter Xu, Jason Wang, David Hildenbrand, Xiao Guangrong, Mark Cave-Ayland, Cédric Le Goater, Daniel Henrique Barboza, David Gibson, Greg Kurz, Yuval Shaia, Dr. David Alan Gilbert, Fam Zheng, Alexander Bulekov, Bandan Das, Stefan Hajnoczi, Thomas Huth, Darren Kenny, Qiuhao Li, Laurent Vivier Following the Error API best practices documented in commit e3fe3988d7 ("error: Document Error API usage rules"), have the object_child_foreach[_recursive]() handler take a Error* argument and return a boolean indicating whether this error is set or not. Convert all handler implementations. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- chardev/char-mux.c | 6 ++-- chardev/char.c | 6 ++-- gdbstub/gdbstub.c | 8 +++--- hw/acpi/cxl.c | 7 +++-- hw/acpi/viot.c | 6 ++-- hw/arm/boot.c | 6 ++-- hw/arm/virt-acpi-build.c | 8 +++--- hw/core/machine-qmp-cmds.c | 18 ++++++------ hw/core/nmi.c | 8 +++--- hw/core/qdev.c | 8 ++++-- hw/core/sysbus.c | 10 +++---- hw/cpu/cluster.c | 7 +++-- hw/display/virtio-gpu-udmabuf.c | 7 +++-- hw/i386/acpi-build.c | 16 +++++------ hw/i386/intel_iommu.c | 7 +++-- hw/i386/pc.c | 13 ++++----- hw/i386/sgx.c | 7 ++--- hw/mem/memory-device.c | 25 ++++++++--------- hw/mem/pc-dimm.c | 8 +++--- hw/misc/mos6522.c | 6 ++-- hw/ppc/pnv.c | 15 +++++----- hw/ppc/pnv_bmc.c | 9 +++--- hw/ppc/pnv_xscom.c | 6 ++-- hw/ppc/spapr_pci.c | 50 ++++++++++++++++----------------- hw/ppc/spapr_rtas_ddw.c | 16 +++++++---- hw/rdma/vmw/pvrdma_main.c | 7 +++-- hw/virtio/virtio-balloon.c | 7 ++--- include/qom/object.h | 28 ++++++++++-------- iothread.c | 8 +++--- monitor/hmp-cmds.c | 6 ++-- qom/object.c | 36 ++++++++++++------------ qom/qom-hmp-cmds.c | 7 +++-- scsi/pr-manager.c | 8 +++--- softmmu/physmem.c | 13 +++++---- softmmu/qdev-monitor.c | 9 +++--- tests/qtest/fuzz/generic_fuzz.c | 6 ++-- ui/dbus-chardev.c | 14 ++++----- util/nvdimm-utils.c | 8 +++--- 38 files changed, 225 insertions(+), 215 deletions(-) diff --git a/chardev/char-mux.c b/chardev/char-mux.c index ee2d47b20d..17b5854e4c 100644 --- a/chardev/char-mux.c +++ b/chardev/char-mux.c @@ -384,7 +384,7 @@ void suspend_mux_open(void) muxes_opened = false; } -static int chardev_options_parsed_cb(Object *child, void *opaque) +static bool chardev_options_parsed_cb(Object *child, void *opaque, Error **errp) { Chardev *chr = (Chardev *)child; @@ -392,14 +392,14 @@ static int chardev_options_parsed_cb(Object *child, void *opaque) open_muxes(chr); } - return 0; + return true; } void resume_mux_open(void) { muxes_opened = true; object_child_foreach(get_chardevs_root(), - chardev_options_parsed_cb, NULL); + chardev_options_parsed_cb, NULL, NULL); } static void char_mux_class_init(ObjectClass *oc, void *data) diff --git a/chardev/char.c b/chardev/char.c index 11eab7764c..542b835477 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -742,7 +742,7 @@ Chardev *qemu_chr_new_mux_mon(const char *label, const char *filename, return qemu_chr_new_permit_mux_mon(label, filename, true, context); } -static int qmp_query_chardev_foreach(Object *obj, void *data) +static bool qmp_query_chardev_foreach(Object *obj, void *data, Error **errp) { Chardev *chr = CHARDEV(obj); ChardevInfoList **list = data; @@ -754,7 +754,7 @@ static int qmp_query_chardev_foreach(Object *obj, void *data) QAPI_LIST_PREPEND(*list, value); - return 0; + return true; } ChardevInfoList *qmp_query_chardev(Error **errp) @@ -762,7 +762,7 @@ ChardevInfoList *qmp_query_chardev(Error **errp) ChardevInfoList *chr_list = NULL; object_child_foreach(get_chardevs_root(), - qmp_query_chardev_foreach, &chr_list); + qmp_query_chardev_foreach, &chr_list, NULL); return chr_list; } diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index be88ca0d71..73d6352be5 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -3379,7 +3379,7 @@ static const TypeInfo char_gdb_type_info = { .class_init = char_gdb_class_init, }; -static int find_cpu_clusters(Object *child, void *opaque) +static bool find_cpu_clusters(Object *child, void *opaque, Error **errp) { if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) { GDBState *s = (GDBState *) opaque; @@ -3400,10 +3400,10 @@ static int find_cpu_clusters(Object *child, void *opaque) process->attached = false; process->target_xml[0] = '\0'; - return 0; + return true; } - return object_child_foreach(child, find_cpu_clusters, opaque); + return object_child_foreach(child, find_cpu_clusters, opaque, errp); } static int pid_order(const void *a, const void *b) @@ -3422,7 +3422,7 @@ static int pid_order(const void *a, const void *b) static void create_processes(GDBState *s) { - object_child_foreach(object_get_root(), find_cpu_clusters, s); + object_child_foreach(object_get_root(), find_cpu_clusters, s, NULL); if (gdbserver_state.processes) { /* Sort by PID */ diff --git a/hw/acpi/cxl.c b/hw/acpi/cxl.c index 2bf8c07993..853be6f75a 100644 --- a/hw/acpi/cxl.c +++ b/hw/acpi/cxl.c @@ -117,7 +117,7 @@ static void cedt_build_cfmws(GArray *table_data, CXLState *cxls) } } -static int cxl_foreach_pxb_hb(Object *obj, void *opaque) +static bool cxl_foreach_pxb_hb(Object *obj, void *opaque, Error **errp) { Aml *cedt = opaque; @@ -125,7 +125,7 @@ static int cxl_foreach_pxb_hb(Object *obj, void *opaque) cedt_build_chbs(cedt->buf, PXB_CXL_DEV(obj)); } - return 0; + return true; } void cxl_build_cedt(GArray *table_offsets, GArray *table_data, @@ -142,7 +142,8 @@ void cxl_build_cedt(GArray *table_offsets, GArray *table_data, /* reserve space for CEDT header */ - object_child_foreach_recursive(object_get_root(), cxl_foreach_pxb_hb, cedt); + object_child_foreach_recursive(object_get_root(), cxl_foreach_pxb_hb, + cedt, NULL); cedt_build_cfmws(cedt->buf, cxl_state); /* copy AML table into ACPI tables blob and patch header there */ diff --git a/hw/acpi/viot.c b/hw/acpi/viot.c index 4e0bf69067..9099cd9c15 100644 --- a/hw/acpi/viot.c +++ b/hw/acpi/viot.c @@ -41,7 +41,7 @@ static void build_pci_host_range(GArray *table_data, int min_bus, int max_bus, } /* Build PCI range for a given PCI host bridge */ -static int enumerate_pci_host_bridges(Object *obj, void *opaque) +static bool enumerate_pci_host_bridges(Object *obj, void *opaque, Error **errp) { GArray *pci_host_ranges = opaque; @@ -61,7 +61,7 @@ static int enumerate_pci_host_bridges(Object *obj, void *opaque) } } - return 0; + return true; } static gint pci_host_range_compare(gconstpointer a, gconstpointer b) @@ -99,7 +99,7 @@ void build_viot(MachineState *ms, GArray *table_data, BIOSLinker *linker, /* Build the list of PCI ranges that this viommu manages */ object_child_foreach_recursive(OBJECT(ms), enumerate_pci_host_bridges, - pci_host_ranges); + pci_host_ranges, NULL); /* Sort the pci host ranges by min_bus */ g_array_sort(pci_host_ranges, pci_host_range_compare); diff --git a/hw/arm/boot.c b/hw/arm/boot.c index 3d7d11f782..64eda44f1d 100644 --- a/hw/arm/boot.c +++ b/hw/arm/boot.c @@ -831,7 +831,7 @@ static void do_cpu_reset(void *opaque) } } -static int do_arm_linux_init(Object *obj, void *opaque) +static bool do_arm_linux_init(Object *obj, void *opaque, Error **errp) { if (object_dynamic_cast(obj, TYPE_ARM_LINUX_BOOT_IF)) { ARMLinuxBootIf *albif = ARM_LINUX_BOOT_IF(obj); @@ -842,7 +842,7 @@ static int do_arm_linux_init(Object *obj, void *opaque) albifc->arm_linux_init(albif, info->secure_boot); } } - return 0; + return true; } static ssize_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry, @@ -1185,7 +1185,7 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu, * that we're doing a direct kernel boot. */ object_child_foreach_recursive(object_get_root(), - do_arm_linux_init, info); + do_arm_linux_init, info, NULL); } info->is_linux = is_linux; diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 4156111d49..17e25c7f0f 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -266,8 +266,8 @@ struct AcpiIortIdMapping { typedef struct AcpiIortIdMapping AcpiIortIdMapping; /* Build the iort ID mapping to SMMUv3 for a given PCI host bridge */ -static int -iort_host_bridges(Object *obj, void *opaque) +static bool +iort_host_bridges(Object *obj, void *opaque, Error **errp) { GArray *idmap_blob = opaque; @@ -287,7 +287,7 @@ iort_host_bridges(Object *obj, void *opaque) } } - return 0; + return true; } static int iort_idmap_compare(gconstpointer a, gconstpointer b) @@ -323,7 +323,7 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) AcpiIortIdMapping next_range = {0}; object_child_foreach_recursive(object_get_root(), - iort_host_bridges, smmu_idmaps); + iort_host_bridges, smmu_idmaps, NULL); /* Sort the smmu idmap by input_base */ g_array_sort(smmu_idmaps, iort_idmap_compare); diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c index 44b5da8880..06aa5830b5 100644 --- a/hw/core/machine-qmp-cmds.c +++ b/hw/core/machine-qmp-cmds.c @@ -157,7 +157,7 @@ void qmp_set_numa_node(NumaOptions *cmd, Error **errp) set_numa_options(MACHINE(qdev_get_machine()), cmd, errp); } -static int query_memdev(Object *obj, void *opaque) +static bool query_memdev(Object *obj, void *opaque, Error **errp) { Error *err = NULL; MemdevList **list = opaque; @@ -194,7 +194,7 @@ static int query_memdev(Object *obj, void *opaque) QAPI_LIST_PREPEND(*list, m); } - return 0; + return true; } MemdevList *qmp_query_memdev(Error **errp) @@ -202,7 +202,7 @@ MemdevList *qmp_query_memdev(Error **errp) Object *obj = object_get_objects_root(); MemdevList *list = NULL; - object_child_foreach(obj, query_memdev, &list); + object_child_foreach(obj, query_memdev, &list, errp); return list; } @@ -303,7 +303,7 @@ MemoryInfo *qmp_query_memory_size_summary(Error **errp) return mem_info; } -static int qmp_x_query_rdma_foreach(Object *obj, void *opaque) +static bool qmp_x_query_rdma_foreach(Object *obj, void *opaque, Error **errp) { RdmaProvider *rdma; RdmaProviderClass *k; @@ -321,7 +321,7 @@ static int qmp_x_query_rdma_foreach(Object *obj, void *opaque) } } - return 0; + return true; } HumanReadableText *qmp_x_query_rdma(Error **errp) @@ -329,7 +329,7 @@ HumanReadableText *qmp_x_query_rdma(Error **errp) g_autoptr(GString) buf = g_string_new(""); object_child_foreach_recursive(object_get_root(), - qmp_x_query_rdma_foreach, buf); + qmp_x_query_rdma_foreach, buf, NULL); return human_readable_text_from_str(buf); } @@ -341,7 +341,7 @@ HumanReadableText *qmp_x_query_ramblock(Error **errp) return human_readable_text_from_str(buf); } -static int qmp_x_query_irq_foreach(Object *obj, void *opaque) +static bool qmp_x_query_irq_foreach(Object *obj, void *opaque, Error **errp) { InterruptStatsProvider *intc; InterruptStatsProviderClass *k; @@ -371,7 +371,7 @@ static int qmp_x_query_irq_foreach(Object *obj, void *opaque) } } - return 0; + return true; } HumanReadableText *qmp_x_query_irq(Error **errp) @@ -379,7 +379,7 @@ HumanReadableText *qmp_x_query_irq(Error **errp) g_autoptr(GString) buf = g_string_new(""); object_child_foreach_recursive(object_get_root(), - qmp_x_query_irq_foreach, buf); + qmp_x_query_irq_foreach, buf, NULL); return human_readable_text_from_str(buf); } diff --git a/hw/core/nmi.c b/hw/core/nmi.c index 76cb3ba3b0..fa74c405f7 100644 --- a/hw/core/nmi.c +++ b/hw/core/nmi.c @@ -34,7 +34,7 @@ struct do_nmi_s { static void nmi_children(Object *o, struct do_nmi_s *ns); -static int do_nmi(Object *o, void *opaque) +static bool do_nmi(Object *o, void *opaque, Error **errp) { struct do_nmi_s *ns = opaque; NMIState *n = (NMIState *) object_dynamic_cast(o, TYPE_NMI); @@ -44,17 +44,17 @@ static int do_nmi(Object *o, void *opaque) ns->handled = true; if (!nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err)) { - return -1; + return false; } } nmi_children(o, ns); - return 0; + return true; } static void nmi_children(Object *o, struct do_nmi_s *ns) { - object_child_foreach(o, do_nmi, ns); + object_child_foreach(o, do_nmi, ns, NULL); } void nmi_monitor_handle(int cpu_index, Error **errp) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index d759c4602c..949e89022e 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -306,7 +306,8 @@ void qdev_unrealize(DeviceState *dev) object_property_set_bool(OBJECT(dev), "realized", false, &error_abort); } -static int qdev_assert_realized_properly_cb(Object *obj, void *opaque) +static bool qdev_assert_realized_properly_cb(Object *obj, void *opaque, + Error **errp) { DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE)); DeviceClass *dc; @@ -316,13 +317,14 @@ static int qdev_assert_realized_properly_cb(Object *obj, void *opaque) assert(dev->realized); assert(dev->parent_bus || !dc->bus_type); } - return 0; + return true; } void qdev_assert_realized_properly(void) { object_child_foreach_recursive(object_get_root(), - qdev_assert_realized_properly_cb, NULL); + qdev_assert_realized_properly_cb, + NULL, NULL); } bool qdev_machine_modified(void) diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c index 35f902b582..41e70775b0 100644 --- a/hw/core/sysbus.c +++ b/hw/core/sysbus.c @@ -33,7 +33,7 @@ typedef struct SysBusFind { } SysBusFind; /* Run func() for every sysbus device, traverse the tree for everything else */ -static int find_sysbus_device(Object *obj, void *opaque) +static bool find_sysbus_device(Object *obj, void *opaque, Error **errp) { SysBusFind *find = opaque; Object *dev; @@ -44,12 +44,12 @@ static int find_sysbus_device(Object *obj, void *opaque) if (!sbdev) { /* Container, traverse it for children */ - return object_child_foreach(obj, find_sysbus_device, opaque); + return object_child_foreach(obj, find_sysbus_device, opaque, errp); } find->func(sbdev, find->opaque); - return 0; + return true; } /* @@ -66,9 +66,9 @@ void foreach_dynamic_sysbus_device(FindSysbusDeviceFunc *func, void *opaque) /* Loop through all sysbus devices that were spawned outside the machine */ container = container_get(qdev_get_machine(), "/peripheral"); - find_sysbus_device(container, &find); + find_sysbus_device(container, &find, NULL); container = container_get(qdev_get_machine(), "/peripheral-anon"); - find_sysbus_device(container, &find); + find_sysbus_device(container, &find, NULL); } diff --git a/hw/cpu/cluster.c b/hw/cpu/cluster.c index e444b7c29d..bf3e27e945 100644 --- a/hw/cpu/cluster.c +++ b/hw/cpu/cluster.c @@ -36,7 +36,7 @@ typedef struct CallbackData { int cpu_count; } CallbackData; -static int add_cpu_to_cluster(Object *obj, void *opaque) +static bool add_cpu_to_cluster(Object *obj, void *opaque, Error **errp) { CallbackData *cbdata = opaque; CPUState *cpu = (CPUState *)object_dynamic_cast(obj, TYPE_CPU); @@ -45,7 +45,7 @@ static int add_cpu_to_cluster(Object *obj, void *opaque) cpu->cluster_index = cbdata->cluster->cluster_id; cbdata->cpu_count++; } - return 0; + return true; } static void cpu_cluster_realize(DeviceState *dev, Error **errp) @@ -63,7 +63,8 @@ static void cpu_cluster_realize(DeviceState *dev, Error **errp) return; } - object_child_foreach_recursive(cluster_obj, add_cpu_to_cluster, &cbdata); + object_child_foreach_recursive(cluster_obj, add_cpu_to_cluster, + &cbdata, NULL); /* * A cluster with no CPUs is a bug in the board/SoC code that created it; diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabuf.c index 69e2cf0bd6..c3d3ea4f27 100644 --- a/hw/display/virtio-gpu-udmabuf.c +++ b/hw/display/virtio-gpu-udmabuf.c @@ -90,7 +90,7 @@ static void virtio_gpu_destroy_udmabuf(struct virtio_gpu_simple_resource *res) } } -static int find_memory_backend_type(Object *obj, void *opaque) +static bool find_memory_backend_type(Object *obj, void *opaque, Error **errp) { bool *memfd_backend = opaque; int ret; @@ -107,7 +107,7 @@ static int find_memory_backend_type(Object *obj, void *opaque) } } - return 0; + return true; } bool virtio_gpu_have_udmabuf(void) @@ -122,7 +122,8 @@ bool virtio_gpu_have_udmabuf(void) } memdev_root = object_resolve_path("/objects", NULL); - object_child_foreach(memdev_root, find_memory_backend_type, &memfd_backend); + object_child_foreach(memdev_root, find_memory_backend_type, + &memfd_backend, NULL); return memfd_backend; } diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index b67dcbbb37..0079f98304 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2034,8 +2034,8 @@ insert_scope(PCIBus *bus, PCIDevice *dev, void *opaque) } /* For a given PCI host bridge, walk and insert DMAR scope */ -static int -dmar_host_bridges(Object *obj, void *opaque) +static bool +dmar_host_bridges(Object *obj, void *opaque, Error **errp) { GArray *scope_blob = opaque; @@ -2047,7 +2047,7 @@ dmar_host_bridges(Object *obj, void *opaque) } } - return 0; + return true; } /* @@ -2077,7 +2077,7 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker, const char *oem_id, * is attached to a bus with iommu enabled. */ object_child_foreach_recursive(object_get_root(), - dmar_host_bridges, scope_blob); + dmar_host_bridges, scope_blob, NULL); assert(iommu); if (x86_iommu_ir_supported(iommu)) { @@ -2240,8 +2240,8 @@ insert_ivhd(PCIBus *bus, PCIDevice *dev, void *opaque) } /* For all PCI host bridges, walk and insert IVHD entries */ -static int -ivrs_host_bridges(Object *obj, void *opaque) +static bool +ivrs_host_bridges(Object *obj, void *opaque, Error **errp) { GArray *ivhd_blob = opaque; @@ -2253,7 +2253,7 @@ ivrs_host_bridges(Object *obj, void *opaque) } } - return 0; + return true; } static void @@ -2292,7 +2292,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id, * is sufficient when no aliases are present. */ object_child_foreach_recursive(object_get_root(), - ivrs_host_bridges, ivhd_blob); + ivrs_host_bridges, ivhd_blob, NULL); if (!ivhd_blob->len) { /* diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 98a5c304a7..3d7f643dc7 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -4059,7 +4059,8 @@ static bool vtd_decide_config(IntelIOMMUState *s, Error **errp) return true; } -static int vtd_machine_done_notify_one(Object *child, void *unused) +static bool vtd_machine_done_notify_one(Object *child, void *unused, + Error **errp) { IntelIOMMUState *iommu = INTEL_IOMMU_DEVICE(x86_iommu_get_default()); @@ -4072,13 +4073,13 @@ static int vtd_machine_done_notify_one(Object *child, void *unused) vtd_panic_require_caching_mode(); } - return 0; + return true; } static void vtd_machine_done_hook(Notifier *notifier, void *unused) { object_child_foreach_recursive(object_get_root(), - vtd_machine_done_notify_one, NULL); + vtd_machine_done_notify_one, NULL, NULL); } static Notifier vtd_machine_done_notify = { diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 6e592bd969..310ca78560 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -546,22 +546,21 @@ typedef struct check_fdc_state { bool multiple; } CheckFdcState; -static int check_fdc(Object *obj, void *opaque) +static bool check_fdc(Object *obj, void *opaque, Error **errp) { CheckFdcState *state = opaque; Object *fdc; uint32_t iobase; - Error *local_err = NULL; + g_autofree Error *local_err = NULL; fdc = object_dynamic_cast(obj, TYPE_ISA_FDC); if (!fdc) { - return 0; + return true; } iobase = object_property_get_uint(obj, "iobase", &local_err); if (local_err || iobase != 0x3f0) { - error_free(local_err); - return 0; + return true; } if (state->floppy) { @@ -569,7 +568,7 @@ static int check_fdc(Object *obj, void *opaque) } else { state->floppy = ISA_DEVICE(obj); } - return 0; + return true; } static const char * const fdc_container_path[] = { @@ -588,7 +587,7 @@ static ISADevice *pc_find_fdc0(void) for (i = 0; i < ARRAY_SIZE(fdc_container_path); i++) { container = container_get(qdev_get_machine(), fdc_container_path[i]); - object_child_foreach(container, check_fdc, &state); + object_child_foreach(container, check_fdc, &state, NULL); } if (state.multiple) { diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c index db004d17a6..c09ae42a3b 100644 --- a/hw/i386/sgx.c +++ b/hw/i386/sgx.c @@ -37,7 +37,7 @@ #define RETRY_NUM 2 -static int sgx_epc_device_list(Object *obj, void *opaque) +static bool sgx_epc_device_list(Object *obj, void *opaque, Error **errp) { GSList **list = opaque; @@ -45,15 +45,14 @@ static int sgx_epc_device_list(Object *obj, void *opaque) *list = g_slist_append(*list, DEVICE(obj)); } - object_child_foreach(obj, sgx_epc_device_list, opaque); - return 0; + return object_child_foreach(obj, sgx_epc_device_list, opaque); } static GSList *sgx_epc_get_device_list(void) { GSList *list = NULL; - object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list); + object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list, NULL); return list; } diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c index d9f8301711..f0f47c0657 100644 --- a/hw/mem/memory-device.c +++ b/hw/mem/memory-device.c @@ -35,7 +35,7 @@ static gint memory_device_addr_sort(gconstpointer a, gconstpointer b) return 0; } -static int memory_device_build_list(Object *obj, void *opaque) +static bool memory_device_build_list(Object *obj, void *opaque, Error **errp) { GSList **list = opaque; @@ -46,11 +46,11 @@ static int memory_device_build_list(Object *obj, void *opaque) } } - object_child_foreach(obj, memory_device_build_list, opaque); - return 0; + return object_child_foreach(obj, memory_device_build_list, opaque, errp); } -static int memory_device_used_region_size(Object *obj, void *opaque) +static bool memory_device_used_region_size(Object *obj, void *opaque, + Error **errp) { uint64_t *size = opaque; @@ -63,8 +63,8 @@ static int memory_device_used_region_size(Object *obj, void *opaque) } } - object_child_foreach(obj, memory_device_used_region_size, opaque); - return 0; + return object_child_foreach(obj, memory_device_used_region_size, + opaque, errp); } static void memory_device_check_addable(MachineState *ms, uint64_t size, @@ -83,7 +83,7 @@ static void memory_device_check_addable(MachineState *ms, uint64_t size, } /* will we exceed the total amount of memory specified */ - memory_device_used_region_size(OBJECT(ms), &used_region_size); + memory_device_used_region_size(OBJECT(ms), &used_region_size, NULL); if (used_region_size + size < used_region_size || used_region_size + size > ms->maxram_size - ms->ram_size) { error_setg(errp, "not enough space, currently 0x%" PRIx64 @@ -159,7 +159,7 @@ static uint64_t memory_device_get_free_addr(MachineState *ms, } /* find address range that will fit new memory device */ - object_child_foreach(OBJECT(ms), memory_device_build_list, &list); + object_child_foreach(OBJECT(ms), memory_device_build_list, &list, NULL); for (item = list; item; item = g_slist_next(item)) { const MemoryDeviceState *md = item->data; const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(OBJECT(md)); @@ -202,7 +202,7 @@ MemoryDeviceInfoList *qmp_memory_device_list(void) MemoryDeviceInfoList *list = NULL, **tail = &list; object_child_foreach(qdev_get_machine(), memory_device_build_list, - &devices); + &devices, NULL); for (item = devices; item; item = g_slist_next(item)) { const MemoryDeviceState *md = MEMORY_DEVICE(item->data); @@ -219,7 +219,7 @@ MemoryDeviceInfoList *qmp_memory_device_list(void) return list; } -static int memory_device_plugged_size(Object *obj, void *opaque) +static bool memory_device_plugged_size(Object *obj, void *opaque, Error **errp) { uint64_t *size = opaque; @@ -233,15 +233,14 @@ static int memory_device_plugged_size(Object *obj, void *opaque) } } - object_child_foreach(obj, memory_device_plugged_size, opaque); - return 0; + return object_child_foreach(obj, memory_device_plugged_size, opaque, errp); } uint64_t get_plugged_memory_size(void) { uint64_t size = 0; - memory_device_plugged_size(qdev_get_machine(), &size); + memory_device_plugged_size(qdev_get_machine(), &size, NULL); return size; } diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 50ef83215c..4a722416ce 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -92,7 +92,7 @@ void pc_dimm_unplug(PCDIMMDevice *dimm, MachineState *machine) vmstate_unregister_ram(vmstate_mr, DEVICE(dimm)); } -static int pc_dimm_slot2bitmap(Object *obj, void *opaque) +static bool pc_dimm_slot2bitmap(Object *obj, void *opaque, Error **errp) { unsigned long *bitmap = opaque; @@ -104,8 +104,8 @@ static int pc_dimm_slot2bitmap(Object *obj, void *opaque) } } - object_child_foreach(obj, pc_dimm_slot2bitmap, opaque); - return 0; + object_child_foreach(obj, pc_dimm_slot2bitmap, opaque, errp); + return true; } static int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp) @@ -120,7 +120,7 @@ static int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp) } bitmap = bitmap_new(max_slots); - object_child_foreach(qdev_get_machine(), pc_dimm_slot2bitmap, bitmap); + object_child_foreach(qdev_get_machine(), pc_dimm_slot2bitmap, bitmap, NULL); /* check if requested slot is not occupied */ if (hint) { diff --git a/hw/misc/mos6522.c b/hw/misc/mos6522.c index d6ba47bde9..d7a660a4a3 100644 --- a/hw/misc/mos6522.c +++ b/hw/misc/mos6522.c @@ -497,7 +497,7 @@ void mos6522_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) } } -static int qmp_x_query_via_foreach(Object *obj, void *opaque) +static bool qmp_x_query_via_foreach(Object *obj, void *opaque, Error **errp) { GString *buf = opaque; @@ -573,7 +573,7 @@ static int qmp_x_query_via_foreach(Object *obj, void *opaque) get_next_irq_time(s, &s->timers[1], now)); } - return 0; + return true; } static HumanReadableText *qmp_x_query_via(Error **errp) @@ -581,7 +581,7 @@ static HumanReadableText *qmp_x_query_via(Error **errp) g_autoptr(GString) buf = g_string_new(""); object_child_foreach_recursive(object_get_root(), - qmp_x_query_via_foreach, buf); + qmp_x_query_via_foreach, buf, NULL); return human_readable_text_from_str(buf); } diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 38e69f3b39..36b372dd95 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -747,18 +747,17 @@ static void pnv_chip_power8_pic_print_info(PnvChip *chip, Monitor *mon) } } -static int pnv_chip_power9_pic_print_info_child(Object *child, void *opaque) +static bool pnv_chip_power9_pic_print_info_child(Object *child, void *opaque, + Error **errp) { Monitor *mon = opaque; PnvPHB *phb = (PnvPHB *) object_dynamic_cast(child, TYPE_PNV_PHB); - if (!phb) { - return 0; + if (phb) { + pnv_phb4_pic_print_info(PNV_PHB4(phb->backend), mon); } - pnv_phb4_pic_print_info(PNV_PHB4(phb->backend), mon); - - return 0; + return true; } static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon) @@ -769,7 +768,7 @@ static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon) pnv_psi_pic_print_info(&chip9->psi, mon); object_child_foreach_recursive(OBJECT(chip), - pnv_chip_power9_pic_print_info_child, mon); + pnv_chip_power9_pic_print_info_child, mon, NULL); } static uint64_t pnv_chip_power8_xscom_core_base(PnvChip *chip, @@ -817,7 +816,7 @@ static void pnv_chip_power10_pic_print_info(PnvChip *chip, Monitor *mon) pnv_psi_pic_print_info(&chip10->psi, mon); object_child_foreach_recursive(OBJECT(chip), - pnv_chip_power9_pic_print_info_child, mon); + pnv_chip_power9_pic_print_info_child, mon, NULL); } /* Always give the first 1GB to chip 0 else we won't boot */ diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c index 99f1e8d7f9..05acc88a55 100644 --- a/hw/ppc/pnv_bmc.c +++ b/hw/ppc/pnv_bmc.c @@ -283,17 +283,17 @@ typedef struct ForeachArgs { Object *obj; } ForeachArgs; -static int bmc_find(Object *child, void *opaque) +static bool bmc_find(Object *child, void *opaque, Error **errp) { ForeachArgs *args = opaque; if (object_dynamic_cast(child, args->name)) { if (args->obj) { - return 1; + return false; } args->obj = child; } - return 0; + return true; } IPMIBmc *pnv_bmc_find(Error **errp) @@ -301,7 +301,8 @@ IPMIBmc *pnv_bmc_find(Error **errp) ForeachArgs args = { TYPE_IPMI_BMC, NULL }; int ret; - ret = object_child_foreach_recursive(object_get_root(), bmc_find, &args); + ret = object_child_foreach_recursive(object_get_root(), bmc_find, + &args, NULL); if (ret) { error_setg(errp, "machine should have only one BMC device. " "Use '-nodefaults'"); diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c index d820e05e40..c7ca5a5b4c 100644 --- a/hw/ppc/pnv_xscom.c +++ b/hw/ppc/pnv_xscom.c @@ -254,7 +254,7 @@ typedef struct ForeachPopulateArgs { int xscom_offset; } ForeachPopulateArgs; -static int xscom_dt_child(Object *child, void *opaque) +static bool xscom_dt_child(Object *child, void *opaque, Error **errp) { if (object_dynamic_cast(child, TYPE_PNV_XSCOM_INTERFACE)) { ForeachPopulateArgs *args = opaque; @@ -268,7 +268,7 @@ static int xscom_dt_child(Object *child, void *opaque) _FDT((xc->dt_xscom(xd, args->fdt, args->xscom_offset))); } } - return 0; + return true; } int pnv_dt_xscom(PnvChip *chip, void *fdt, int root_offset, @@ -308,7 +308,7 @@ int pnv_dt_xscom(PnvChip *chip, void *fdt, int root_offset, * PnvXScomInterface objects which can lie a bit deeper than the * first layer. */ - object_child_foreach_recursive(OBJECT(chip), xscom_dt_child, &args); + object_child_foreach_recursive(OBJECT(chip), xscom_dt_child, &args, NULL); return 0; } diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 75aacda65a..2eed33ab3b 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1488,28 +1488,31 @@ static void spapr_pci_bridge_plug(SpaprPhbState *phb, } /* Returns non-zero if the value of "chassis_nr" is already in use */ -static int check_chassis_nr(Object *obj, void *opaque) +static bool check_chassis_nr(Object *obj, void *opaque, Error **errp) { - int new_chassis_nr = - object_property_get_uint(opaque, "chassis_nr", &error_abort); - int chassis_nr = - object_property_get_uint(obj, "chassis_nr", NULL); - - if (!object_dynamic_cast(obj, TYPE_PCI_BRIDGE)) { - return 0; - } - - /* Skip unsupported bridge types */ - if (!chassis_nr) { - return 0; - } + int chassis_nr; /* Skip self */ if (obj == opaque) { - return 0; + return true; } - return chassis_nr == new_chassis_nr; + if (!object_dynamic_cast(obj, TYPE_PCI_BRIDGE)) { + return true; + } + + chassis_nr = object_property_get_uint(obj, "chassis_nr", NULL); + /* Skip unsupported bridge types */ + if (!chassis_nr) { + return true; + } + + if (chassis_nr == object_property_get_uint(opaque, "chassis_nr", + &error_abort)) { + error_setg(errp, "Bridge chassis %d already in use", chassis_nr); + return false; + } + return true; } static bool bridge_has_valid_chassis_nr(Object *bridge, Error **errp) @@ -1529,13 +1532,8 @@ static bool bridge_has_valid_chassis_nr(Object *bridge, Error **errp) } /* We want unique values for "chassis_nr" */ - if (object_child_foreach_recursive(object_get_root(), check_chassis_nr, - bridge)) { - error_setg(errp, "Bridge chassis %d already in use", chassis_nr); - return false; - } - - return true; + return object_child_foreach_recursive(object_get_root(), check_chassis_nr, + bridge, errp); } static void spapr_pci_pre_plug(HotplugHandler *plug_handler, @@ -2035,7 +2033,7 @@ unrealize: spapr_phb_unrealize(dev); } -static int spapr_phb_children_reset(Object *child, void *opaque) +static bool spapr_phb_children_reset(Object *child, void *opaque, Error **errp) { DeviceState *dev = (DeviceState *) object_dynamic_cast(child, TYPE_DEVICE); @@ -2043,7 +2041,7 @@ static int spapr_phb_children_reset(Object *child, void *opaque) device_cold_reset(dev); } - return 0; + return true; } void spapr_phb_dma_reset(SpaprPhbState *sphb) @@ -2079,7 +2077,7 @@ static void spapr_phb_reset(DeviceState *qdev) } /* Reset the IOMMU state */ - object_child_foreach(OBJECT(qdev), spapr_phb_children_reset, NULL); + object_child_foreach(OBJECT(qdev), spapr_phb_children_reset, NULL, NULL); if (spapr_phb_eeh_available(SPAPR_PCI_HOST_BRIDGE(qdev))) { spapr_phb_vfio_reset(qdev); diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c index 98f1310c6e..48ba59e4b3 100644 --- a/hw/ppc/spapr_rtas_ddw.c +++ b/hw/ppc/spapr_rtas_ddw.c @@ -24,7 +24,8 @@ #include "hw/pci-host/spapr.h" #include "trace.h" -static int spapr_phb_get_active_win_num_cb(Object *child, void *opaque) +static bool spapr_phb_get_active_win_num_cb(Object *child, void *opaque, + Error **errp) { SpaprTceTable *tcet; @@ -32,19 +33,21 @@ static int spapr_phb_get_active_win_num_cb(Object *child, void *opaque) if (tcet && tcet->nb_table) { ++*(unsigned *)opaque; } - return 0; + return true; } static unsigned spapr_phb_get_active_win_num(SpaprPhbState *sphb) { unsigned ret = 0; - object_child_foreach(OBJECT(sphb), spapr_phb_get_active_win_num_cb, &ret); + object_child_foreach(OBJECT(sphb), spapr_phb_get_active_win_num_cb, + &ret, NULL); return ret; } -static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) +static bool spapr_phb_get_free_liobn_cb(Object *child, void *opaque, + Error **errp) { SpaprTceTable *tcet; @@ -52,14 +55,15 @@ static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) if (tcet && !tcet->nb_table) { *(uint32_t *)opaque = tcet->liobn; } - return 0; + return true; } static unsigned spapr_phb_get_free_liobn(SpaprPhbState *sphb) { uint32_t liobn = 0; - object_child_foreach(OBJECT(sphb), spapr_phb_get_free_liobn_cb, &liobn); + object_child_foreach(OBJECT(sphb), spapr_phb_get_free_liobn_cb, + &liobn, NULL); return liobn; } diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c index 4fc6712025..5b25118edc 100644 --- a/hw/rdma/vmw/pvrdma_main.c +++ b/hw/rdma/vmw/pvrdma_main.c @@ -574,7 +574,7 @@ static void init_dev_caps(PVRDMADev *dev) dev->dev_attr.max_sge) - TARGET_PAGE_SIZE; } -static int pvrdma_check_ram_shared(Object *obj, void *opaque) +static bool pvrdma_check_ram_shared(Object *obj, void *opaque, Error **errp) { bool *shared = opaque; @@ -582,7 +582,7 @@ static int pvrdma_check_ram_shared(Object *obj, void *opaque) *shared = object_property_get_bool(obj, "share", NULL); } - return 0; + return true; } static void pvrdma_shutdown_notifier(Notifier *n, void *opaque) @@ -623,7 +623,8 @@ static void pvrdma_realize(PCIDevice *pdev, Error **errp) memdev_root = object_resolve_path("/objects", NULL); if (memdev_root) { - object_child_foreach(memdev_root, pvrdma_check_ram_shared, &ram_shared); + object_child_foreach(memdev_root, pvrdma_check_ram_shared, + &ram_shared, NULL); } if (!ram_shared) { error_setg(errp, "Only shared memory backed ram is supported"); diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index 746f07c4d2..84cd2a1334 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -729,7 +729,7 @@ static void virtio_balloon_get_config(VirtIODevice *vdev, uint8_t *config_data) memcpy(config_data, &config, virtio_balloon_config_size(dev)); } -static int build_dimm_list(Object *obj, void *opaque) +static bool build_dimm_list(Object *obj, void *opaque, Error **errp) { GSList **list = opaque; @@ -740,8 +740,7 @@ static int build_dimm_list(Object *obj, void *opaque) } } - object_child_foreach(obj, build_dimm_list, opaque); - return 0; + return object_child_foreach(obj, build_dimm_list, opaque, errp); } static ram_addr_t get_current_ram_size(void) @@ -749,7 +748,7 @@ static ram_addr_t get_current_ram_size(void) GSList *list = NULL, *item; ram_addr_t size = current_machine->ram_size; - build_dimm_list(qdev_get_machine(), &list); + build_dimm_list(qdev_get_machine(), &list, NULL); for (item = list; item; item = g_slist_next(item)) { Object *obj = OBJECT(item->data); if (!strcmp(object_get_typename(obj), TYPE_PC_DIMM)) { diff --git a/include/qom/object.h b/include/qom/object.h index ef7258a5e1..7809cd3925 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -1907,36 +1907,40 @@ void object_class_property_set_description(ObjectClass *klass, const char *name, * @obj: the object whose children will be navigated * @fn: the iterator function to be called * @opaque: an opaque value that will be passed to the iterator + * @errp: pointer to a NULL-initialized error object * - * Call @fn passing each child of @obj and @opaque to it, until @fn returns - * non-zero. + * Call @fn passing each child of @obj, @opaque and @errp to it, + * until @fn returns false. * * It is forbidden to add or remove children from @obj from the @fn * callback. * - * Returns: The last value returned by @fn, or 0 if there is no child. + * Returns: The last value returned by @fn, or %true if there is no child. */ -int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), - void *opaque); +bool object_child_foreach(Object *obj, + bool (*fn)(Object *child, void *opaque, Error **errp), + void *opaque, Error **errp); /** * object_child_foreach_recursive: * @obj: the object whose children will be navigated * @fn: the iterator function to be called * @opaque: an opaque value that will be passed to the iterator + * @errp: pointer to a NULL-initialized error object * - * Call @fn passing each child of @obj and @opaque to it, until @fn returns - * non-zero. Calls recursively, all child nodes of @obj will also be passed - * all the way down to the leaf nodes of the tree. Depth first ordering. + * Call @fn passing each child of @obj, @opaque and @errp to it, until @fn + * returns false. Calls recursively, all child nodes of @obj will also be + * passed all the way down to the leaf nodes of the tree. Depth first ordering. * * It is forbidden to add or remove children from @obj (or its * child nodes) from the @fn callback. * - * Returns: The last value returned by @fn, or 0 if there is no child. + * Returns: The last value returned by @fn, or %true if there is no child. */ -int object_child_foreach_recursive(Object *obj, - int (*fn)(Object *child, void *opaque), - void *opaque); +bool object_child_foreach_recursive(Object *obj, + bool (*fn)(Object *child, void *opaque, + Error **errp), + void *opaque, Error **errp); /** * container_get: * @root: root of the #path, e.g., object_get_root() diff --git a/iothread.c b/iothread.c index 3862a64471..67ce6fe014 100644 --- a/iothread.c +++ b/iothread.c @@ -342,7 +342,7 @@ AioContext *iothread_get_aio_context(IOThread *iothread) return iothread->ctx; } -static int query_one_iothread(Object *object, void *opaque) +static bool query_one_iothread(Object *object, void *opaque, Error **errp) { IOThreadInfoList ***tail = opaque; IOThreadInfo *info; @@ -350,7 +350,7 @@ static int query_one_iothread(Object *object, void *opaque) iothread = (IOThread *)object_dynamic_cast(object, TYPE_IOTHREAD); if (!iothread) { - return 0; + return true; } info = g_new0(IOThreadInfo, 1); @@ -362,7 +362,7 @@ static int query_one_iothread(Object *object, void *opaque) info->aio_max_batch = iothread->parent_obj.aio_max_batch; QAPI_LIST_APPEND(*tail, info); - return 0; + return true; } IOThreadInfoList *qmp_query_iothreads(Error **errp) @@ -371,7 +371,7 @@ IOThreadInfoList *qmp_query_iothreads(Error **errp) IOThreadInfoList **prev = &head; Object *container = object_get_objects_root(); - object_child_foreach(container, query_one_iothread, &prev); + object_child_foreach(container, query_one_iothread, &prev, errp); return head; } diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 34bd8c67d7..1b8c406ed0 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -82,7 +82,7 @@ void hmp_info_version(Monitor *mon, const QDict *qdict) qapi_free_VersionInfo(info); } -static int hmp_info_pic_foreach(Object *obj, void *opaque) +static bool hmp_info_pic_foreach(Object *obj, void *opaque, Error **errp) { InterruptStatsProvider *intc; InterruptStatsProviderClass *k; @@ -99,13 +99,13 @@ static int hmp_info_pic_foreach(Object *obj, void *opaque) } } - return 0; + return true; } void hmp_info_pic(Monitor *mon, const QDict *qdict) { object_child_foreach_recursive(object_get_root(), - hmp_info_pic_foreach, mon); + hmp_info_pic_foreach, mon, NULL); } void hmp_quit(Monitor *mon, const QDict *qdict) diff --git a/qom/object.c b/qom/object.c index e25f1e96db..665edd1693 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1104,45 +1104,45 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), enumerating_types = false; } -static int do_object_child_foreach(Object *obj, - int (*fn)(Object *child, void *opaque), - void *opaque, bool recurse) +static bool do_object_child_foreach(Object *obj, + bool (*fn)(Object *child, void *opaque, + Error **errp), + void *opaque, bool recurse, Error **errp) { GHashTableIter iter; ObjectProperty *prop; - int ret = 0; g_hash_table_iter_init(&iter, obj->properties); while (g_hash_table_iter_next(&iter, NULL, (gpointer *)&prop)) { if (object_property_is_child(prop)) { Object *child = prop->opaque; - ret = fn(child, opaque); - if (ret != 0) { - break; + if (!fn(child, opaque, errp)) { + return false; } if (recurse) { - ret = do_object_child_foreach(child, fn, opaque, true); - if (ret != 0) { - break; + if (!do_object_child_foreach(child, fn, opaque, true, errp)) { + return false; } } } } - return ret; + return true; } -int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), - void *opaque) +bool object_child_foreach(Object *obj, + bool (*fn)(Object *child, void *opaque, Error **errp), + void *opaque, Error **errp) { - return do_object_child_foreach(obj, fn, opaque, false); + return do_object_child_foreach(obj, fn, opaque, false, errp); } -int object_child_foreach_recursive(Object *obj, - int (*fn)(Object *child, void *opaque), - void *opaque) +bool object_child_foreach_recursive(Object *obj, + bool (*fn)(Object *child, void *opaque, + Error **errp), + void *opaque, Error **errp) { - return do_object_child_foreach(obj, fn, opaque, true); + return do_object_child_foreach(obj, fn, opaque, true, errp); } static void object_class_get_list_tramp(ObjectClass *klass, void *opaque) diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c index 6e3a2175a4..9a3267020e 100644 --- a/qom/qom-hmp-cmds.c +++ b/qom/qom-hmp-cmds.c @@ -101,10 +101,11 @@ static int qom_composition_compare(const void *a, const void *b) object_get_canonical_path_component(*(Object **)b)); } -static int insert_qom_composition_child(Object *obj, void *opaque) +static bool insert_qom_composition_child(Object *obj, void *opaque, + Error **errp) { g_array_append_val(opaque, obj); - return 0; + return true; } static void print_qom_composition(Monitor *mon, Object *obj, int indent) @@ -121,7 +122,7 @@ static void print_qom_composition(Monitor *mon, Object *obj, int indent) monitor_printf(mon, "%*s/%s (%s)\n", indent, "", name, object_get_typename(obj)); - object_child_foreach(obj, insert_qom_composition_child, children); + object_child_foreach(obj, insert_qom_composition_child, children, NULL); g_array_sort(children, qom_composition_compare); for (i = 0; i < children->len; i++) { diff --git a/scsi/pr-manager.c b/scsi/pr-manager.c index 2098d7e759..48a32729ba 100644 --- a/scsi/pr-manager.c +++ b/scsi/pr-manager.c @@ -114,7 +114,7 @@ pr_manager_register_types(void) type_register_static(&pr_manager_info); } -static int query_one_pr_manager(Object *object, void *opaque) +static bool query_one_pr_manager(Object *object, void *opaque, Error **errp) { PRManagerInfoList ***tail = opaque; PRManagerInfo *info; @@ -122,14 +122,14 @@ static int query_one_pr_manager(Object *object, void *opaque) pr_mgr = (PRManager *)object_dynamic_cast(object, TYPE_PR_MANAGER); if (!pr_mgr) { - return 0; + return true; } info = g_new0(PRManagerInfo, 1); info->id = g_strdup(object_get_canonical_path_component(object)); info->connected = pr_manager_is_connected(pr_mgr); QAPI_LIST_APPEND(*tail, info); - return 0; + return true; } PRManagerInfoList *qmp_query_pr_managers(Error **errp) @@ -138,7 +138,7 @@ PRManagerInfoList *qmp_query_pr_managers(Error **errp) PRManagerInfoList **prev = &head; Object *container = container_get(object_get_root(), PR_MANAGER_PATH); - object_child_foreach(container, query_one_pr_manager, &prev); + object_child_foreach(container, query_one_pr_manager, &prev, errp); return head; } diff --git a/softmmu/physmem.c b/softmmu/physmem.c index cb998cdf23..033f021030 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -1332,7 +1332,7 @@ GString *ram_block_format(void) return buf; } -static int find_min_backend_pagesize(Object *obj, void *opaque) +static bool find_min_backend_pagesize(Object *obj, void *opaque, Error **errp) { long *hpsize_min = opaque; @@ -1345,10 +1345,10 @@ static int find_min_backend_pagesize(Object *obj, void *opaque) } } - return 0; + return true; } -static int find_max_backend_pagesize(Object *obj, void *opaque) +static bool find_max_backend_pagesize(Object *obj, void *opaque, Error **errp) { long *hpsize_max = opaque; @@ -1361,7 +1361,7 @@ static int find_max_backend_pagesize(Object *obj, void *opaque) } } - return 0; + return true; } /* @@ -1373,7 +1373,7 @@ long qemu_minrampagesize(void) long hpsize = LONG_MAX; Object *memdev_root = object_resolve_path("/objects", NULL); - object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize); + object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize, NULL); return hpsize; } @@ -1382,7 +1382,8 @@ long qemu_maxrampagesize(void) long pagesize = 0; Object *memdev_root = object_resolve_path("/objects", NULL); - object_child_foreach(memdev_root, find_max_backend_pagesize, &pagesize); + object_child_foreach(memdev_root, find_max_backend_pagesize, &pagesize, + NULL); return pagesize; } diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c index b8d2c4dadd..6d5747fce5 100644 --- a/softmmu/qdev-monitor.c +++ b/softmmu/qdev-monitor.c @@ -998,27 +998,28 @@ void device_add_completion(ReadLineState *rs, int nb_args, const char *str) g_slist_free(list); } -static int qdev_add_hotpluggable_device(Object *obj, void *opaque) +static bool qdev_add_hotpluggable_device(Object *obj, void *opaque, + Error **errp) { GSList **list = opaque; DeviceState *dev = (DeviceState *)object_dynamic_cast(obj, TYPE_DEVICE); if (dev == NULL) { - return 0; + return true; } if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) { *list = g_slist_append(*list, dev); } - return 0; + return true; } static GSList *qdev_build_hotpluggable_device_list(Object *peripheral) { GSList *list = NULL; - object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list); + object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list, NULL); return list; } diff --git a/tests/qtest/fuzz/generic_fuzz.c b/tests/qtest/fuzz/generic_fuzz.c index 7326f6840b..2bd5643372 100644 --- a/tests/qtest/fuzz/generic_fuzz.c +++ b/tests/qtest/fuzz/generic_fuzz.c @@ -761,7 +761,7 @@ static int locate_fuzz_memory_regions(Object *child, void *opaque) return 0; } -static int locate_fuzz_objects(Object *child, void *opaque) +static bool locate_fuzz_objects(Object *child, void *opaque, Error **errp) { GString *type_name; GString *path_name; @@ -800,7 +800,7 @@ static int locate_fuzz_objects(Object *child, void *opaque) g_string_free(path_name, true); } g_string_free(type_name, true); - return 0; + return true; } @@ -866,7 +866,7 @@ static void generic_pre_fuzz(QTestState *s) printf("Matching objects by name %s\n", result[i]); object_child_foreach_recursive(qdev_get_machine(), locate_fuzz_objects, - name_pattern->str); + name_pattern->str, NULL); g_string_free(name_pattern, true); } g_strfreev(result); diff --git a/ui/dbus-chardev.c b/ui/dbus-chardev.c index 940ef937cd..21de92fc98 100644 --- a/ui/dbus-chardev.c +++ b/ui/dbus-chardev.c @@ -68,18 +68,16 @@ dbus_display_chardev_unexport(DBusDisplay *dpy, DBusChardev *chr) chr->exported = false; } -static int -dbus_display_chardev_foreach(Object *obj, void *data) +static bool +dbus_display_chardev_foreach(Object *obj, void *data, Error **errp) { DBusDisplay *dpy = DBUS_DISPLAY(data); - if (!CHARDEV_IS_DBUS(obj)) { - return 0; + if (CHARDEV_IS_DBUS(obj)) { + dbus_display_chardev_export(dpy, DBUS_CHARDEV(obj)); } - dbus_display_chardev_export(dpy, DBUS_CHARDEV(obj)); - - return 0; + return true; } static void @@ -105,7 +103,7 @@ dbus_chardev_init(DBusDisplay *dpy) dbus_display_notifier_add(&dpy->notifier); object_child_foreach(container_get(object_get_root(), "/chardevs"), - dbus_display_chardev_foreach, dpy); + dbus_display_chardev_foreach, dpy, NULL); } static gboolean diff --git a/util/nvdimm-utils.c b/util/nvdimm-utils.c index aa3d199f2d..b356a3fbea 100644 --- a/util/nvdimm-utils.c +++ b/util/nvdimm-utils.c @@ -2,7 +2,7 @@ #include "qemu/nvdimm-utils.h" #include "hw/mem/nvdimm.h" -static int nvdimm_device_list(Object *obj, void *opaque) +static bool nvdimm_device_list(Object *obj, void *opaque, Error **errp) { GSList **list = opaque; @@ -10,8 +10,8 @@ static int nvdimm_device_list(Object *obj, void *opaque) *list = g_slist_append(*list, DEVICE(obj)); } - object_child_foreach(obj, nvdimm_device_list, opaque); - return 0; + object_child_foreach(obj, nvdimm_device_list, opaque, errp); + return true; } /* @@ -25,6 +25,6 @@ GSList *nvdimm_get_device_list(void) { GSList *list = NULL; - object_child_foreach(qdev_get_machine(), nvdimm_device_list, &list); + object_child_foreach(qdev_get_machine(), nvdimm_device_list, &list, NULL); return list; } -- 2.38.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean 2023-02-16 12:25 ` [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé @ 2023-02-16 12:30 ` Michael S. Tsirkin 2023-02-23 15:40 ` Markus Armbruster 1 sibling, 0 replies; 14+ messages in thread From: Michael S. Tsirkin @ 2023-02-16 12:30 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Marc-André Lureau, Paolo Bonzini, Alex Bennée, Igor Mammedov, Ani Sinha, Jean-Philippe Brucker, Peter Maydell, Shannon Zhao, Eduardo Habkost, Marcel Apfelbaum, Yanan Wang, Daniel P. Berrangé, Gerd Hoffmann, Richard Henderson, Peter Xu, Jason Wang, David Hildenbrand, Xiao Guangrong, Mark Cave-Ayland, Cédric Le Goater, Daniel Henrique Barboza, David Gibson, Greg Kurz, Yuval Shaia, Dr. David Alan Gilbert, Fam Zheng, Alexander Bulekov, Bandan Das, Stefan Hajnoczi, Thomas Huth, Darren Kenny, Qiuhao Li, Laurent Vivier On Thu, Feb 16, 2023 at 01:25:22PM +0100, Philippe Mathieu-Daudé wrote: > Following the Error API best practices documented in commit > e3fe3988d7 ("error: Document Error API usage rules"), have the > object_child_foreach[_recursive]() handler take a Error* argument > and return a boolean indicating whether this error is set or not. > Convert all handler implementations. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> > --- > chardev/char-mux.c | 6 ++-- > chardev/char.c | 6 ++-- > gdbstub/gdbstub.c | 8 +++--- > hw/acpi/cxl.c | 7 +++-- > hw/acpi/viot.c | 6 ++-- > hw/arm/boot.c | 6 ++-- > hw/arm/virt-acpi-build.c | 8 +++--- > hw/core/machine-qmp-cmds.c | 18 ++++++------ > hw/core/nmi.c | 8 +++--- > hw/core/qdev.c | 8 ++++-- > hw/core/sysbus.c | 10 +++---- > hw/cpu/cluster.c | 7 +++-- > hw/display/virtio-gpu-udmabuf.c | 7 +++-- > hw/i386/acpi-build.c | 16 +++++------ > hw/i386/intel_iommu.c | 7 +++-- > hw/i386/pc.c | 13 ++++----- > hw/i386/sgx.c | 7 ++--- > hw/mem/memory-device.c | 25 ++++++++--------- > hw/mem/pc-dimm.c | 8 +++--- > hw/misc/mos6522.c | 6 ++-- > hw/ppc/pnv.c | 15 +++++----- > hw/ppc/pnv_bmc.c | 9 +++--- > hw/ppc/pnv_xscom.c | 6 ++-- > hw/ppc/spapr_pci.c | 50 ++++++++++++++++----------------- > hw/ppc/spapr_rtas_ddw.c | 16 +++++++---- > hw/rdma/vmw/pvrdma_main.c | 7 +++-- > hw/virtio/virtio-balloon.c | 7 ++--- > include/qom/object.h | 28 ++++++++++-------- > iothread.c | 8 +++--- > monitor/hmp-cmds.c | 6 ++-- > qom/object.c | 36 ++++++++++++------------ > qom/qom-hmp-cmds.c | 7 +++-- > scsi/pr-manager.c | 8 +++--- > softmmu/physmem.c | 13 +++++---- > softmmu/qdev-monitor.c | 9 +++--- > tests/qtest/fuzz/generic_fuzz.c | 6 ++-- > ui/dbus-chardev.c | 14 ++++----- > util/nvdimm-utils.c | 8 +++--- > 38 files changed, 225 insertions(+), 215 deletions(-) > > diff --git a/chardev/char-mux.c b/chardev/char-mux.c > index ee2d47b20d..17b5854e4c 100644 > --- a/chardev/char-mux.c > +++ b/chardev/char-mux.c > @@ -384,7 +384,7 @@ void suspend_mux_open(void) > muxes_opened = false; > } > > -static int chardev_options_parsed_cb(Object *child, void *opaque) > +static bool chardev_options_parsed_cb(Object *child, void *opaque, Error **errp) > { > Chardev *chr = (Chardev *)child; > > @@ -392,14 +392,14 @@ static int chardev_options_parsed_cb(Object *child, void *opaque) > open_muxes(chr); > } > > - return 0; > + return true; > } > > void resume_mux_open(void) > { > muxes_opened = true; > object_child_foreach(get_chardevs_root(), > - chardev_options_parsed_cb, NULL); > + chardev_options_parsed_cb, NULL, NULL); > } > > static void char_mux_class_init(ObjectClass *oc, void *data) > diff --git a/chardev/char.c b/chardev/char.c > index 11eab7764c..542b835477 100644 > --- a/chardev/char.c > +++ b/chardev/char.c > @@ -742,7 +742,7 @@ Chardev *qemu_chr_new_mux_mon(const char *label, const char *filename, > return qemu_chr_new_permit_mux_mon(label, filename, true, context); > } > > -static int qmp_query_chardev_foreach(Object *obj, void *data) > +static bool qmp_query_chardev_foreach(Object *obj, void *data, Error **errp) > { > Chardev *chr = CHARDEV(obj); > ChardevInfoList **list = data; > @@ -754,7 +754,7 @@ static int qmp_query_chardev_foreach(Object *obj, void *data) > > QAPI_LIST_PREPEND(*list, value); > > - return 0; > + return true; > } > > ChardevInfoList *qmp_query_chardev(Error **errp) > @@ -762,7 +762,7 @@ ChardevInfoList *qmp_query_chardev(Error **errp) > ChardevInfoList *chr_list = NULL; > > object_child_foreach(get_chardevs_root(), > - qmp_query_chardev_foreach, &chr_list); > + qmp_query_chardev_foreach, &chr_list, NULL); > > return chr_list; > } > diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c > index be88ca0d71..73d6352be5 100644 > --- a/gdbstub/gdbstub.c > +++ b/gdbstub/gdbstub.c > @@ -3379,7 +3379,7 @@ static const TypeInfo char_gdb_type_info = { > .class_init = char_gdb_class_init, > }; > > -static int find_cpu_clusters(Object *child, void *opaque) > +static bool find_cpu_clusters(Object *child, void *opaque, Error **errp) > { > if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) { > GDBState *s = (GDBState *) opaque; > @@ -3400,10 +3400,10 @@ static int find_cpu_clusters(Object *child, void *opaque) > process->attached = false; > process->target_xml[0] = '\0'; > > - return 0; > + return true; > } > > - return object_child_foreach(child, find_cpu_clusters, opaque); > + return object_child_foreach(child, find_cpu_clusters, opaque, errp); > } > > static int pid_order(const void *a, const void *b) > @@ -3422,7 +3422,7 @@ static int pid_order(const void *a, const void *b) > > static void create_processes(GDBState *s) > { > - object_child_foreach(object_get_root(), find_cpu_clusters, s); > + object_child_foreach(object_get_root(), find_cpu_clusters, s, NULL); > > if (gdbserver_state.processes) { > /* Sort by PID */ > diff --git a/hw/acpi/cxl.c b/hw/acpi/cxl.c > index 2bf8c07993..853be6f75a 100644 > --- a/hw/acpi/cxl.c > +++ b/hw/acpi/cxl.c > @@ -117,7 +117,7 @@ static void cedt_build_cfmws(GArray *table_data, CXLState *cxls) > } > } > > -static int cxl_foreach_pxb_hb(Object *obj, void *opaque) > +static bool cxl_foreach_pxb_hb(Object *obj, void *opaque, Error **errp) > { > Aml *cedt = opaque; > > @@ -125,7 +125,7 @@ static int cxl_foreach_pxb_hb(Object *obj, void *opaque) > cedt_build_chbs(cedt->buf, PXB_CXL_DEV(obj)); > } > > - return 0; > + return true; > } > > void cxl_build_cedt(GArray *table_offsets, GArray *table_data, > @@ -142,7 +142,8 @@ void cxl_build_cedt(GArray *table_offsets, GArray *table_data, > > /* reserve space for CEDT header */ > > - object_child_foreach_recursive(object_get_root(), cxl_foreach_pxb_hb, cedt); > + object_child_foreach_recursive(object_get_root(), cxl_foreach_pxb_hb, > + cedt, NULL); > cedt_build_cfmws(cedt->buf, cxl_state); > > /* copy AML table into ACPI tables blob and patch header there */ > diff --git a/hw/acpi/viot.c b/hw/acpi/viot.c > index 4e0bf69067..9099cd9c15 100644 > --- a/hw/acpi/viot.c > +++ b/hw/acpi/viot.c > @@ -41,7 +41,7 @@ static void build_pci_host_range(GArray *table_data, int min_bus, int max_bus, > } > > /* Build PCI range for a given PCI host bridge */ > -static int enumerate_pci_host_bridges(Object *obj, void *opaque) > +static bool enumerate_pci_host_bridges(Object *obj, void *opaque, Error **errp) > { > GArray *pci_host_ranges = opaque; > > @@ -61,7 +61,7 @@ static int enumerate_pci_host_bridges(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > static gint pci_host_range_compare(gconstpointer a, gconstpointer b) > @@ -99,7 +99,7 @@ void build_viot(MachineState *ms, GArray *table_data, BIOSLinker *linker, > > /* Build the list of PCI ranges that this viommu manages */ > object_child_foreach_recursive(OBJECT(ms), enumerate_pci_host_bridges, > - pci_host_ranges); > + pci_host_ranges, NULL); > > /* Sort the pci host ranges by min_bus */ > g_array_sort(pci_host_ranges, pci_host_range_compare); > diff --git a/hw/arm/boot.c b/hw/arm/boot.c > index 3d7d11f782..64eda44f1d 100644 > --- a/hw/arm/boot.c > +++ b/hw/arm/boot.c > @@ -831,7 +831,7 @@ static void do_cpu_reset(void *opaque) > } > } > > -static int do_arm_linux_init(Object *obj, void *opaque) > +static bool do_arm_linux_init(Object *obj, void *opaque, Error **errp) > { > if (object_dynamic_cast(obj, TYPE_ARM_LINUX_BOOT_IF)) { > ARMLinuxBootIf *albif = ARM_LINUX_BOOT_IF(obj); > @@ -842,7 +842,7 @@ static int do_arm_linux_init(Object *obj, void *opaque) > albifc->arm_linux_init(albif, info->secure_boot); > } > } > - return 0; > + return true; > } > > static ssize_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry, > @@ -1185,7 +1185,7 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu, > * that we're doing a direct kernel boot. > */ > object_child_foreach_recursive(object_get_root(), > - do_arm_linux_init, info); > + do_arm_linux_init, info, NULL); > } > info->is_linux = is_linux; > > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c > index 4156111d49..17e25c7f0f 100644 > --- a/hw/arm/virt-acpi-build.c > +++ b/hw/arm/virt-acpi-build.c > @@ -266,8 +266,8 @@ struct AcpiIortIdMapping { > typedef struct AcpiIortIdMapping AcpiIortIdMapping; > > /* Build the iort ID mapping to SMMUv3 for a given PCI host bridge */ > -static int > -iort_host_bridges(Object *obj, void *opaque) > +static bool > +iort_host_bridges(Object *obj, void *opaque, Error **errp) > { > GArray *idmap_blob = opaque; > > @@ -287,7 +287,7 @@ iort_host_bridges(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > static int iort_idmap_compare(gconstpointer a, gconstpointer b) > @@ -323,7 +323,7 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) > AcpiIortIdMapping next_range = {0}; > > object_child_foreach_recursive(object_get_root(), > - iort_host_bridges, smmu_idmaps); > + iort_host_bridges, smmu_idmaps, NULL); > > /* Sort the smmu idmap by input_base */ > g_array_sort(smmu_idmaps, iort_idmap_compare); > diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c > index 44b5da8880..06aa5830b5 100644 > --- a/hw/core/machine-qmp-cmds.c > +++ b/hw/core/machine-qmp-cmds.c > @@ -157,7 +157,7 @@ void qmp_set_numa_node(NumaOptions *cmd, Error **errp) > set_numa_options(MACHINE(qdev_get_machine()), cmd, errp); > } > > -static int query_memdev(Object *obj, void *opaque) > +static bool query_memdev(Object *obj, void *opaque, Error **errp) > { > Error *err = NULL; > MemdevList **list = opaque; > @@ -194,7 +194,7 @@ static int query_memdev(Object *obj, void *opaque) > QAPI_LIST_PREPEND(*list, m); > } > > - return 0; > + return true; > } > > MemdevList *qmp_query_memdev(Error **errp) > @@ -202,7 +202,7 @@ MemdevList *qmp_query_memdev(Error **errp) > Object *obj = object_get_objects_root(); > MemdevList *list = NULL; > > - object_child_foreach(obj, query_memdev, &list); > + object_child_foreach(obj, query_memdev, &list, errp); > return list; > } > > @@ -303,7 +303,7 @@ MemoryInfo *qmp_query_memory_size_summary(Error **errp) > return mem_info; > } > > -static int qmp_x_query_rdma_foreach(Object *obj, void *opaque) > +static bool qmp_x_query_rdma_foreach(Object *obj, void *opaque, Error **errp) > { > RdmaProvider *rdma; > RdmaProviderClass *k; > @@ -321,7 +321,7 @@ static int qmp_x_query_rdma_foreach(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > HumanReadableText *qmp_x_query_rdma(Error **errp) > @@ -329,7 +329,7 @@ HumanReadableText *qmp_x_query_rdma(Error **errp) > g_autoptr(GString) buf = g_string_new(""); > > object_child_foreach_recursive(object_get_root(), > - qmp_x_query_rdma_foreach, buf); > + qmp_x_query_rdma_foreach, buf, NULL); > > return human_readable_text_from_str(buf); > } > @@ -341,7 +341,7 @@ HumanReadableText *qmp_x_query_ramblock(Error **errp) > return human_readable_text_from_str(buf); > } > > -static int qmp_x_query_irq_foreach(Object *obj, void *opaque) > +static bool qmp_x_query_irq_foreach(Object *obj, void *opaque, Error **errp) > { > InterruptStatsProvider *intc; > InterruptStatsProviderClass *k; > @@ -371,7 +371,7 @@ static int qmp_x_query_irq_foreach(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > HumanReadableText *qmp_x_query_irq(Error **errp) > @@ -379,7 +379,7 @@ HumanReadableText *qmp_x_query_irq(Error **errp) > g_autoptr(GString) buf = g_string_new(""); > > object_child_foreach_recursive(object_get_root(), > - qmp_x_query_irq_foreach, buf); > + qmp_x_query_irq_foreach, buf, NULL); > > return human_readable_text_from_str(buf); > } > diff --git a/hw/core/nmi.c b/hw/core/nmi.c > index 76cb3ba3b0..fa74c405f7 100644 > --- a/hw/core/nmi.c > +++ b/hw/core/nmi.c > @@ -34,7 +34,7 @@ struct do_nmi_s { > > static void nmi_children(Object *o, struct do_nmi_s *ns); > > -static int do_nmi(Object *o, void *opaque) > +static bool do_nmi(Object *o, void *opaque, Error **errp) > { > struct do_nmi_s *ns = opaque; > NMIState *n = (NMIState *) object_dynamic_cast(o, TYPE_NMI); > @@ -44,17 +44,17 @@ static int do_nmi(Object *o, void *opaque) > > ns->handled = true; > if (!nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err)) { > - return -1; > + return false; > } > } > nmi_children(o, ns); > > - return 0; > + return true; > } > > static void nmi_children(Object *o, struct do_nmi_s *ns) > { > - object_child_foreach(o, do_nmi, ns); > + object_child_foreach(o, do_nmi, ns, NULL); > } > > void nmi_monitor_handle(int cpu_index, Error **errp) > diff --git a/hw/core/qdev.c b/hw/core/qdev.c > index d759c4602c..949e89022e 100644 > --- a/hw/core/qdev.c > +++ b/hw/core/qdev.c > @@ -306,7 +306,8 @@ void qdev_unrealize(DeviceState *dev) > object_property_set_bool(OBJECT(dev), "realized", false, &error_abort); > } > > -static int qdev_assert_realized_properly_cb(Object *obj, void *opaque) > +static bool qdev_assert_realized_properly_cb(Object *obj, void *opaque, > + Error **errp) > { > DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE)); > DeviceClass *dc; > @@ -316,13 +317,14 @@ static int qdev_assert_realized_properly_cb(Object *obj, void *opaque) > assert(dev->realized); > assert(dev->parent_bus || !dc->bus_type); > } > - return 0; > + return true; > } > > void qdev_assert_realized_properly(void) > { > object_child_foreach_recursive(object_get_root(), > - qdev_assert_realized_properly_cb, NULL); > + qdev_assert_realized_properly_cb, > + NULL, NULL); > } > > bool qdev_machine_modified(void) > diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c > index 35f902b582..41e70775b0 100644 > --- a/hw/core/sysbus.c > +++ b/hw/core/sysbus.c > @@ -33,7 +33,7 @@ typedef struct SysBusFind { > } SysBusFind; > > /* Run func() for every sysbus device, traverse the tree for everything else */ > -static int find_sysbus_device(Object *obj, void *opaque) > +static bool find_sysbus_device(Object *obj, void *opaque, Error **errp) > { > SysBusFind *find = opaque; > Object *dev; > @@ -44,12 +44,12 @@ static int find_sysbus_device(Object *obj, void *opaque) > > if (!sbdev) { > /* Container, traverse it for children */ > - return object_child_foreach(obj, find_sysbus_device, opaque); > + return object_child_foreach(obj, find_sysbus_device, opaque, errp); > } > > find->func(sbdev, find->opaque); > > - return 0; > + return true; > } > > /* > @@ -66,9 +66,9 @@ void foreach_dynamic_sysbus_device(FindSysbusDeviceFunc *func, void *opaque) > > /* Loop through all sysbus devices that were spawned outside the machine */ > container = container_get(qdev_get_machine(), "/peripheral"); > - find_sysbus_device(container, &find); > + find_sysbus_device(container, &find, NULL); > container = container_get(qdev_get_machine(), "/peripheral-anon"); > - find_sysbus_device(container, &find); > + find_sysbus_device(container, &find, NULL); > } > > > diff --git a/hw/cpu/cluster.c b/hw/cpu/cluster.c > index e444b7c29d..bf3e27e945 100644 > --- a/hw/cpu/cluster.c > +++ b/hw/cpu/cluster.c > @@ -36,7 +36,7 @@ typedef struct CallbackData { > int cpu_count; > } CallbackData; > > -static int add_cpu_to_cluster(Object *obj, void *opaque) > +static bool add_cpu_to_cluster(Object *obj, void *opaque, Error **errp) > { > CallbackData *cbdata = opaque; > CPUState *cpu = (CPUState *)object_dynamic_cast(obj, TYPE_CPU); > @@ -45,7 +45,7 @@ static int add_cpu_to_cluster(Object *obj, void *opaque) > cpu->cluster_index = cbdata->cluster->cluster_id; > cbdata->cpu_count++; > } > - return 0; > + return true; > } > > static void cpu_cluster_realize(DeviceState *dev, Error **errp) > @@ -63,7 +63,8 @@ static void cpu_cluster_realize(DeviceState *dev, Error **errp) > return; > } > > - object_child_foreach_recursive(cluster_obj, add_cpu_to_cluster, &cbdata); > + object_child_foreach_recursive(cluster_obj, add_cpu_to_cluster, > + &cbdata, NULL); > > /* > * A cluster with no CPUs is a bug in the board/SoC code that created it; > diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabuf.c > index 69e2cf0bd6..c3d3ea4f27 100644 > --- a/hw/display/virtio-gpu-udmabuf.c > +++ b/hw/display/virtio-gpu-udmabuf.c > @@ -90,7 +90,7 @@ static void virtio_gpu_destroy_udmabuf(struct virtio_gpu_simple_resource *res) > } > } > > -static int find_memory_backend_type(Object *obj, void *opaque) > +static bool find_memory_backend_type(Object *obj, void *opaque, Error **errp) > { > bool *memfd_backend = opaque; > int ret; > @@ -107,7 +107,7 @@ static int find_memory_backend_type(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > bool virtio_gpu_have_udmabuf(void) > @@ -122,7 +122,8 @@ bool virtio_gpu_have_udmabuf(void) > } > > memdev_root = object_resolve_path("/objects", NULL); > - object_child_foreach(memdev_root, find_memory_backend_type, &memfd_backend); > + object_child_foreach(memdev_root, find_memory_backend_type, > + &memfd_backend, NULL); > > return memfd_backend; > } > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index b67dcbbb37..0079f98304 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -2034,8 +2034,8 @@ insert_scope(PCIBus *bus, PCIDevice *dev, void *opaque) > } > > /* For a given PCI host bridge, walk and insert DMAR scope */ > -static int > -dmar_host_bridges(Object *obj, void *opaque) > +static bool > +dmar_host_bridges(Object *obj, void *opaque, Error **errp) > { > GArray *scope_blob = opaque; > > @@ -2047,7 +2047,7 @@ dmar_host_bridges(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > /* > @@ -2077,7 +2077,7 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker, const char *oem_id, > * is attached to a bus with iommu enabled. > */ > object_child_foreach_recursive(object_get_root(), > - dmar_host_bridges, scope_blob); > + dmar_host_bridges, scope_blob, NULL); > > assert(iommu); > if (x86_iommu_ir_supported(iommu)) { > @@ -2240,8 +2240,8 @@ insert_ivhd(PCIBus *bus, PCIDevice *dev, void *opaque) > } > > /* For all PCI host bridges, walk and insert IVHD entries */ > -static int > -ivrs_host_bridges(Object *obj, void *opaque) > +static bool > +ivrs_host_bridges(Object *obj, void *opaque, Error **errp) > { > GArray *ivhd_blob = opaque; > > @@ -2253,7 +2253,7 @@ ivrs_host_bridges(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > static void > @@ -2292,7 +2292,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id, > * is sufficient when no aliases are present. > */ > object_child_foreach_recursive(object_get_root(), > - ivrs_host_bridges, ivhd_blob); > + ivrs_host_bridges, ivhd_blob, NULL); > > if (!ivhd_blob->len) { > /* > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c > index 98a5c304a7..3d7f643dc7 100644 > --- a/hw/i386/intel_iommu.c > +++ b/hw/i386/intel_iommu.c > @@ -4059,7 +4059,8 @@ static bool vtd_decide_config(IntelIOMMUState *s, Error **errp) > return true; > } > > -static int vtd_machine_done_notify_one(Object *child, void *unused) > +static bool vtd_machine_done_notify_one(Object *child, void *unused, > + Error **errp) > { > IntelIOMMUState *iommu = INTEL_IOMMU_DEVICE(x86_iommu_get_default()); > > @@ -4072,13 +4073,13 @@ static int vtd_machine_done_notify_one(Object *child, void *unused) > vtd_panic_require_caching_mode(); > } > > - return 0; > + return true; > } > > static void vtd_machine_done_hook(Notifier *notifier, void *unused) > { > object_child_foreach_recursive(object_get_root(), > - vtd_machine_done_notify_one, NULL); > + vtd_machine_done_notify_one, NULL, NULL); > } > > static Notifier vtd_machine_done_notify = { > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index 6e592bd969..310ca78560 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -546,22 +546,21 @@ typedef struct check_fdc_state { > bool multiple; > } CheckFdcState; > > -static int check_fdc(Object *obj, void *opaque) > +static bool check_fdc(Object *obj, void *opaque, Error **errp) > { > CheckFdcState *state = opaque; > Object *fdc; > uint32_t iobase; > - Error *local_err = NULL; > + g_autofree Error *local_err = NULL; > > fdc = object_dynamic_cast(obj, TYPE_ISA_FDC); > if (!fdc) { > - return 0; > + return true; > } > > iobase = object_property_get_uint(obj, "iobase", &local_err); > if (local_err || iobase != 0x3f0) { > - error_free(local_err); > - return 0; > + return true; > } > > if (state->floppy) { > @@ -569,7 +568,7 @@ static int check_fdc(Object *obj, void *opaque) > } else { > state->floppy = ISA_DEVICE(obj); > } > - return 0; > + return true; > } > > static const char * const fdc_container_path[] = { > @@ -588,7 +587,7 @@ static ISADevice *pc_find_fdc0(void) > > for (i = 0; i < ARRAY_SIZE(fdc_container_path); i++) { > container = container_get(qdev_get_machine(), fdc_container_path[i]); > - object_child_foreach(container, check_fdc, &state); > + object_child_foreach(container, check_fdc, &state, NULL); > } > > if (state.multiple) { > diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c > index db004d17a6..c09ae42a3b 100644 > --- a/hw/i386/sgx.c > +++ b/hw/i386/sgx.c > @@ -37,7 +37,7 @@ > > #define RETRY_NUM 2 > > -static int sgx_epc_device_list(Object *obj, void *opaque) > +static bool sgx_epc_device_list(Object *obj, void *opaque, Error **errp) > { > GSList **list = opaque; > > @@ -45,15 +45,14 @@ static int sgx_epc_device_list(Object *obj, void *opaque) > *list = g_slist_append(*list, DEVICE(obj)); > } > > - object_child_foreach(obj, sgx_epc_device_list, opaque); > - return 0; > + return object_child_foreach(obj, sgx_epc_device_list, opaque); > } > > static GSList *sgx_epc_get_device_list(void) > { > GSList *list = NULL; > > - object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list); > + object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list, NULL); > return list; > } > > diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c > index d9f8301711..f0f47c0657 100644 > --- a/hw/mem/memory-device.c > +++ b/hw/mem/memory-device.c > @@ -35,7 +35,7 @@ static gint memory_device_addr_sort(gconstpointer a, gconstpointer b) > return 0; > } > > -static int memory_device_build_list(Object *obj, void *opaque) > +static bool memory_device_build_list(Object *obj, void *opaque, Error **errp) > { > GSList **list = opaque; > > @@ -46,11 +46,11 @@ static int memory_device_build_list(Object *obj, void *opaque) > } > } > > - object_child_foreach(obj, memory_device_build_list, opaque); > - return 0; > + return object_child_foreach(obj, memory_device_build_list, opaque, errp); > } > > -static int memory_device_used_region_size(Object *obj, void *opaque) > +static bool memory_device_used_region_size(Object *obj, void *opaque, > + Error **errp) > { > uint64_t *size = opaque; > > @@ -63,8 +63,8 @@ static int memory_device_used_region_size(Object *obj, void *opaque) > } > } > > - object_child_foreach(obj, memory_device_used_region_size, opaque); > - return 0; > + return object_child_foreach(obj, memory_device_used_region_size, > + opaque, errp); > } > > static void memory_device_check_addable(MachineState *ms, uint64_t size, > @@ -83,7 +83,7 @@ static void memory_device_check_addable(MachineState *ms, uint64_t size, > } > > /* will we exceed the total amount of memory specified */ > - memory_device_used_region_size(OBJECT(ms), &used_region_size); > + memory_device_used_region_size(OBJECT(ms), &used_region_size, NULL); > if (used_region_size + size < used_region_size || > used_region_size + size > ms->maxram_size - ms->ram_size) { > error_setg(errp, "not enough space, currently 0x%" PRIx64 > @@ -159,7 +159,7 @@ static uint64_t memory_device_get_free_addr(MachineState *ms, > } > > /* find address range that will fit new memory device */ > - object_child_foreach(OBJECT(ms), memory_device_build_list, &list); > + object_child_foreach(OBJECT(ms), memory_device_build_list, &list, NULL); > for (item = list; item; item = g_slist_next(item)) { > const MemoryDeviceState *md = item->data; > const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(OBJECT(md)); > @@ -202,7 +202,7 @@ MemoryDeviceInfoList *qmp_memory_device_list(void) > MemoryDeviceInfoList *list = NULL, **tail = &list; > > object_child_foreach(qdev_get_machine(), memory_device_build_list, > - &devices); > + &devices, NULL); > > for (item = devices; item; item = g_slist_next(item)) { > const MemoryDeviceState *md = MEMORY_DEVICE(item->data); > @@ -219,7 +219,7 @@ MemoryDeviceInfoList *qmp_memory_device_list(void) > return list; > } > > -static int memory_device_plugged_size(Object *obj, void *opaque) > +static bool memory_device_plugged_size(Object *obj, void *opaque, Error **errp) > { > uint64_t *size = opaque; > > @@ -233,15 +233,14 @@ static int memory_device_plugged_size(Object *obj, void *opaque) > } > } > > - object_child_foreach(obj, memory_device_plugged_size, opaque); > - return 0; > + return object_child_foreach(obj, memory_device_plugged_size, opaque, errp); > } > > uint64_t get_plugged_memory_size(void) > { > uint64_t size = 0; > > - memory_device_plugged_size(qdev_get_machine(), &size); > + memory_device_plugged_size(qdev_get_machine(), &size, NULL); > > return size; > } > diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c > index 50ef83215c..4a722416ce 100644 > --- a/hw/mem/pc-dimm.c > +++ b/hw/mem/pc-dimm.c > @@ -92,7 +92,7 @@ void pc_dimm_unplug(PCDIMMDevice *dimm, MachineState *machine) > vmstate_unregister_ram(vmstate_mr, DEVICE(dimm)); > } > > -static int pc_dimm_slot2bitmap(Object *obj, void *opaque) > +static bool pc_dimm_slot2bitmap(Object *obj, void *opaque, Error **errp) > { > unsigned long *bitmap = opaque; > > @@ -104,8 +104,8 @@ static int pc_dimm_slot2bitmap(Object *obj, void *opaque) > } > } > > - object_child_foreach(obj, pc_dimm_slot2bitmap, opaque); > - return 0; > + object_child_foreach(obj, pc_dimm_slot2bitmap, opaque, errp); > + return true; > } > > static int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp) > @@ -120,7 +120,7 @@ static int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp) > } > > bitmap = bitmap_new(max_slots); > - object_child_foreach(qdev_get_machine(), pc_dimm_slot2bitmap, bitmap); > + object_child_foreach(qdev_get_machine(), pc_dimm_slot2bitmap, bitmap, NULL); > > /* check if requested slot is not occupied */ > if (hint) { > diff --git a/hw/misc/mos6522.c b/hw/misc/mos6522.c > index d6ba47bde9..d7a660a4a3 100644 > --- a/hw/misc/mos6522.c > +++ b/hw/misc/mos6522.c > @@ -497,7 +497,7 @@ void mos6522_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) > } > } > > -static int qmp_x_query_via_foreach(Object *obj, void *opaque) > +static bool qmp_x_query_via_foreach(Object *obj, void *opaque, Error **errp) > { > GString *buf = opaque; > > @@ -573,7 +573,7 @@ static int qmp_x_query_via_foreach(Object *obj, void *opaque) > get_next_irq_time(s, &s->timers[1], now)); > } > > - return 0; > + return true; > } > > static HumanReadableText *qmp_x_query_via(Error **errp) > @@ -581,7 +581,7 @@ static HumanReadableText *qmp_x_query_via(Error **errp) > g_autoptr(GString) buf = g_string_new(""); > > object_child_foreach_recursive(object_get_root(), > - qmp_x_query_via_foreach, buf); > + qmp_x_query_via_foreach, buf, NULL); > > return human_readable_text_from_str(buf); > } > diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c > index 38e69f3b39..36b372dd95 100644 > --- a/hw/ppc/pnv.c > +++ b/hw/ppc/pnv.c > @@ -747,18 +747,17 @@ static void pnv_chip_power8_pic_print_info(PnvChip *chip, Monitor *mon) > } > } > > -static int pnv_chip_power9_pic_print_info_child(Object *child, void *opaque) > +static bool pnv_chip_power9_pic_print_info_child(Object *child, void *opaque, > + Error **errp) > { > Monitor *mon = opaque; > PnvPHB *phb = (PnvPHB *) object_dynamic_cast(child, TYPE_PNV_PHB); > > - if (!phb) { > - return 0; > + if (phb) { > + pnv_phb4_pic_print_info(PNV_PHB4(phb->backend), mon); > } > > - pnv_phb4_pic_print_info(PNV_PHB4(phb->backend), mon); > - > - return 0; > + return true; > } > > static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon) > @@ -769,7 +768,7 @@ static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon) > pnv_psi_pic_print_info(&chip9->psi, mon); > > object_child_foreach_recursive(OBJECT(chip), > - pnv_chip_power9_pic_print_info_child, mon); > + pnv_chip_power9_pic_print_info_child, mon, NULL); > } > > static uint64_t pnv_chip_power8_xscom_core_base(PnvChip *chip, > @@ -817,7 +816,7 @@ static void pnv_chip_power10_pic_print_info(PnvChip *chip, Monitor *mon) > pnv_psi_pic_print_info(&chip10->psi, mon); > > object_child_foreach_recursive(OBJECT(chip), > - pnv_chip_power9_pic_print_info_child, mon); > + pnv_chip_power9_pic_print_info_child, mon, NULL); > } > > /* Always give the first 1GB to chip 0 else we won't boot */ > diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c > index 99f1e8d7f9..05acc88a55 100644 > --- a/hw/ppc/pnv_bmc.c > +++ b/hw/ppc/pnv_bmc.c > @@ -283,17 +283,17 @@ typedef struct ForeachArgs { > Object *obj; > } ForeachArgs; > > -static int bmc_find(Object *child, void *opaque) > +static bool bmc_find(Object *child, void *opaque, Error **errp) > { > ForeachArgs *args = opaque; > > if (object_dynamic_cast(child, args->name)) { > if (args->obj) { > - return 1; > + return false; > } > args->obj = child; > } > - return 0; > + return true; > } > > IPMIBmc *pnv_bmc_find(Error **errp) > @@ -301,7 +301,8 @@ IPMIBmc *pnv_bmc_find(Error **errp) > ForeachArgs args = { TYPE_IPMI_BMC, NULL }; > int ret; > > - ret = object_child_foreach_recursive(object_get_root(), bmc_find, &args); > + ret = object_child_foreach_recursive(object_get_root(), bmc_find, > + &args, NULL); > if (ret) { > error_setg(errp, "machine should have only one BMC device. " > "Use '-nodefaults'"); > diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c > index d820e05e40..c7ca5a5b4c 100644 > --- a/hw/ppc/pnv_xscom.c > +++ b/hw/ppc/pnv_xscom.c > @@ -254,7 +254,7 @@ typedef struct ForeachPopulateArgs { > int xscom_offset; > } ForeachPopulateArgs; > > -static int xscom_dt_child(Object *child, void *opaque) > +static bool xscom_dt_child(Object *child, void *opaque, Error **errp) > { > if (object_dynamic_cast(child, TYPE_PNV_XSCOM_INTERFACE)) { > ForeachPopulateArgs *args = opaque; > @@ -268,7 +268,7 @@ static int xscom_dt_child(Object *child, void *opaque) > _FDT((xc->dt_xscom(xd, args->fdt, args->xscom_offset))); > } > } > - return 0; > + return true; > } > > int pnv_dt_xscom(PnvChip *chip, void *fdt, int root_offset, > @@ -308,7 +308,7 @@ int pnv_dt_xscom(PnvChip *chip, void *fdt, int root_offset, > * PnvXScomInterface objects which can lie a bit deeper than the > * first layer. > */ > - object_child_foreach_recursive(OBJECT(chip), xscom_dt_child, &args); > + object_child_foreach_recursive(OBJECT(chip), xscom_dt_child, &args, NULL); > return 0; > } > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > index 75aacda65a..2eed33ab3b 100644 > --- a/hw/ppc/spapr_pci.c > +++ b/hw/ppc/spapr_pci.c > @@ -1488,28 +1488,31 @@ static void spapr_pci_bridge_plug(SpaprPhbState *phb, > } > > /* Returns non-zero if the value of "chassis_nr" is already in use */ > -static int check_chassis_nr(Object *obj, void *opaque) > +static bool check_chassis_nr(Object *obj, void *opaque, Error **errp) > { > - int new_chassis_nr = > - object_property_get_uint(opaque, "chassis_nr", &error_abort); > - int chassis_nr = > - object_property_get_uint(obj, "chassis_nr", NULL); > - > - if (!object_dynamic_cast(obj, TYPE_PCI_BRIDGE)) { > - return 0; > - } > - > - /* Skip unsupported bridge types */ > - if (!chassis_nr) { > - return 0; > - } > + int chassis_nr; > > /* Skip self */ > if (obj == opaque) { > - return 0; > + return true; > } > > - return chassis_nr == new_chassis_nr; > + if (!object_dynamic_cast(obj, TYPE_PCI_BRIDGE)) { > + return true; > + } > + > + chassis_nr = object_property_get_uint(obj, "chassis_nr", NULL); > + /* Skip unsupported bridge types */ > + if (!chassis_nr) { > + return true; > + } > + > + if (chassis_nr == object_property_get_uint(opaque, "chassis_nr", > + &error_abort)) { > + error_setg(errp, "Bridge chassis %d already in use", chassis_nr); > + return false; > + } > + return true; > } > > static bool bridge_has_valid_chassis_nr(Object *bridge, Error **errp) > @@ -1529,13 +1532,8 @@ static bool bridge_has_valid_chassis_nr(Object *bridge, Error **errp) > } > > /* We want unique values for "chassis_nr" */ > - if (object_child_foreach_recursive(object_get_root(), check_chassis_nr, > - bridge)) { > - error_setg(errp, "Bridge chassis %d already in use", chassis_nr); > - return false; > - } > - > - return true; > + return object_child_foreach_recursive(object_get_root(), check_chassis_nr, > + bridge, errp); > } > > static void spapr_pci_pre_plug(HotplugHandler *plug_handler, > @@ -2035,7 +2033,7 @@ unrealize: > spapr_phb_unrealize(dev); > } > > -static int spapr_phb_children_reset(Object *child, void *opaque) > +static bool spapr_phb_children_reset(Object *child, void *opaque, Error **errp) > { > DeviceState *dev = (DeviceState *) object_dynamic_cast(child, TYPE_DEVICE); > > @@ -2043,7 +2041,7 @@ static int spapr_phb_children_reset(Object *child, void *opaque) > device_cold_reset(dev); > } > > - return 0; > + return true; > } > > void spapr_phb_dma_reset(SpaprPhbState *sphb) > @@ -2079,7 +2077,7 @@ static void spapr_phb_reset(DeviceState *qdev) > } > > /* Reset the IOMMU state */ > - object_child_foreach(OBJECT(qdev), spapr_phb_children_reset, NULL); > + object_child_foreach(OBJECT(qdev), spapr_phb_children_reset, NULL, NULL); > > if (spapr_phb_eeh_available(SPAPR_PCI_HOST_BRIDGE(qdev))) { > spapr_phb_vfio_reset(qdev); > diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c > index 98f1310c6e..48ba59e4b3 100644 > --- a/hw/ppc/spapr_rtas_ddw.c > +++ b/hw/ppc/spapr_rtas_ddw.c > @@ -24,7 +24,8 @@ > #include "hw/pci-host/spapr.h" > #include "trace.h" > > -static int spapr_phb_get_active_win_num_cb(Object *child, void *opaque) > +static bool spapr_phb_get_active_win_num_cb(Object *child, void *opaque, > + Error **errp) > { > SpaprTceTable *tcet; > > @@ -32,19 +33,21 @@ static int spapr_phb_get_active_win_num_cb(Object *child, void *opaque) > if (tcet && tcet->nb_table) { > ++*(unsigned *)opaque; > } > - return 0; > + return true; > } > > static unsigned spapr_phb_get_active_win_num(SpaprPhbState *sphb) > { > unsigned ret = 0; > > - object_child_foreach(OBJECT(sphb), spapr_phb_get_active_win_num_cb, &ret); > + object_child_foreach(OBJECT(sphb), spapr_phb_get_active_win_num_cb, > + &ret, NULL); > > return ret; > } > > -static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) > +static bool spapr_phb_get_free_liobn_cb(Object *child, void *opaque, > + Error **errp) > { > SpaprTceTable *tcet; > > @@ -52,14 +55,15 @@ static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) > if (tcet && !tcet->nb_table) { > *(uint32_t *)opaque = tcet->liobn; > } > - return 0; > + return true; > } > > static unsigned spapr_phb_get_free_liobn(SpaprPhbState *sphb) > { > uint32_t liobn = 0; > > - object_child_foreach(OBJECT(sphb), spapr_phb_get_free_liobn_cb, &liobn); > + object_child_foreach(OBJECT(sphb), spapr_phb_get_free_liobn_cb, > + &liobn, NULL); > > return liobn; > } > diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c > index 4fc6712025..5b25118edc 100644 > --- a/hw/rdma/vmw/pvrdma_main.c > +++ b/hw/rdma/vmw/pvrdma_main.c > @@ -574,7 +574,7 @@ static void init_dev_caps(PVRDMADev *dev) > dev->dev_attr.max_sge) - TARGET_PAGE_SIZE; > } > > -static int pvrdma_check_ram_shared(Object *obj, void *opaque) > +static bool pvrdma_check_ram_shared(Object *obj, void *opaque, Error **errp) > { > bool *shared = opaque; > > @@ -582,7 +582,7 @@ static int pvrdma_check_ram_shared(Object *obj, void *opaque) > *shared = object_property_get_bool(obj, "share", NULL); > } > > - return 0; > + return true; > } > > static void pvrdma_shutdown_notifier(Notifier *n, void *opaque) > @@ -623,7 +623,8 @@ static void pvrdma_realize(PCIDevice *pdev, Error **errp) > > memdev_root = object_resolve_path("/objects", NULL); > if (memdev_root) { > - object_child_foreach(memdev_root, pvrdma_check_ram_shared, &ram_shared); > + object_child_foreach(memdev_root, pvrdma_check_ram_shared, > + &ram_shared, NULL); > } > if (!ram_shared) { > error_setg(errp, "Only shared memory backed ram is supported"); > diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c > index 746f07c4d2..84cd2a1334 100644 > --- a/hw/virtio/virtio-balloon.c > +++ b/hw/virtio/virtio-balloon.c > @@ -729,7 +729,7 @@ static void virtio_balloon_get_config(VirtIODevice *vdev, uint8_t *config_data) > memcpy(config_data, &config, virtio_balloon_config_size(dev)); > } > > -static int build_dimm_list(Object *obj, void *opaque) > +static bool build_dimm_list(Object *obj, void *opaque, Error **errp) > { > GSList **list = opaque; > > @@ -740,8 +740,7 @@ static int build_dimm_list(Object *obj, void *opaque) > } > } > > - object_child_foreach(obj, build_dimm_list, opaque); > - return 0; > + return object_child_foreach(obj, build_dimm_list, opaque, errp); > } > > static ram_addr_t get_current_ram_size(void) > @@ -749,7 +748,7 @@ static ram_addr_t get_current_ram_size(void) > GSList *list = NULL, *item; > ram_addr_t size = current_machine->ram_size; > > - build_dimm_list(qdev_get_machine(), &list); > + build_dimm_list(qdev_get_machine(), &list, NULL); > for (item = list; item; item = g_slist_next(item)) { > Object *obj = OBJECT(item->data); > if (!strcmp(object_get_typename(obj), TYPE_PC_DIMM)) { > diff --git a/include/qom/object.h b/include/qom/object.h > index ef7258a5e1..7809cd3925 100644 > --- a/include/qom/object.h > +++ b/include/qom/object.h > @@ -1907,36 +1907,40 @@ void object_class_property_set_description(ObjectClass *klass, const char *name, > * @obj: the object whose children will be navigated > * @fn: the iterator function to be called > * @opaque: an opaque value that will be passed to the iterator > + * @errp: pointer to a NULL-initialized error object > * > - * Call @fn passing each child of @obj and @opaque to it, until @fn returns > - * non-zero. > + * Call @fn passing each child of @obj, @opaque and @errp to it, > + * until @fn returns false. > * > * It is forbidden to add or remove children from @obj from the @fn > * callback. > * > - * Returns: The last value returned by @fn, or 0 if there is no child. > + * Returns: The last value returned by @fn, or %true if there is no child. > */ > -int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), > - void *opaque); > +bool object_child_foreach(Object *obj, > + bool (*fn)(Object *child, void *opaque, Error **errp), > + void *opaque, Error **errp); > > /** > * object_child_foreach_recursive: > * @obj: the object whose children will be navigated > * @fn: the iterator function to be called > * @opaque: an opaque value that will be passed to the iterator > + * @errp: pointer to a NULL-initialized error object > * > - * Call @fn passing each child of @obj and @opaque to it, until @fn returns > - * non-zero. Calls recursively, all child nodes of @obj will also be passed > - * all the way down to the leaf nodes of the tree. Depth first ordering. > + * Call @fn passing each child of @obj, @opaque and @errp to it, until @fn > + * returns false. Calls recursively, all child nodes of @obj will also be > + * passed all the way down to the leaf nodes of the tree. Depth first ordering. > * > * It is forbidden to add or remove children from @obj (or its > * child nodes) from the @fn callback. > * > - * Returns: The last value returned by @fn, or 0 if there is no child. > + * Returns: The last value returned by @fn, or %true if there is no child. > */ > -int object_child_foreach_recursive(Object *obj, > - int (*fn)(Object *child, void *opaque), > - void *opaque); > +bool object_child_foreach_recursive(Object *obj, > + bool (*fn)(Object *child, void *opaque, > + Error **errp), > + void *opaque, Error **errp); > /** > * container_get: > * @root: root of the #path, e.g., object_get_root() > diff --git a/iothread.c b/iothread.c > index 3862a64471..67ce6fe014 100644 > --- a/iothread.c > +++ b/iothread.c > @@ -342,7 +342,7 @@ AioContext *iothread_get_aio_context(IOThread *iothread) > return iothread->ctx; > } > > -static int query_one_iothread(Object *object, void *opaque) > +static bool query_one_iothread(Object *object, void *opaque, Error **errp) > { > IOThreadInfoList ***tail = opaque; > IOThreadInfo *info; > @@ -350,7 +350,7 @@ static int query_one_iothread(Object *object, void *opaque) > > iothread = (IOThread *)object_dynamic_cast(object, TYPE_IOTHREAD); > if (!iothread) { > - return 0; > + return true; > } > > info = g_new0(IOThreadInfo, 1); > @@ -362,7 +362,7 @@ static int query_one_iothread(Object *object, void *opaque) > info->aio_max_batch = iothread->parent_obj.aio_max_batch; > > QAPI_LIST_APPEND(*tail, info); > - return 0; > + return true; > } > > IOThreadInfoList *qmp_query_iothreads(Error **errp) > @@ -371,7 +371,7 @@ IOThreadInfoList *qmp_query_iothreads(Error **errp) > IOThreadInfoList **prev = &head; > Object *container = object_get_objects_root(); > > - object_child_foreach(container, query_one_iothread, &prev); > + object_child_foreach(container, query_one_iothread, &prev, errp); > return head; > } > > diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c > index 34bd8c67d7..1b8c406ed0 100644 > --- a/monitor/hmp-cmds.c > +++ b/monitor/hmp-cmds.c > @@ -82,7 +82,7 @@ void hmp_info_version(Monitor *mon, const QDict *qdict) > qapi_free_VersionInfo(info); > } > > -static int hmp_info_pic_foreach(Object *obj, void *opaque) > +static bool hmp_info_pic_foreach(Object *obj, void *opaque, Error **errp) > { > InterruptStatsProvider *intc; > InterruptStatsProviderClass *k; > @@ -99,13 +99,13 @@ static int hmp_info_pic_foreach(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > void hmp_info_pic(Monitor *mon, const QDict *qdict) > { > object_child_foreach_recursive(object_get_root(), > - hmp_info_pic_foreach, mon); > + hmp_info_pic_foreach, mon, NULL); > } > > void hmp_quit(Monitor *mon, const QDict *qdict) > diff --git a/qom/object.c b/qom/object.c > index e25f1e96db..665edd1693 100644 > --- a/qom/object.c > +++ b/qom/object.c > @@ -1104,45 +1104,45 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), > enumerating_types = false; > } > > -static int do_object_child_foreach(Object *obj, > - int (*fn)(Object *child, void *opaque), > - void *opaque, bool recurse) > +static bool do_object_child_foreach(Object *obj, > + bool (*fn)(Object *child, void *opaque, > + Error **errp), > + void *opaque, bool recurse, Error **errp) > { > GHashTableIter iter; > ObjectProperty *prop; > - int ret = 0; > > g_hash_table_iter_init(&iter, obj->properties); > while (g_hash_table_iter_next(&iter, NULL, (gpointer *)&prop)) { > if (object_property_is_child(prop)) { > Object *child = prop->opaque; > > - ret = fn(child, opaque); > - if (ret != 0) { > - break; > + if (!fn(child, opaque, errp)) { > + return false; > } > if (recurse) { > - ret = do_object_child_foreach(child, fn, opaque, true); > - if (ret != 0) { > - break; > + if (!do_object_child_foreach(child, fn, opaque, true, errp)) { > + return false; > } > } > } > } > - return ret; > + return true; > } > > -int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), > - void *opaque) > +bool object_child_foreach(Object *obj, > + bool (*fn)(Object *child, void *opaque, Error **errp), > + void *opaque, Error **errp) > { > - return do_object_child_foreach(obj, fn, opaque, false); > + return do_object_child_foreach(obj, fn, opaque, false, errp); > } > > -int object_child_foreach_recursive(Object *obj, > - int (*fn)(Object *child, void *opaque), > - void *opaque) > +bool object_child_foreach_recursive(Object *obj, > + bool (*fn)(Object *child, void *opaque, > + Error **errp), > + void *opaque, Error **errp) > { > - return do_object_child_foreach(obj, fn, opaque, true); > + return do_object_child_foreach(obj, fn, opaque, true, errp); > } > > static void object_class_get_list_tramp(ObjectClass *klass, void *opaque) > diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c > index 6e3a2175a4..9a3267020e 100644 > --- a/qom/qom-hmp-cmds.c > +++ b/qom/qom-hmp-cmds.c > @@ -101,10 +101,11 @@ static int qom_composition_compare(const void *a, const void *b) > object_get_canonical_path_component(*(Object **)b)); > } > > -static int insert_qom_composition_child(Object *obj, void *opaque) > +static bool insert_qom_composition_child(Object *obj, void *opaque, > + Error **errp) > { > g_array_append_val(opaque, obj); > - return 0; > + return true; > } > > static void print_qom_composition(Monitor *mon, Object *obj, int indent) > @@ -121,7 +122,7 @@ static void print_qom_composition(Monitor *mon, Object *obj, int indent) > monitor_printf(mon, "%*s/%s (%s)\n", indent, "", name, > object_get_typename(obj)); > > - object_child_foreach(obj, insert_qom_composition_child, children); > + object_child_foreach(obj, insert_qom_composition_child, children, NULL); > g_array_sort(children, qom_composition_compare); > > for (i = 0; i < children->len; i++) { > diff --git a/scsi/pr-manager.c b/scsi/pr-manager.c > index 2098d7e759..48a32729ba 100644 > --- a/scsi/pr-manager.c > +++ b/scsi/pr-manager.c > @@ -114,7 +114,7 @@ pr_manager_register_types(void) > type_register_static(&pr_manager_info); > } > > -static int query_one_pr_manager(Object *object, void *opaque) > +static bool query_one_pr_manager(Object *object, void *opaque, Error **errp) > { > PRManagerInfoList ***tail = opaque; > PRManagerInfo *info; > @@ -122,14 +122,14 @@ static int query_one_pr_manager(Object *object, void *opaque) > > pr_mgr = (PRManager *)object_dynamic_cast(object, TYPE_PR_MANAGER); > if (!pr_mgr) { > - return 0; > + return true; > } > > info = g_new0(PRManagerInfo, 1); > info->id = g_strdup(object_get_canonical_path_component(object)); > info->connected = pr_manager_is_connected(pr_mgr); > QAPI_LIST_APPEND(*tail, info); > - return 0; > + return true; > } > > PRManagerInfoList *qmp_query_pr_managers(Error **errp) > @@ -138,7 +138,7 @@ PRManagerInfoList *qmp_query_pr_managers(Error **errp) > PRManagerInfoList **prev = &head; > Object *container = container_get(object_get_root(), PR_MANAGER_PATH); > > - object_child_foreach(container, query_one_pr_manager, &prev); > + object_child_foreach(container, query_one_pr_manager, &prev, errp); > return head; > } > > diff --git a/softmmu/physmem.c b/softmmu/physmem.c > index cb998cdf23..033f021030 100644 > --- a/softmmu/physmem.c > +++ b/softmmu/physmem.c > @@ -1332,7 +1332,7 @@ GString *ram_block_format(void) > return buf; > } > > -static int find_min_backend_pagesize(Object *obj, void *opaque) > +static bool find_min_backend_pagesize(Object *obj, void *opaque, Error **errp) > { > long *hpsize_min = opaque; > > @@ -1345,10 +1345,10 @@ static int find_min_backend_pagesize(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > -static int find_max_backend_pagesize(Object *obj, void *opaque) > +static bool find_max_backend_pagesize(Object *obj, void *opaque, Error **errp) > { > long *hpsize_max = opaque; > > @@ -1361,7 +1361,7 @@ static int find_max_backend_pagesize(Object *obj, void *opaque) > } > } > > - return 0; > + return true; > } > > /* > @@ -1373,7 +1373,7 @@ long qemu_minrampagesize(void) > long hpsize = LONG_MAX; > Object *memdev_root = object_resolve_path("/objects", NULL); > > - object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize); > + object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize, NULL); > return hpsize; > } > > @@ -1382,7 +1382,8 @@ long qemu_maxrampagesize(void) > long pagesize = 0; > Object *memdev_root = object_resolve_path("/objects", NULL); > > - object_child_foreach(memdev_root, find_max_backend_pagesize, &pagesize); > + object_child_foreach(memdev_root, find_max_backend_pagesize, &pagesize, > + NULL); > return pagesize; > } > > diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c > index b8d2c4dadd..6d5747fce5 100644 > --- a/softmmu/qdev-monitor.c > +++ b/softmmu/qdev-monitor.c > @@ -998,27 +998,28 @@ void device_add_completion(ReadLineState *rs, int nb_args, const char *str) > g_slist_free(list); > } > > -static int qdev_add_hotpluggable_device(Object *obj, void *opaque) > +static bool qdev_add_hotpluggable_device(Object *obj, void *opaque, > + Error **errp) > { > GSList **list = opaque; > DeviceState *dev = (DeviceState *)object_dynamic_cast(obj, TYPE_DEVICE); > > if (dev == NULL) { > - return 0; > + return true; > } > > if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) { > *list = g_slist_append(*list, dev); > } > > - return 0; > + return true; > } > > static GSList *qdev_build_hotpluggable_device_list(Object *peripheral) > { > GSList *list = NULL; > > - object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list); > + object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list, NULL); > > return list; > } > diff --git a/tests/qtest/fuzz/generic_fuzz.c b/tests/qtest/fuzz/generic_fuzz.c > index 7326f6840b..2bd5643372 100644 > --- a/tests/qtest/fuzz/generic_fuzz.c > +++ b/tests/qtest/fuzz/generic_fuzz.c > @@ -761,7 +761,7 @@ static int locate_fuzz_memory_regions(Object *child, void *opaque) > return 0; > } > > -static int locate_fuzz_objects(Object *child, void *opaque) > +static bool locate_fuzz_objects(Object *child, void *opaque, Error **errp) > { > GString *type_name; > GString *path_name; > @@ -800,7 +800,7 @@ static int locate_fuzz_objects(Object *child, void *opaque) > g_string_free(path_name, true); > } > g_string_free(type_name, true); > - return 0; > + return true; > } > > > @@ -866,7 +866,7 @@ static void generic_pre_fuzz(QTestState *s) > printf("Matching objects by name %s\n", result[i]); > object_child_foreach_recursive(qdev_get_machine(), > locate_fuzz_objects, > - name_pattern->str); > + name_pattern->str, NULL); > g_string_free(name_pattern, true); > } > g_strfreev(result); > diff --git a/ui/dbus-chardev.c b/ui/dbus-chardev.c > index 940ef937cd..21de92fc98 100644 > --- a/ui/dbus-chardev.c > +++ b/ui/dbus-chardev.c > @@ -68,18 +68,16 @@ dbus_display_chardev_unexport(DBusDisplay *dpy, DBusChardev *chr) > chr->exported = false; > } > > -static int > -dbus_display_chardev_foreach(Object *obj, void *data) > +static bool > +dbus_display_chardev_foreach(Object *obj, void *data, Error **errp) > { > DBusDisplay *dpy = DBUS_DISPLAY(data); > > - if (!CHARDEV_IS_DBUS(obj)) { > - return 0; > + if (CHARDEV_IS_DBUS(obj)) { > + dbus_display_chardev_export(dpy, DBUS_CHARDEV(obj)); > } > > - dbus_display_chardev_export(dpy, DBUS_CHARDEV(obj)); > - > - return 0; > + return true; > } > > static void > @@ -105,7 +103,7 @@ dbus_chardev_init(DBusDisplay *dpy) > dbus_display_notifier_add(&dpy->notifier); > > object_child_foreach(container_get(object_get_root(), "/chardevs"), > - dbus_display_chardev_foreach, dpy); > + dbus_display_chardev_foreach, dpy, NULL); > } > > static gboolean > diff --git a/util/nvdimm-utils.c b/util/nvdimm-utils.c > index aa3d199f2d..b356a3fbea 100644 > --- a/util/nvdimm-utils.c > +++ b/util/nvdimm-utils.c > @@ -2,7 +2,7 @@ > #include "qemu/nvdimm-utils.h" > #include "hw/mem/nvdimm.h" > > -static int nvdimm_device_list(Object *obj, void *opaque) > +static bool nvdimm_device_list(Object *obj, void *opaque, Error **errp) > { > GSList **list = opaque; > > @@ -10,8 +10,8 @@ static int nvdimm_device_list(Object *obj, void *opaque) > *list = g_slist_append(*list, DEVICE(obj)); > } > > - object_child_foreach(obj, nvdimm_device_list, opaque); > - return 0; > + object_child_foreach(obj, nvdimm_device_list, opaque, errp); > + return true; > } > > /* > @@ -25,6 +25,6 @@ GSList *nvdimm_get_device_list(void) > { > GSList *list = NULL; > > - object_child_foreach(qdev_get_machine(), nvdimm_device_list, &list); > + object_child_foreach(qdev_get_machine(), nvdimm_device_list, &list, NULL); > return list; > } > -- > 2.38.1 ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean 2023-02-16 12:25 ` [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé 2023-02-16 12:30 ` Michael S. Tsirkin @ 2023-02-23 15:40 ` Markus Armbruster 1 sibling, 0 replies; 14+ messages in thread From: Markus Armbruster @ 2023-02-23 15:40 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Marc-André Lureau, Paolo Bonzini, Alex Bennée, Michael S. Tsirkin, Igor Mammedov, Ani Sinha, Jean-Philippe Brucker, Peter Maydell, Shannon Zhao, Eduardo Habkost, Marcel Apfelbaum, Yanan Wang, Daniel P. Berrangé, Gerd Hoffmann, Richard Henderson, Peter Xu, Jason Wang, David Hildenbrand, Xiao Guangrong, Mark Cave-Ayland, Cédric Le Goater, Daniel Henrique Barboza, David Gibson, Greg Kurz, Yuval Shaia, Dr. David Alan Gilbert, Fam Zheng, Alexander Bulekov, Bandan Das, Stefan Hajnoczi, Thomas Huth, Darren Kenny, Qiuhao Li, Laurent Vivier Philippe Mathieu-Daudé <philmd@linaro.org> writes: > Following the Error API best practices documented in commit > e3fe3988d7 ("error: Document Error API usage rules"), have the > object_child_foreach[_recursive]() handler take a Error* argument > and return a boolean indicating whether this error is set or not. > Convert all handler implementations. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> This patch does several things (no, I'm not going to ask to split it): * Convert object_child_foreach() and object_child_foreach_recursive() to the Error API: add parameter Error **errp, change return type from int to bool. Straightforward. * Adjust the callers: pass the new argument. Looks like you pass NULL, which makes sense for a conversion such as this. Always NULL? * Convert object_child_foreach()'s and object_child_foreach_recursive()'s callback parameter to the Error API: add parameter Error **errp, change return type from int to bool. Straightforward. * Adjust the actual callbacks: take the new parameter and use it properly, return bool instead of int. Either don't touch @errp and return true, or store an error to @errp and return false. You're not doing this at least in bmc_find(), see right below. I don't have the time for checking all the callbacks today. Mind doing that yourself? [...] > diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c > index 99f1e8d7f9..05acc88a55 100644 > --- a/hw/ppc/pnv_bmc.c > +++ b/hw/ppc/pnv_bmc.c > @@ -283,17 +283,17 @@ typedef struct ForeachArgs { > Object *obj; > } ForeachArgs; > > -static int bmc_find(Object *child, void *opaque) > +static bool bmc_find(Object *child, void *opaque, Error **errp) > { > ForeachArgs *args = opaque; > > if (object_dynamic_cast(child, args->name)) { > if (args->obj) { > - return 1; > + return false; No error set here. > } > args->obj = child; > } > - return 0; > + return true; > } > > IPMIBmc *pnv_bmc_find(Error **errp) [...] ^ permalink raw reply [flat|nested] 14+ messages in thread
* [RFC PATCH 4/5] hw/nmi: Simplify nmi_monitor_handle() and do_nmi() 2023-02-16 12:25 [PATCH 0/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé ` (2 preceding siblings ...) 2023-02-16 12:25 ` [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé @ 2023-02-16 12:25 ` Philippe Mathieu-Daudé 2023-02-16 12:25 ` [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() Philippe Mathieu-Daudé 4 siblings, 0 replies; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-16 12:25 UTC (permalink / raw) To: qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Philippe Mathieu-Daudé Since the previous commit, object_child_foreach_recursive()'s handler takes an Error* argument and return a boolean. We can remove these fields from the do_nmi_s structure, which then only contains the 'int cpu_index' field. Directly pass 'cpu_index' as context, removing 'struct do_nmi_s'. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- RFC: please double-check... hw/core/nmi.c | 41 ++++++----------------------------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/hw/core/nmi.c b/hw/core/nmi.c index fa74c405f7..f5a6483e89 100644 --- a/hw/core/nmi.c +++ b/hw/core/nmi.c @@ -26,51 +26,22 @@ #include "qemu/module.h" #include "monitor/monitor.h" -struct do_nmi_s { - int cpu_index; - Error *err; - bool handled; -}; - -static void nmi_children(Object *o, struct do_nmi_s *ns); - static bool do_nmi(Object *o, void *opaque, Error **errp) { - struct do_nmi_s *ns = opaque; + int *cpu_index = opaque; NMIState *n = (NMIState *) object_dynamic_cast(o, TYPE_NMI); - if (n) { - NMIClass *nc = NMI_GET_CLASS(n); - - ns->handled = true; - if (!nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err)) { - return false; - } + if (!n) { + error_setg(errp, QERR_UNSUPPORTED); + return false; } - nmi_children(o, ns); - return true; -} - -static void nmi_children(Object *o, struct do_nmi_s *ns) -{ - object_child_foreach(o, do_nmi, ns, NULL); + return NMI_GET_CLASS(n)->nmi_monitor_handler(n, *cpu_index, errp); } void nmi_monitor_handle(int cpu_index, Error **errp) { - struct do_nmi_s ns = { - .cpu_index = cpu_index, - .err = NULL, - .handled = false - }; - - nmi_children(object_get_root(), &ns); - if (ns.handled) { - error_propagate(errp, ns.err); - } else { - error_setg(errp, QERR_UNSUPPORTED); - } + object_child_foreach_recursive(object_get_root(), do_nmi, &cpu_index, errp); } static const TypeInfo nmi_info = { -- 2.38.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() 2023-02-16 12:25 [PATCH 0/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé ` (3 preceding siblings ...) 2023-02-16 12:25 ` [RFC PATCH 4/5] hw/nmi: Simplify nmi_monitor_handle() and do_nmi() Philippe Mathieu-Daudé @ 2023-02-16 12:25 ` Philippe Mathieu-Daudé 2023-02-16 18:12 ` Cédric Le Goater 2023-02-23 15:42 ` Markus Armbruster 4 siblings, 2 replies; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-16 12:25 UTC (permalink / raw) To: qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Philippe Mathieu-Daudé, Cédric Le Goater ForeachArgs::name is only used once as TYPE_IPMI_BMC. Since the penultimate commit, object_child_foreach_recursive()'s handler takes an Error* argument and return a boolean. We can directly pass ForeachArgs::obj as context, removing the ForeachArgs structure. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- RFC: please double-check... hw/ppc/pnv_bmc.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c index 05acc88a55..566284469f 100644 --- a/hw/ppc/pnv_bmc.c +++ b/hw/ppc/pnv_bmc.c @@ -278,36 +278,29 @@ IPMIBmc *pnv_bmc_create(PnvPnor *pnor) return IPMI_BMC(obj); } -typedef struct ForeachArgs { - const char *name; - Object *obj; -} ForeachArgs; - static bool bmc_find(Object *child, void *opaque, Error **errp) { - ForeachArgs *args = opaque; + Object **obj = opaque; - if (object_dynamic_cast(child, args->name)) { - if (args->obj) { - return false; + if (object_dynamic_cast(child, TYPE_IPMI_BMC)) { + if (*obj) { + return true; } - args->obj = child; + *obj = child; } return true; } IPMIBmc *pnv_bmc_find(Error **errp) { - ForeachArgs args = { TYPE_IPMI_BMC, NULL }; - int ret; + Object *obj = NULL; - ret = object_child_foreach_recursive(object_get_root(), bmc_find, - &args, NULL); - if (ret) { + if (!object_child_foreach_recursive(object_get_root(), bmc_find, &obj, + NULL)) { error_setg(errp, "machine should have only one BMC device. " "Use '-nodefaults'"); return NULL; } - return args.obj ? IPMI_BMC(args.obj) : NULL; + return IPMI_BMC(obj); } -- 2.38.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() 2023-02-16 12:25 ` [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() Philippe Mathieu-Daudé @ 2023-02-16 18:12 ` Cédric Le Goater 2023-02-16 19:16 ` Philippe Mathieu-Daudé 2023-02-23 15:42 ` Markus Armbruster 1 sibling, 1 reply; 14+ messages in thread From: Cédric Le Goater @ 2023-02-16 18:12 UTC (permalink / raw) To: Philippe Mathieu-Daudé, qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block On 2/16/23 13:25, Philippe Mathieu-Daudé wrote: > ForeachArgs::name is only used once as TYPE_IPMI_BMC. > Since the penultimate commit, object_child_foreach_recursive()'s > handler takes an Error* argument and return a boolean. > We can directly pass ForeachArgs::obj as context, removing the > ForeachArgs structure. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > > --- > RFC: please double-check... > > > hw/ppc/pnv_bmc.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) > > diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c > index 05acc88a55..566284469f 100644 > --- a/hw/ppc/pnv_bmc.c > +++ b/hw/ppc/pnv_bmc.c > @@ -278,36 +278,29 @@ IPMIBmc *pnv_bmc_create(PnvPnor *pnor) > return IPMI_BMC(obj); > } > > -typedef struct ForeachArgs { > - const char *name; > - Object *obj; > -} ForeachArgs; > - > static bool bmc_find(Object *child, void *opaque, Error **errp) > { > - ForeachArgs *args = opaque; > + Object **obj = opaque; > > - if (object_dynamic_cast(child, args->name)) { > - if (args->obj) { > - return false; The purpose of this test was to catch multiple bmc devices and it's removed now. > + if (object_dynamic_cast(child, TYPE_IPMI_BMC)) { > + if (*obj) { > + return true; > } > - args->obj = child; > + *obj = child; > } > return true; > } > > IPMIBmc *pnv_bmc_find(Error **errp) > { > - ForeachArgs args = { TYPE_IPMI_BMC, NULL }; > - int ret; > + Object *obj = NULL; > > - ret = object_child_foreach_recursive(object_get_root(), bmc_find, > - &args, NULL); > - if (ret) { > + if (!object_child_foreach_recursive(object_get_root(), bmc_find, &obj, > + NULL)) { > error_setg(errp, "machine should have only one BMC device. " > "Use '-nodefaults'");> return NULL; > } We don't test obj against NULL any more. This could break the QOM cast below. Thanks, C. > > - return args.obj ? IPMI_BMC(args.obj) : NULL; > + return IPMI_BMC(obj); > } ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() 2023-02-16 18:12 ` Cédric Le Goater @ 2023-02-16 19:16 ` Philippe Mathieu-Daudé 2023-02-17 8:04 ` Cédric Le Goater 0 siblings, 1 reply; 14+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-16 19:16 UTC (permalink / raw) To: Cédric Le Goater, qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block On 16/2/23 19:12, Cédric Le Goater wrote: > On 2/16/23 13:25, Philippe Mathieu-Daudé wrote: >> ForeachArgs::name is only used once as TYPE_IPMI_BMC. >> Since the penultimate commit, object_child_foreach_recursive()'s >> handler takes an Error* argument and return a boolean. >> We can directly pass ForeachArgs::obj as context, removing the >> ForeachArgs structure. >> >> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> >> >> --- >> RFC: please double-check... >> >> >> hw/ppc/pnv_bmc.c | 25 +++++++++---------------- >> 1 file changed, 9 insertions(+), 16 deletions(-) >> >> diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c >> index 05acc88a55..566284469f 100644 >> --- a/hw/ppc/pnv_bmc.c >> +++ b/hw/ppc/pnv_bmc.c >> @@ -278,36 +278,29 @@ IPMIBmc *pnv_bmc_create(PnvPnor *pnor) >> return IPMI_BMC(obj); >> } >> -typedef struct ForeachArgs { >> - const char *name; >> - Object *obj; >> -} ForeachArgs; >> - >> static bool bmc_find(Object *child, void *opaque, Error **errp) >> { >> - ForeachArgs *args = opaque; >> + Object **obj = opaque; >> - if (object_dynamic_cast(child, args->name)) { >> - if (args->obj) { >> - return false; > > The purpose of this test was to catch multiple bmc devices and it's removed > now. Great. >> + if (object_dynamic_cast(child, TYPE_IPMI_BMC)) { >> + if (*obj) { >> + return true; >> } >> - args->obj = child; >> + *obj = child; >> } >> return true; >> } >> IPMIBmc *pnv_bmc_find(Error **errp) >> { >> - ForeachArgs args = { TYPE_IPMI_BMC, NULL }; >> - int ret; >> + Object *obj = NULL; >> - ret = object_child_foreach_recursive(object_get_root(), bmc_find, >> - &args, NULL); >> - if (ret) { >> + if (!object_child_foreach_recursive(object_get_root(), bmc_find, >> &obj, >> + NULL)) { >> error_setg(errp, "machine should have only one BMC device. " >> "Use '-nodefaults'");> return NULL; >> } > > We don't test obj against NULL any more. This could break the QOM cast > below. IIUC QOM cast-macros are NULL-safe, see https://lore.kernel.org/qemu-devel/20210107121304.1db97130@bahia.lan/ If you concur I'll try to update the QOM API doc where relevant. >> - return args.obj ? IPMI_BMC(args.obj) : NULL; >> + return IPMI_BMC(obj); >> } > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() 2023-02-16 19:16 ` Philippe Mathieu-Daudé @ 2023-02-17 8:04 ` Cédric Le Goater 0 siblings, 0 replies; 14+ messages in thread From: Cédric Le Goater @ 2023-02-17 8:04 UTC (permalink / raw) To: Philippe Mathieu-Daudé, qemu-devel Cc: Markus Armbruster, qemu-arm, qemu-s390x, qemu-ppc, qemu-block On 2/16/23 20:16, Philippe Mathieu-Daudé wrote: > On 16/2/23 19:12, Cédric Le Goater wrote: >> On 2/16/23 13:25, Philippe Mathieu-Daudé wrote: >>> ForeachArgs::name is only used once as TYPE_IPMI_BMC. >>> Since the penultimate commit, object_child_foreach_recursive()'s >>> handler takes an Error* argument and return a boolean. >>> We can directly pass ForeachArgs::obj as context, removing the >>> ForeachArgs structure. >>> >>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> >>> >>> --- >>> RFC: please double-check... >>> >>> >>> hw/ppc/pnv_bmc.c | 25 +++++++++---------------- >>> 1 file changed, 9 insertions(+), 16 deletions(-) >>> >>> diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c >>> index 05acc88a55..566284469f 100644 >>> --- a/hw/ppc/pnv_bmc.c >>> +++ b/hw/ppc/pnv_bmc.c >>> @@ -278,36 +278,29 @@ IPMIBmc *pnv_bmc_create(PnvPnor *pnor) >>> return IPMI_BMC(obj); >>> } >>> -typedef struct ForeachArgs { >>> - const char *name; >>> - Object *obj; >>> -} ForeachArgs; >>> - >>> static bool bmc_find(Object *child, void *opaque, Error **errp) >>> { >>> - ForeachArgs *args = opaque; >>> + Object **obj = opaque; >>> - if (object_dynamic_cast(child, args->name)) { >>> - if (args->obj) { >>> - return false; >> >> The purpose of this test was to catch multiple bmc devices and it's removed >> now. > > Great. But it should be an error ! :) See the error_setg below. >>> + if (object_dynamic_cast(child, TYPE_IPMI_BMC)) { >>> + if (*obj) { >>> + return true; >>> } >>> - args->obj = child; >>> + *obj = child; >>> } >>> return true; >>> } >>> IPMIBmc *pnv_bmc_find(Error **errp) >>> { >>> - ForeachArgs args = { TYPE_IPMI_BMC, NULL }; >>> - int ret; >>> + Object *obj = NULL; >>> - ret = object_child_foreach_recursive(object_get_root(), bmc_find, >>> - &args, NULL); >>> - if (ret) { >>> + if (!object_child_foreach_recursive(object_get_root(), bmc_find, &obj, >>> + NULL)) { >>> error_setg(errp, "machine should have only one BMC device. " >>> "Use '-nodefaults'");> return NULL; >>> } >> >> We don't test obj against NULL any more. This could break the QOM cast below. > > IIUC QOM cast-macros are NULL-safe, see > https://lore.kernel.org/qemu-devel/20210107121304.1db97130@bahia.lan/ even when CONFIG_QOM_CAST_DEBUG is set ? I might have missed something. Thanks, C. > > If you concur I'll try to update the QOM API doc where relevant. > >>> - return args.obj ? IPMI_BMC(args.obj) : NULL; >>> + return IPMI_BMC(obj); >>> } >> > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() 2023-02-16 12:25 ` [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() Philippe Mathieu-Daudé 2023-02-16 18:12 ` Cédric Le Goater @ 2023-02-23 15:42 ` Markus Armbruster 1 sibling, 0 replies; 14+ messages in thread From: Markus Armbruster @ 2023-02-23 15:42 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, qemu-arm, qemu-s390x, qemu-ppc, qemu-block, Cédric Le Goater Philippe Mathieu-Daudé <philmd@linaro.org> writes: > ForeachArgs::name is only used once as TYPE_IPMI_BMC. > Since the penultimate commit, object_child_foreach_recursive()'s > handler takes an Error* argument and return a boolean. > We can directly pass ForeachArgs::obj as context, removing the > ForeachArgs structure. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > RFC: please double-check... > > hw/ppc/pnv_bmc.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) > > diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c > index 05acc88a55..566284469f 100644 > --- a/hw/ppc/pnv_bmc.c > +++ b/hw/ppc/pnv_bmc.c > @@ -278,36 +278,29 @@ IPMIBmc *pnv_bmc_create(PnvPnor *pnor) > return IPMI_BMC(obj); > } > > -typedef struct ForeachArgs { > - const char *name; > - Object *obj; > -} ForeachArgs; > - > static bool bmc_find(Object *child, void *opaque, Error **errp) > { > - ForeachArgs *args = opaque; > + Object **obj = opaque; > > - if (object_dynamic_cast(child, args->name)) { > - if (args->obj) { > - return false; > + if (object_dynamic_cast(child, TYPE_IPMI_BMC)) { > + if (*obj) { > + return true; Looks like you're changing return false to return true. Intendional? > } > - args->obj = child; > + *obj = child; > } > return true; > } > > IPMIBmc *pnv_bmc_find(Error **errp) > { > - ForeachArgs args = { TYPE_IPMI_BMC, NULL }; > - int ret; > + Object *obj = NULL; > > - ret = object_child_foreach_recursive(object_get_root(), bmc_find, > - &args, NULL); > - if (ret) { > + if (!object_child_foreach_recursive(object_get_root(), bmc_find, &obj, > + NULL)) { > error_setg(errp, "machine should have only one BMC device. " > "Use '-nodefaults'"); > return NULL; > } > > - return args.obj ? IPMI_BMC(args.obj) : NULL; > + return IPMI_BMC(obj); > } ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2023-02-23 15:42 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-02-16 12:25 [PATCH 0/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé 2023-02-16 12:25 ` [PATCH 1/5] hw/nmi: Have nmi_monitor_handler() return a boolean indicating error Philippe Mathieu-Daudé 2023-02-23 15:26 ` Markus Armbruster 2023-02-16 12:25 ` [PATCH 2/5] spapr/ddw: Remove confuse return value in spapr_phb_get_free_liobn() Philippe Mathieu-Daudé 2023-02-17 10:31 ` Daniel Henrique Barboza 2023-02-16 12:25 ` [PATCH 3/5] bulk: Have object_child_foreach() take Error* and return boolean Philippe Mathieu-Daudé 2023-02-16 12:30 ` Michael S. Tsirkin 2023-02-23 15:40 ` Markus Armbruster 2023-02-16 12:25 ` [RFC PATCH 4/5] hw/nmi: Simplify nmi_monitor_handle() and do_nmi() Philippe Mathieu-Daudé 2023-02-16 12:25 ` [RFC PATCH 5/5] hw/ppc/pnv_bmc: Simplify pnv_bmc_find() Philippe Mathieu-Daudé 2023-02-16 18:12 ` Cédric Le Goater 2023-02-16 19:16 ` Philippe Mathieu-Daudé 2023-02-17 8:04 ` Cédric Le Goater 2023-02-23 15:42 ` Markus Armbruster
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).