Message ID | 20201123141435.2726558-37-pbonzini@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cleanup qemu_init and make sense of command line processing | expand |
On Mon, 23 Nov 2020 09:14:35 -0500 Paolo Bonzini <pbonzini@redhat.com> wrote: > qdev_machine_creation_done is only setting a flag now. Extend it to > move more code out of vl.c. Leave only consistency checks and gdbserver > processing in qemu_machine_creation_done. > > gdbserver_start can be moved after qdev_machine_creation_done because > it only does listen on the socket and creates some internal data > structures; it does not send any data (e.g. guest state) over the socket. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: > --- > hw/core/machine.c | 47 +++++++++++++++++++++++++++++++++++++++++- > hw/core/qdev.c | 12 +++-------- > include/hw/qdev-core.h | 1 + > softmmu/vl.c | 37 +-------------------------------- > 4 files changed, 51 insertions(+), 46 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 5659b1f49c..025c4f9749 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -16,16 +16,21 @@ > #include "sysemu/replay.h" > #include "qemu/units.h" > #include "hw/boards.h" > +#include "hw/loader.h" > #include "qapi/error.h" > #include "qapi/qapi-visit-common.h" > #include "qapi/visitor.h" > #include "hw/sysbus.h" > +#include "sysemu/cpus.h" > #include "sysemu/sysemu.h" > +#include "sysemu/reset.h" > +#include "sysemu/runstate.h" > #include "sysemu/numa.h" > #include "qemu/error-report.h" > #include "sysemu/qtest.h" > #include "hw/pci/pci.h" > #include "hw/mem/nvdimm.h" > +#include "migration/global_state.h" > #include "migration/vmstate.h" > > GlobalProperty hw_compat_5_1[] = { > @@ -1186,10 +1191,50 @@ void qemu_remove_machine_init_done_notifier(Notifier *notify) > notifier_remove(notify); > } > > -void qemu_run_machine_init_done_notifiers(void) > +void qdev_machine_creation_done(void) > { > + cpu_synchronize_all_post_init(); > + > + if (current_machine->boot_once) { > + qemu_boot_set(current_machine->boot_once, &error_fatal); > + qemu_register_reset(restore_boot_order, g_strdup(current_machine->boot_order)); > + } > + > + /* > + * ok, initial machine setup is done, starting from now we can > + * only create hotpluggable devices > + */ > + qdev_hotplug = true; > + qdev_assert_realized_properly(); > + > + /* TODO: once all bus devices are qdevified, this should be done > + * when bus is created by qdev.c */ > + /* > + * TODO: If we had a main 'reset container' that the whole system > + * lived in, we could reset that using the multi-phase reset > + * APIs. For the moment, we just reset the sysbus, which will cause > + * all devices hanging off it (and all their child buses, recursively) > + * to be reset. Note that this will *not* reset any Device objects > + * which are not attached to some part of the qbus tree! > + */ > + qemu_register_reset(resettable_cold_reset_fn, sysbus_get_default()); > + > machine_init_done = true; > notifier_list_notify(&machine_init_done_notifiers, NULL); > + > + if (rom_check_and_register_reset() != 0) { > + error_report("rom check and register reset failed"); > + exit(1); > + } > + > + replay_start(); > + > + /* This checkpoint is required by replay to separate prior clock > + reading from the other reads, because timer polling functions query > + clock values from the log. */ > + replay_checkpoint(CHECKPOINT_RESET); > + qemu_system_reset(SHUTDOWN_CAUSE_NONE); > + register_global_state(); > } > > static const TypeInfo machine_info = { > diff --git a/hw/core/qdev.c b/hw/core/qdev.c > index 262bca716f..bc5df8ce69 100644 > --- a/hw/core/qdev.c > +++ b/hw/core/qdev.c > @@ -413,7 +413,7 @@ void qdev_unrealize(DeviceState *dev) > object_property_set_bool(OBJECT(dev), "realized", false, &error_abort); > } > > -static int qdev_assert_realized_properly(Object *obj, void *opaque) > +static int qdev_assert_realized_properly_cb(Object *obj, void *opaque) > { > DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE)); > DeviceClass *dc; > @@ -426,16 +426,10 @@ static int qdev_assert_realized_properly(Object *obj, void *opaque) > return 0; > } > > -void qdev_machine_creation_done(void) > +void qdev_assert_realized_properly(void) > { > - /* > - * ok, initial machine setup is done, starting from now we can > - * only create hotpluggable devices > - */ > - qdev_hotplug = true; > - > object_child_foreach_recursive(object_get_root(), > - qdev_assert_realized_properly, NULL); > + qdev_assert_realized_properly_cb, NULL); > } > > bool qdev_machine_modified(void) > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h > index b77a2f1da7..6446846752 100644 > --- a/include/hw/qdev-core.h > +++ b/include/hw/qdev-core.h > @@ -815,6 +815,7 @@ const VMStateDescription *qdev_get_vmsd(DeviceState *dev); > > const char *qdev_fw_name(DeviceState *dev); > > +void qdev_assert_realized_properly(void); > Object *qdev_get_machine(void); > > /* FIXME: make this a link<> */ > diff --git a/softmmu/vl.c b/softmmu/vl.c > index aeb988bcad..1fde4a17a9 100644 > --- a/softmmu/vl.c > +++ b/softmmu/vl.c > @@ -72,7 +72,6 @@ > #include "hw/i386/pc.h" > #include "migration/misc.h" > #include "migration/snapshot.h" > -#include "migration/global_state.h" > #include "sysemu/tpm.h" > #include "sysemu/dma.h" > #include "hw/audio/soundhw.h" > @@ -2426,8 +2425,6 @@ static void qemu_create_cli_devices(void) > > static void qemu_machine_creation_done(void) > { > - cpu_synchronize_all_post_init(); > - > /* Did we create any drives that we failed to create a device for? */ > drive_check_orphaned(); > > @@ -2445,43 +2442,11 @@ static void qemu_machine_creation_done(void) > > qdev_prop_check_globals(); > > - if (current_machine->boot_once) { > - qemu_boot_set(current_machine->boot_once, &error_fatal); > - qemu_register_reset(restore_boot_order, g_strdup(current_machine->boot_order)); > - } > - > - if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { > - exit(1); > - } > - > qdev_machine_creation_done(); > > - /* TODO: once all bus devices are qdevified, this should be done > - * when bus is created by qdev.c */ > - /* > - * TODO: If we had a main 'reset container' that the whole system > - * lived in, we could reset that using the multi-phase reset > - * APIs. For the moment, we just reset the sysbus, which will cause > - * all devices hanging off it (and all their child buses, recursively) > - * to be reset. Note that this will *not* reset any Device objects > - * which are not attached to some part of the qbus tree! > - */ > - qemu_register_reset(resettable_cold_reset_fn, sysbus_get_default()); > - qemu_run_machine_init_done_notifiers(); > - > - if (rom_check_and_register_reset() != 0) { > - error_report("rom check and register reset failed"); > + if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { > exit(1); > } > - > - replay_start(); > - > - /* This checkpoint is required by replay to separate prior clock > - reading from the other reads, because timer polling functions query > - clock values from the log. */ > - replay_checkpoint(CHECKPOINT_RESET); > - qemu_system_reset(SHUTDOWN_CAUSE_NONE); > - register_global_state(); > } > > void qmp_x_exit_preconfig(Error **errp)
diff --git a/hw/core/machine.c b/hw/core/machine.c index 5659b1f49c..025c4f9749 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -16,16 +16,21 @@ #include "sysemu/replay.h" #include "qemu/units.h" #include "hw/boards.h" +#include "hw/loader.h" #include "qapi/error.h" #include "qapi/qapi-visit-common.h" #include "qapi/visitor.h" #include "hw/sysbus.h" +#include "sysemu/cpus.h" #include "sysemu/sysemu.h" +#include "sysemu/reset.h" +#include "sysemu/runstate.h" #include "sysemu/numa.h" #include "qemu/error-report.h" #include "sysemu/qtest.h" #include "hw/pci/pci.h" #include "hw/mem/nvdimm.h" +#include "migration/global_state.h" #include "migration/vmstate.h" GlobalProperty hw_compat_5_1[] = { @@ -1186,10 +1191,50 @@ void qemu_remove_machine_init_done_notifier(Notifier *notify) notifier_remove(notify); } -void qemu_run_machine_init_done_notifiers(void) +void qdev_machine_creation_done(void) { + cpu_synchronize_all_post_init(); + + if (current_machine->boot_once) { + qemu_boot_set(current_machine->boot_once, &error_fatal); + qemu_register_reset(restore_boot_order, g_strdup(current_machine->boot_order)); + } + + /* + * ok, initial machine setup is done, starting from now we can + * only create hotpluggable devices + */ + qdev_hotplug = true; + qdev_assert_realized_properly(); + + /* TODO: once all bus devices are qdevified, this should be done + * when bus is created by qdev.c */ + /* + * TODO: If we had a main 'reset container' that the whole system + * lived in, we could reset that using the multi-phase reset + * APIs. For the moment, we just reset the sysbus, which will cause + * all devices hanging off it (and all their child buses, recursively) + * to be reset. Note that this will *not* reset any Device objects + * which are not attached to some part of the qbus tree! + */ + qemu_register_reset(resettable_cold_reset_fn, sysbus_get_default()); + machine_init_done = true; notifier_list_notify(&machine_init_done_notifiers, NULL); + + if (rom_check_and_register_reset() != 0) { + error_report("rom check and register reset failed"); + exit(1); + } + + replay_start(); + + /* This checkpoint is required by replay to separate prior clock + reading from the other reads, because timer polling functions query + clock values from the log. */ + replay_checkpoint(CHECKPOINT_RESET); + qemu_system_reset(SHUTDOWN_CAUSE_NONE); + register_global_state(); } static const TypeInfo machine_info = { diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 262bca716f..bc5df8ce69 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -413,7 +413,7 @@ void qdev_unrealize(DeviceState *dev) object_property_set_bool(OBJECT(dev), "realized", false, &error_abort); } -static int qdev_assert_realized_properly(Object *obj, void *opaque) +static int qdev_assert_realized_properly_cb(Object *obj, void *opaque) { DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE)); DeviceClass *dc; @@ -426,16 +426,10 @@ static int qdev_assert_realized_properly(Object *obj, void *opaque) return 0; } -void qdev_machine_creation_done(void) +void qdev_assert_realized_properly(void) { - /* - * ok, initial machine setup is done, starting from now we can - * only create hotpluggable devices - */ - qdev_hotplug = true; - object_child_foreach_recursive(object_get_root(), - qdev_assert_realized_properly, NULL); + qdev_assert_realized_properly_cb, NULL); } bool qdev_machine_modified(void) diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index b77a2f1da7..6446846752 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -815,6 +815,7 @@ const VMStateDescription *qdev_get_vmsd(DeviceState *dev); const char *qdev_fw_name(DeviceState *dev); +void qdev_assert_realized_properly(void); Object *qdev_get_machine(void); /* FIXME: make this a link<> */ diff --git a/softmmu/vl.c b/softmmu/vl.c index aeb988bcad..1fde4a17a9 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -72,7 +72,6 @@ #include "hw/i386/pc.h" #include "migration/misc.h" #include "migration/snapshot.h" -#include "migration/global_state.h" #include "sysemu/tpm.h" #include "sysemu/dma.h" #include "hw/audio/soundhw.h" @@ -2426,8 +2425,6 @@ static void qemu_create_cli_devices(void) static void qemu_machine_creation_done(void) { - cpu_synchronize_all_post_init(); - /* Did we create any drives that we failed to create a device for? */ drive_check_orphaned(); @@ -2445,43 +2442,11 @@ static void qemu_machine_creation_done(void) qdev_prop_check_globals(); - if (current_machine->boot_once) { - qemu_boot_set(current_machine->boot_once, &error_fatal); - qemu_register_reset(restore_boot_order, g_strdup(current_machine->boot_order)); - } - - if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { - exit(1); - } - qdev_machine_creation_done(); - /* TODO: once all bus devices are qdevified, this should be done - * when bus is created by qdev.c */ - /* - * TODO: If we had a main 'reset container' that the whole system - * lived in, we could reset that using the multi-phase reset - * APIs. For the moment, we just reset the sysbus, which will cause - * all devices hanging off it (and all their child buses, recursively) - * to be reset. Note that this will *not* reset any Device objects - * which are not attached to some part of the qbus tree! - */ - qemu_register_reset(resettable_cold_reset_fn, sysbus_get_default()); - qemu_run_machine_init_done_notifiers(); - - if (rom_check_and_register_reset() != 0) { - error_report("rom check and register reset failed"); + if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { exit(1); } - - replay_start(); - - /* This checkpoint is required by replay to separate prior clock - reading from the other reads, because timer polling functions query - clock values from the log. */ - replay_checkpoint(CHECKPOINT_RESET); - qemu_system_reset(SHUTDOWN_CAUSE_NONE); - register_global_state(); } void qmp_x_exit_preconfig(Error **errp)
qdev_machine_creation_done is only setting a flag now. Extend it to move more code out of vl.c. Leave only consistency checks and gdbserver processing in qemu_machine_creation_done. gdbserver_start can be moved after qdev_machine_creation_done because it only does listen on the socket and creates some internal data structures; it does not send any data (e.g. guest state) over the socket. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- hw/core/machine.c | 47 +++++++++++++++++++++++++++++++++++++++++- hw/core/qdev.c | 12 +++-------- include/hw/qdev-core.h | 1 + softmmu/vl.c | 37 +-------------------------------- 4 files changed, 51 insertions(+), 46 deletions(-)