Emit a trace event when qxl_post_load() drops a cursor or surface command whose guest address no longer resolves, so a migration that lands on a stale tracked pointer is visible instead of silent.
Signed-off-by: Andrey Drobyshev <[email protected]> --- hw/display/qxl.c | 17 +++++++++++------ hw/display/trace-events | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/hw/display/qxl.c b/hw/display/qxl.c index b9b19849738..9e7bc5c668f 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -2400,6 +2400,8 @@ static int qxl_post_load(void *opaque, int version) } if (!qxl_loadvm_cmd_valid(d, d->guest_surfaces.cmds[in], QXL_CMD_SURFACE)) { + trace_qxl_post_load_stale_cmd(d->id, "surface", + d->guest_surfaces.cmds[in]); continue; } cmds[out].cmd.data = d->guest_surfaces.cmds[in]; @@ -2407,12 +2409,15 @@ static int qxl_post_load(void *opaque, int version) cmds[out].group_id = MEMSLOT_GROUP_GUEST; out++; } - if (d->guest_cursor && - qxl_loadvm_cmd_valid(d, d->guest_cursor, QXL_CMD_CURSOR)) { - cmds[out].cmd.data = d->guest_cursor; - cmds[out].cmd.type = QXL_CMD_CURSOR; - cmds[out].group_id = MEMSLOT_GROUP_GUEST; - out++; + if (d->guest_cursor) { + if (qxl_loadvm_cmd_valid(d, d->guest_cursor, QXL_CMD_CURSOR)) { + cmds[out].cmd.data = d->guest_cursor; + cmds[out].cmd.type = QXL_CMD_CURSOR; + cmds[out].group_id = MEMSLOT_GROUP_GUEST; + out++; + } else { + trace_qxl_post_load_stale_cmd(d->id, "cursor", d->guest_cursor); + } } qxl_spice_loadvm_commands(d, cmds, out); g_free(cmds); diff --git a/hw/display/trace-events b/hw/display/trace-events index 4bfc457fbac..c5e7e42af23 100644 --- a/hw/display/trace-events +++ b/hw/display/trace-events @@ -82,6 +82,7 @@ qxl_io_unexpected_vga_mode(int qid, uint64_t addr, uint64_t val, const char *des qxl_io_write(int qid, const char *mode, uint64_t addr, const char *aname, uint64_t val, unsigned size, int async) "%d %s addr=%"PRIu64 " (%s) val=%"PRIu64" size=%u async=%d" qxl_memslot_add_guest(int qid, uint32_t slot_id, uint64_t guest_start, uint64_t guest_end) "%d %u: guest phys 0x%"PRIx64 " - 0x%" PRIx64 qxl_post_load(int qid, const char *mode) "%d %s" +qxl_post_load_stale_cmd(int qid, const char *kind, uint64_t data) "%d skip stale %s cmd 0x%"PRIx64 qxl_pre_load(int qid) "%d" qxl_pre_save(int qid) "%d" qxl_reset_surfaces(int qid) "%d" -- 2.47.1
