From: Marc-André Lureau <marcandre.lur...@redhat.com> QEMU used to run qemu_spice.display_init() before vm_start(), and QXL/display interfaces where started then. Now, vm_start() happens before QXL/display interfaces are added and Spice server doesn't automatically start them in this case (fixed in spice git)
Fixes Spice regression introduced after 5.2, with refactoring commits b4e1a34211 ("vl: remove separate preconfig main_loop") and facf7c60ee ("vl: initialize displays _after_ exiting preconfiguration"), probably others. Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- include/sysemu/runstate.h | 1 + include/ui/qemu-spice.h | 1 + softmmu/runstate.c | 5 +++++ ui/spice-core.c | 9 ++++++++- ui/spice-display.c | 2 ++ 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h index e557f470d4..40b3083008 100644 --- a/include/sysemu/runstate.h +++ b/include/sysemu/runstate.h @@ -6,6 +6,7 @@ bool runstate_check(RunState state); void runstate_set(RunState new_state); +RunState runstate_get(void); int runstate_is_running(void); bool runstate_needs_reset(void); bool runstate_store(char *str, size_t size); diff --git a/include/ui/qemu-spice.h b/include/ui/qemu-spice.h index 2beb792972..71ecd6cfd1 100644 --- a/include/ui/qemu-spice.h +++ b/include/ui/qemu-spice.h @@ -28,6 +28,7 @@ void qemu_spice_input_init(void); void qemu_spice_display_init(void); +void qemu_spice_display_init_done(void); bool qemu_spice_have_display_interface(QemuConsole *con); int qemu_spice_add_display_interface(QXLInstance *qxlin, QemuConsole *con); int qemu_spice_migrate_info(const char *hostname, int port, int tls_port, diff --git a/softmmu/runstate.c b/softmmu/runstate.c index beee050815..92ef7444d0 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -195,6 +195,11 @@ static void runstate_init(void) qemu_mutex_init(&vmstop_lock); } +RunState runstate_get(void) +{ + return current_run_state; +} + /* This function will abort() on invalid state transitions */ void runstate_set(RunState new_state) { diff --git a/ui/spice-core.c b/ui/spice-core.c index 5746d0aae7..b621dd86b6 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -46,6 +46,7 @@ static const char *auth = "spice"; static char *auth_passwd; static time_t auth_expires = TIME_MAX; static int spice_migration_completed; +static int spice_display_init_done; static int spice_display_is_running; static int spice_have_target_host; @@ -625,13 +626,19 @@ static int add_channel(void *opaque, const char *name, const char *value, static void vm_change_state_handler(void *opaque, int running, RunState state) { - if (running) { + if (running && spice_display_init_done) { qemu_spice_display_start(); } else if (state != RUN_STATE_PAUSED) { qemu_spice_display_stop(); } } +void qemu_spice_display_init_done(void) +{ + spice_display_init_done = true; + vm_change_state_handler(NULL, runstate_is_running(), runstate_get()); +} + static void qemu_spice_init(void) { QemuOpts *opts = QTAILQ_FIRST(&qemu_spice_opts.head); diff --git a/ui/spice-display.c b/ui/spice-display.c index 0178d5766d..3d3e3bcb22 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -1188,4 +1188,6 @@ void qemu_spice_display_init(void) } qemu_spice_display_init_one(con); } + + qemu_spice_display_init_done(); } -- 2.29.0