diff mbox series

[08/29] vl: move prelaunch part of qemu_init to new functions

Message ID 20201027182144.3315885-9-pbonzini@redhat.com
State Accepted
Commit d8e4de41c95f701f79869080b23362f1325c8897
Headers show
Series cleanup qemu_init and make sense of command line processing | expand

Commit Message

Paolo Bonzini Oct. 27, 2020, 6:21 p.m. UTC
The final part of qemu_init, starting with the completion of
board init, is already relatively clean.  Split it out of
qemu_init so that qemu_init keeps only the messy parts.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 softmmu/vl.c | 250 +++++++++++++++++++++++++++------------------------
 1 file changed, 135 insertions(+), 115 deletions(-)

Comments

Igor Mammedov Nov. 11, 2020, 7:29 p.m. UTC | #1
On Tue, 27 Oct 2020 14:21:23 -0400
Paolo Bonzini <pbonzini@redhat.com> wrote:

> The final part of qemu_init, starting with the completion of

> board init, is already relatively clean.  Split it out of

> qemu_init so that qemu_init keeps only the messy parts.

> 

> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>


Reviewed-by: Igor Mammedov <imammedo@redhat.com>


> ---

>  softmmu/vl.c | 250 +++++++++++++++++++++++++++------------------------

>  1 file changed, 135 insertions(+), 115 deletions(-)

> 

> diff --git a/softmmu/vl.c b/softmmu/vl.c

> index a086cd7066..f9bae50c27 100644

> --- a/softmmu/vl.c

> +++ b/softmmu/vl.c

> @@ -120,6 +120,9 @@

>  static const char *cpu_option;

>  static const char *data_dir[16];

>  static int data_dir_idx;

> +static const char *mem_path;

> +static const char *boot_order;

> +static const char *boot_once;

>  enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;

>  int display_opengl;

>  const char* keyboard_layout = NULL;

> @@ -3000,6 +3003,135 @@ static void qemu_init_subsystems(void)

>      socket_init();

>  }

>  

> +/*

> + * Called after leaving preconfig state.  From here on runstate is

> + * RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE.

> + */

> +static void qemu_finish_machine_init(void)

> +{

> +    MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);

> +

> +    if (machine_class->default_ram_id && current_machine->ram_size &&

> +        numa_uses_legacy_mem() && !current_machine->ram_memdev_id) {

> +        create_default_memdev(current_machine, mem_path);

> +    }

> +

> +    /* from here on runstate is RUN_STATE_PRELAUNCH */

> +    machine_run_board_init(current_machine);

> +

> +    /*

> +     * TODO To drop support for deprecated bogus if=..., move

> +     * drive_check_orphaned() here, replacing this call.  Also drop

> +     * its deprecation warning, along with DriveInfo member

> +     * @claimed_by_board.

> +     */

> +    drive_mark_claimed_by_board();

> +

> +    realtime_init();

> +

> +    if (hax_enabled()) {

> +        /* FIXME: why isn't cpu_synchronize_all_post_init enough? */

> +        hax_sync_vcpus();

> +    }

> +}

> +

> +static void qemu_create_cli_devices(void)

> +{

> +    soundhw_init();

> +

> +    qemu_opts_foreach(qemu_find_opts("fw_cfg"),

> +                      parse_fw_cfg, fw_cfg_find(), &error_fatal);

> +

> +    /* init USB devices */

> +    if (machine_usb(current_machine)) {

> +        if (foreach_device_config(DEV_USB, usb_parse) < 0)

> +            exit(1);

> +    }

> +

> +    /* init generic devices */

> +    rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);

> +    qemu_opts_foreach(qemu_find_opts("device"),

> +                      device_init_func, NULL, &error_fatal);

> +    rom_reset_order_override();

> +}

> +

> +static void qemu_machine_creation_done(void)

