aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2020-10-27 08:44:23 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2020-12-15 12:51:49 -0500
commitb4e1a342112e50e05b609e857f38c1f2b7aafdc4 (patch)
tree19d4dd54d72b3a832be7587ec1f398d33f342ae2
parent164dafd1744c69d268b89015977e19d8a9617fdf (diff)
vl: remove separate preconfig main_loop
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. Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--include/sysemu/runstate.h1
-rw-r--r--monitor/qmp-cmds.c9
-rw-r--r--softmmu/vl.c95
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 639a219294..d141aaa132 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..abbbb83e1a 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, &local_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, &local_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, &local_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 (strcmp(incoming, "defer") != 0) {
- qmp_migrate_incoming(incoming, &local_err);
- if (local_err) {
- error_reportf_err(local_err, "-incoming %s: ", incoming);
- exit(1);
- }
- }
- } else if (autostart) {
- qmp_cont(NULL);
- }
+ qemu_init_displays();
+ if (!preconfig_requested) {
+ qmp_x_exit_preconfig(&error_fatal);
+ }
accel_setup_post(current_machine);
os_setup_post();
-
- return;
}
void qemu_cleanup(void)