Re: [PATCH 02/15] vl: remove separate preconfig main_loop

2020-12-07 Thread Igor Mammedov
On Wed,  2 Dec 2020 03:18:41 -0500
Paolo Bonzini  wrote:

> Move post-preconfig initialization to the x-exit-preconfig.  If preconfig
> is not requested, just exit preconfig mode immediately with the QMP
> command.
> 
> As a result, the preconfig loop will run with accel_setup_post
> and os_setup_post restrictions (xen_restrict, chroot, etc.)
> already done.
> 
> Signed-off-by: Paolo Bonzini 

Reviewed-by: Igor Mammedov 

> ---
>  include/sysemu/runstate.h |  1 -
>  monitor/qmp-cmds.c|  9 
>  softmmu/vl.c  | 95 +--
>  3 files changed, 41 insertions(+), 64 deletions(-)
> 
> diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h
> index f760094858..e557f470d4 100644
> --- a/include/sysemu/runstate.h
> +++ b/include/sysemu/runstate.h
> @@ -41,7 +41,6 @@ typedef enum WakeupReason {
>  QEMU_WAKEUP_REASON_OTHER,
>  } WakeupReason;
>  
> -void qemu_exit_preconfig_request(void);
>  void qemu_system_reset_request(ShutdownCause reason);
>  void qemu_system_suspend_request(void);
>  void qemu_register_suspend_notifier(Notifier *notifier);
> diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
> index 501a3024c7..7ced7eb3e8 100644
> --- a/monitor/qmp-cmds.c
> +++ b/monitor/qmp-cmds.c
> @@ -102,15 +102,6 @@ void qmp_system_powerdown(Error **errp)
>  qemu_system_powerdown_request();
>  }
>  
> -void qmp_x_exit_preconfig(Error **errp)
> -{
> -if (qdev_hotplug) {
> -error_setg(errp, "The command is permitted only before machine 
> initialization");
> -return;
> -}
> -qemu_exit_preconfig_request();
> -}
> -
>  void qmp_cont(Error **errp)
>  {
>  BlockBackend *blk;
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index ab2210bc79..a83e1a 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -1151,7 +1151,6 @@ static pid_t shutdown_pid;
>  static int powerdown_requested;
>  static int debug_requested;
>  static int suspend_requested;
> -static bool preconfig_exit_requested = true;
>  static WakeupReason wakeup_reason;
>  static NotifierList powerdown_notifiers =
>  NOTIFIER_LIST_INITIALIZER(powerdown_notifiers);
> @@ -1238,11 +1237,6 @@ static int qemu_debug_requested(void)
>  return r;
>  }
>  
> -void qemu_exit_preconfig_request(void)
> -{
> -preconfig_exit_requested = true;
> -}
> -
>  /*
>   * Reset the VM. Issue an event unless @reason is SHUTDOWN_CAUSE_NONE.
>   */
> @@ -1464,10 +1458,6 @@ static bool main_loop_should_exit(void)
>  RunState r;
>  ShutdownCause request;
>  
> -if (preconfig_exit_requested) {
> -preconfig_exit_requested = false;
> -return true;
> -}
>  if (qemu_debug_requested()) {
>  vm_stop(RUN_STATE_DEBUG);
>  }
> @@ -3283,6 +3273,43 @@ static void qemu_machine_creation_done(void)
>  register_global_state();
>  }
>  
> +void qmp_x_exit_preconfig(Error **errp)
> +{
> +if (qdev_hotplug) {
> +error_setg(errp, "The command is permitted only before machine 
> initialization");
> +return;
> +}
> +
> +qemu_init_board();
> +qemu_create_cli_devices();
> +qemu_machine_creation_done();
> +
> +if (loadvm) {
> +Error *local_err = NULL;
> +if (load_snapshot(loadvm, _err) < 0) {
> +error_report_err(local_err);
> +autostart = 0;
> +exit(1);
> +}
> +}
> +if (replay_mode != REPLAY_MODE_NONE) {
> +replay_vmstate_init();
> +}
> +
> +if (incoming) {
> +Error *local_err = NULL;
> +if (strcmp(incoming, "defer") != 0) {
> +qmp_migrate_incoming(incoming, _err);
> +if (local_err) {
> +error_reportf_err(local_err, "-incoming %s: ", incoming);
> +exit(1);
> +}
> +}
> +} else if (autostart) {
> +qmp_cont(NULL);
> +}
> +}
> +
>  void qemu_init(int argc, char **argv, char **envp)
>  {
>  QemuOpts *opts;
> @@ -3847,7 +3874,6 @@ void qemu_init(int argc, char **argv, char **envp)
>  }
>  break;
>  case QEMU_OPTION_preconfig:
> -preconfig_exit_requested = false;
>  preconfig_requested = true;
>  break;
>  case QEMU_OPTION_enable_kvm:
> @@ -4272,57 +4298,18 @@ void qemu_init(int argc, char **argv, char **envp)
>  qemu_resolve_machine_memdev();
>  parse_numa_opts(current_machine);
>  
> -if (preconfig_requested) {
> -qemu_init_displays();
> -}
> -
> -/* do monitor/qmp handling at preconfig state if requested */
> -qemu_main_loop();
> -
> -qemu_init_board();
> -
> -qemu_create_cli_devices();
> -
> -/* initialize displays after all errors have been reported */
> -if (!preconfig_requested) {
> -qemu_init_displays();
> -}
> -qemu_machine_creation_done();
> -
> -if (loadvm) {
> -Error *local_err = NULL;
> -if (load_snapshot(loadvm, _err) < 0) {
> -  

[PATCH 02/15] vl: remove separate preconfig main_loop

2020-12-02 Thread Paolo Bonzini
Move post-preconfig initialization to the x-exit-preconfig.  If preconfig
is not requested, just exit preconfig mode immediately with the QMP
command.

As a result, the preconfig loop will run with accel_setup_post
and os_setup_post restrictions (xen_restrict, chroot, etc.)
already done.

Signed-off-by: Paolo Bonzini 
---
 include/sysemu/runstate.h |  1 -
 monitor/qmp-cmds.c|  9 
 softmmu/vl.c  | 95 +--
 3 files changed, 41 insertions(+), 64 deletions(-)

diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h
index f760094858..e557f470d4 100644
--- a/include/sysemu/runstate.h
+++ b/include/sysemu/runstate.h
@@ -41,7 +41,6 @@ typedef enum WakeupReason {
 QEMU_WAKEUP_REASON_OTHER,
 } WakeupReason;
 
-void qemu_exit_preconfig_request(void);
 void qemu_system_reset_request(ShutdownCause reason);
 void qemu_system_suspend_request(void);
 void qemu_register_suspend_notifier(Notifier *notifier);
diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
index 501a3024c7..7ced7eb3e8 100644
--- a/monitor/qmp-cmds.c
+++ b/monitor/qmp-cmds.c
@@ -102,15 +102,6 @@ void qmp_system_powerdown(Error **errp)
 qemu_system_powerdown_request();
 }
 
-void qmp_x_exit_preconfig(Error **errp)
-{
-if (qdev_hotplug) {
-error_setg(errp, "The command is permitted only before machine 
initialization");
-return;
-}
-qemu_exit_preconfig_request();
-}
-
 void qmp_cont(Error **errp)
 {
 BlockBackend *blk;
diff --git a/softmmu/vl.c b/softmmu/vl.c
index ab2210bc79..a83e1a 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -1151,7 +1151,6 @@ static pid_t shutdown_pid;
 static int powerdown_requested;
 static int debug_requested;
 static int suspend_requested;
-static bool preconfig_exit_requested = true;
 static WakeupReason wakeup_reason;
 static NotifierList powerdown_notifiers =
 NOTIFIER_LIST_INITIALIZER(powerdown_notifiers);
@@ -1238,11 +1237,6 @@ static int qemu_debug_requested(void)
 return r;
 }
 
-void qemu_exit_preconfig_request(void)
-{
-preconfig_exit_requested = true;
-}
-
 /*
  * Reset the VM. Issue an event unless @reason is SHUTDOWN_CAUSE_NONE.
  */
@@ -1464,10 +1458,6 @@ static bool main_loop_should_exit(void)
 RunState r;
 ShutdownCause request;
 
-if (preconfig_exit_requested) {
-preconfig_exit_requested = false;
-return true;
-}
 if (qemu_debug_requested()) {
 vm_stop(RUN_STATE_DEBUG);
 }
@@ -3283,6 +3273,43 @@ static void qemu_machine_creation_done(void)
 register_global_state();
 }
 
+void qmp_x_exit_preconfig(Error **errp)
+{
+if (qdev_hotplug) {
+error_setg(errp, "The command is permitted only before machine 
initialization");
+return;
+}
+
+qemu_init_board();
+qemu_create_cli_devices();
+qemu_machine_creation_done();
+
+if (loadvm) {
+Error *local_err = NULL;
+if (load_snapshot(loadvm, _err) < 0) {
+error_report_err(local_err);
+autostart = 0;
+exit(1);
+}
+}
+if (replay_mode != REPLAY_MODE_NONE) {
+replay_vmstate_init();
+}
+
+if (incoming) {
+Error *local_err = NULL;
+if (strcmp(incoming, "defer") != 0) {
+qmp_migrate_incoming(incoming, _err);
+if (local_err) {
+error_reportf_err(local_err, "-incoming %s: ", incoming);
+exit(1);
+}
+}
+} else if (autostart) {
+qmp_cont(NULL);
+}
+}
+
 void qemu_init(int argc, char **argv, char **envp)
 {
 QemuOpts *opts;
@@ -3847,7 +3874,6 @@ void qemu_init(int argc, char **argv, char **envp)
 }
 break;
 case QEMU_OPTION_preconfig:
-preconfig_exit_requested = false;
 preconfig_requested = true;
 break;
 case QEMU_OPTION_enable_kvm:
@@ -4272,57 +4298,18 @@ void qemu_init(int argc, char **argv, char **envp)
 qemu_resolve_machine_memdev();
 parse_numa_opts(current_machine);
 
-if (preconfig_requested) {
-qemu_init_displays();
-}
-
-/* do monitor/qmp handling at preconfig state if requested */
-qemu_main_loop();
-
-qemu_init_board();
-
-qemu_create_cli_devices();
-
-/* initialize displays after all errors have been reported */
-if (!preconfig_requested) {
-qemu_init_displays();
-}
-qemu_machine_creation_done();
-
-if (loadvm) {
-Error *local_err = NULL;
-if (load_snapshot(loadvm, _err) < 0) {
-error_report_err(local_err);
-autostart = 0;
-exit(1);
-}
-}
-if (replay_mode != REPLAY_MODE_NONE) {
-replay_vmstate_init();
-}
-
 if (vmstate_dump_file) {
 /* dump and exit */
 dump_vmstate_json_to_file(vmstate_dump_file);
 exit(0);
 }
-if (incoming) {
-Error *local_err = NULL;
-if