> +{

> +    DisplayState *ds;

> +

> +    cpu_synchronize_all_post_init();

> +

> +    /* Did we create any drives that we failed to create a device for? */

> +    drive_check_orphaned();

> +

> +    /* Don't warn about the default network setup that you get if

> +     * no command line -net or -netdev options are specified. There

> +     * are two cases that we would otherwise complain about:

> +     * (1) board doesn't support a NIC but the implicit "-net nic"

> +     * requested one

> +     * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic"

> +     * sets up a nic that isn't connected to anything.

> +     */

> +    if (!default_net && (!qtest_enabled() || has_defaults)) {

> +        net_check_clients();

> +    }

> +

> +    if (boot_once) {

> +        qemu_boot_set(boot_once, &error_fatal);

> +        qemu_register_reset(restore_boot_order, g_strdup(boot_order));

> +    }

> +

> +    /* init local displays */

> +    ds = init_displaystate();

> +    qemu_display_init(ds, &dpy);

> +

> +    /* must be after terminal init, SDL library changes signal handlers */

> +    os_setup_signal_handling();

> +

> +    /* init remote displays */

> +#ifdef CONFIG_VNC

> +    qemu_opts_foreach(qemu_find_opts("vnc"),

> +                      vnc_init_func, NULL, &error_fatal);

> +#endif

> +

> +    if (using_spice) {

> +        qemu_spice.display_init();

> +    }

> +

> +    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");

> +        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 qemu_init(int argc, char **argv, char **envp)

>  {

>      int i;

> @@ -3007,9 +3139,6 @@ void qemu_init(int argc, char **argv, char **envp)

>      int linux_boot;

>      const char *initrd_filename;

>      const char *kernel_filename, *kernel_cmdline;

> -    const char *boot_order = NULL;

> -    const char *boot_once = NULL;

> -    DisplayState *ds;

>      QemuOpts *opts, *machine_opts;

>      QemuOpts *icount_opts = NULL, *accel_opts = NULL;

>      QemuOptsList *olist;

> @@ -3026,7 +3155,6 @@ void qemu_init(int argc, char **argv, char **envp)

>      uint64_t ram_slots = 0;

>      FILE *vmstate_dump_file = NULL;

>      Error *err = NULL;

> -    const char *mem_path = NULL;

>      bool have_custom_ram_size;

>      BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);

>      QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);

> @@ -4346,117 +4474,10 @@ void qemu_init(int argc, char **argv, char **envp)

>      /* do monitor/qmp handling at preconfig state if requested */

>      qemu_main_loop();

>  

> -    if (machine_class->default_ram_id && current_machine->ram_size &&

> -        numa_uses_legacy_mem() && !current_machine->ram_memdev_id) {

> -        create_default_memdev(current_machine, mem_path);

> -    }

> -

> -    /* from here on runstate is RUN_STATE_PRELAUNCH */

> -    machine_run_board_init(current_machine);

> -

> -    /*

> -     * TODO To drop support for deprecated bogus if=..., move

> -     * drive_check_orphaned() here, replacing this call.  Also drop

> -     * its deprecation warning, along with DriveInfo member

> -     * @claimed_by_board.

> -     */

> -    drive_mark_claimed_by_board();

> -

> -    realtime_init();

> +    qemu_finish_machine_init();

> +    qemu_create_cli_devices();

> +    qemu_machine_creation_done();

>  

> -    soundhw_init();

> -

> -    if (hax_enabled()) {

> -        hax_sync_vcpus();

> -    }

> -

> -    qemu_opts_foreach(qemu_find_opts("fw_cfg"),

> -                      parse_fw_cfg, fw_cfg_find(), &error_fatal);

> -

> -    /* init USB devices */

> -    if (machine_usb(current_machine)) {

> -        if (foreach_device_config(DEV_USB, usb_parse) < 0)

> -            exit(1);

> -    }

> -

> -    /* init generic devices */

> -    rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);

> -    qemu_opts_foreach(qemu_find_opts("device"),

> -                      device_init_func, NULL, &error_fatal);

> -

> -    cpu_synchronize_all_post_init();

> -

> -    rom_reset_order_override();

> -

> -    /* Did we create any drives that we failed to create a device for? */

> -    drive_check_orphaned();

> -

> -    /* Don't warn about the default network setup that you get if

> -     * no command line -net or -netdev options are specified. There

> -     * are two cases that we would otherwise complain about:

> -     * (1) board doesn't support a NIC but the implicit "-net nic"

> -     * requested one

> -     * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic"

> -     * sets up a nic that isn't connected to anything.

> -     */

> -    if (!default_net && (!qtest_enabled() || has_defaults)) {

> -        net_check_clients();

> -    }

> -

> -    if (boot_once) {

> -        qemu_boot_set(boot_once, &error_fatal);

> -        qemu_register_reset(restore_boot_order, g_strdup(boot_order));

> -    }

> -

> -    /* init local displays */

