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) {
> -