> -    ds = init_displaystate();

> -    qemu_display_init(ds, &dpy);

> -

> -    /* must be after terminal init, SDL library changes signal handlers */

> -    os_setup_signal_handling();

> -

> -    /* init remote displays */

> -#ifdef CONFIG_VNC

> -    qemu_opts_foreach(qemu_find_opts("vnc"),

> -                      vnc_init_func, NULL, &error_fatal);

> -#endif

> -

> -    if (using_spice) {

> -        qemu_spice.display_init();

> -    }

> -

> -    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");

> -        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();

>      if (loadvm) {

>          Error *local_err = NULL;

>          if (load_snapshot(loadvm, &local_err) < 0) {

> @@ -4475,7 +4496,6 @@ void qemu_init(int argc, char **argv, char **envp)

>          dump_vmstate_json_to_file(vmstate_dump_file);

>          exit(0);

>      }

> -

>      if (incoming) {

>          Error *local_err = NULL;

>          qemu_start_incoming_migration(incoming, &local_err);
diff mbox series

Patch

diff --git a/softmmu/vl.c b/softmmu/vl.c
index a086cd7066..f9bae50c27 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -120,6 +120,9 @@ 
 static const char *cpu_option;
 static const char *data_dir[16];
 static int data_dir_idx;
+static const char *mem_path;
+static const char *boot_order;
+static const char *boot_once;
 enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
 int display_opengl;
 const char* keyboard_layout = NULL;
@@ -3000,6 +3003,135 @@  static void qemu_init_subsystems(void)
     socket_init();
 }
 
+/*
+ * Called after leaving preconfig state.  From here on runstate is
+ * RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE.
+ */
+static void qemu_finish_machine_init(void)
+{
+    MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
+
+    if (machine_class->default_ram_id && current_machine->ram_size &&
+        numa_uses_legacy_mem() && !current_machine->ram_memdev_id) {
+        create_default_memdev(current_machine, mem_path);
+    }
+
+    /* from here on runstate is RUN_STATE_PRELAUNCH */
+    machine_run_board_init(current_machine);
+
+    /*
+     * TODO To drop support for deprecated bogus if=..., move
+     * drive_check_orphaned() here, replacing this call.  Also drop
+     * its deprecation warning, along with DriveInfo member
+     * @claimed_by_board.
+     */
+    drive_mark_claimed_by_board();
+
+    realtime_init();
+
+    if (hax_enabled()) {
+        /* FIXME: why isn't cpu_synchronize_all_post_init enough? */
+        hax_sync_vcpus();
+    }
+}
+
+static void qemu_create_cli_devices(void)
+{
+    soundhw_init();
+
+    qemu_opts_foreach(qemu_find_opts("fw_cfg"),
+                      parse_fw_cfg, fw_cfg_find(), &error_fatal);
+
+    /* init USB devices */
+    if (machine_usb(current_machine)) {
+        if (foreach_device_config(DEV_USB, usb_parse) < 0)
+            exit(1);
+    }
+
+    /* init generic devices */
+    rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
+    qemu_opts_foreach(qemu_find_opts("device"),
+                      device_init_func, NULL, &error_fatal);
+    rom_reset_order_override();
+}
+
+static void qemu_machine_creation_done(void)
+{
+    DisplayState *ds;
+
+    cpu_synchronize_all_post_init();
+
+    /* Did we create any drives that we failed to create a device for? */
+    drive_check_orphaned();
+
+    /* Don't warn about the default network setup that you get if
+     * no command line -net or -netdev options are specified. There
+     * are two cases that we would otherwise complain about:
+     * (1) board doesn't support a NIC but the implicit "-net nic"
+     * requested one
+     * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic"
+     * sets up a nic that isn't connected to anything.
+     */
+    if (!default_net && (!qtest_enabled() || has_defaults)) {
+        net_check_clients();
+    }
+
+    if (boot_once) {
+        qemu_boot_set(boot_once, &error_fatal);
+        qemu_register_reset(restore_boot_order, g_strdup(boot_order));
+    }
+
+    /* init local displays */
+    ds = init_displaystate();
+    qemu_display_init(ds, &dpy);
+
+    /* must be after terminal init, SDL library changes signal handlers */
+    os_setup_signal_handling();
+
+    /* init remote displays */
+#ifdef CONFIG_VNC
+    qemu_opts_foreach(qemu_find_opts("vnc"),
+                      vnc_init_func, NULL, &error_fatal);
+#endif
+
+    if (using_spice) {
+        qemu_spice.display_init();
+    }
+
+    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");
+        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 qemu_init(int argc, char **argv, char **envp)
 {
     int i;
@@ -3007,9 +3139,6 @@  void qemu_init(int argc, char **argv, char **envp)
     int linux_boot;
     const char *initrd_filename;
     const char *kernel_filename, *kernel_cmdline;
-    const char *boot_order = NULL;
-    const char *boot_once = NULL;
-    DisplayState *ds;
     QemuOpts *opts, *machine_opts;
     QemuOpts *icount_opts = NULL, *accel_opts = NULL;
     QemuOptsList *olist;
@@ -3026,7 +3155,6 @@  void qemu_init(int argc, char **argv, char **envp)
     uint64_t ram_slots = 0;
     FILE *vmstate_dump_file = NULL;
     Error *err = NULL;
-    const char *mem_path = NULL;
     bool have_custom_ram_size;
     BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
     QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
@@ -4346,117 +4474,10 @@  void qemu_init(int argc, char **argv, char **envp)
     /* do monitor/qmp handling at preconfig state if requested */
     qemu_main_loop();
 
-    if (machine_class->default_ram_id && current_machine->ram_size &&
-        numa_uses_legacy_mem() && !current_machine->ram_memdev_id) {
-        create_default_memdev(current_machine, mem_path);
-    }
-
-    /* from here on runstate is RUN_STATE_PRELAUNCH */
-    machine_run_board_init(current_machine);
-
-    /*
-     * TODO To drop support for deprecated bogus if=..., move
-     * drive_check_orphaned() here, replacing this call.  Also drop
-     * its deprecation warning, along with DriveInfo member
-     * @claimed_by_board.
-     */
-    drive_mark_claimed_by_board();
-
-    realtime_init();
+    qemu_finish_machine_init();
+    qemu_create_cli_devices();
+    qemu_machine_creation_done();
 
-    soundhw_init();
-
-    if (hax_enabled()) {
-        hax_sync_vcpus();
-    }
-
-    qemu_opts_foreach(qemu_find_opts("fw_cfg"),
-                      parse_fw_cfg, fw_cfg_find(), &error_fatal);
-
-    /* init USB devices */
-    if (machine_usb(current_machine)) {
-        if (foreach_device_config(DEV_USB, usb_parse) < 0)
-            exit(1);
-    }
-
-    /* init generic devices */
-    rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
-    qemu_opts_foreach(qemu_find_opts("device"),
-                      device_init_func, NULL, &error_fatal);
-
-    cpu_synchronize_all_post_init();
-
-    rom_reset_order_override();
-
-    /* Did we create any drives that we failed to create a device for? */
-    drive_check_orphaned();
-
-    /* Don't warn about the default network setup that you get if
-     * no command line -net or -netdev options are specified. There
-     * are two cases that we would otherwise complain about:
-     * (1) board doesn't support a NIC but the implicit "-net nic"
-     * requested one
-     * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic"
-     * sets up a nic that isn't connected to anything.
-     */
-    if (!default_net && (!qtest_enabled() || has_defaults)) {
-        net_check_clients();
-    }
-
-    if (boot_once) {
-        qemu_boot_set(boot_once, &error_fatal);
-        qemu_register_reset(restore_boot_order, g_strdup(boot_order));
-    }
-
-    /* init local displays */
-    ds = init_displaystate();
-    qemu_display_init(ds, &dpy);
-
-    /* must be after terminal init, SDL library changes signal handlers */
-    os_setup_signal_handling();
-
-    /* init remote displays */
-#ifdef CONFIG_VNC
-    qemu_opts_foreach(qemu_find_opts("vnc"),
-                      vnc_init_func, NULL, &error_fatal);
-#endif
-
-    if (using_spice) {
-        qemu_spice.display_init();
-    }
-
-    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");
-        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();
     if (loadvm) {
         Error *local_err = NULL;
         if (load_snapshot(loadvm, &local_err) < 0) {
@@ -4475,7 +4496,6 @@  void qemu_init(int argc, char **argv, char **envp)
         dump_vmstate_json_to_file(vmstate_dump_file);
         exit(0);
     }
-
     if (incoming) {
         Error *local_err = NULL;
         qemu_start_incoming_migration(incoming, &local_err);