aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2022-09-12 14:24:55 +0400
committerGerd Hoffmann <kraxel@redhat.com>2022-09-23 14:38:27 +0200
commitd18431547f388db1e43c0cbc8a423ea9cc0df3d6 (patch)
tree41f1b438abab08987a457be697b251e45665bdb5
parent72ce36f77ca6fe8cf9aae5ed28d7c3c865ef887d (diff)
downloadqemu-d18431547f388db1e43c0cbc8a423ea9cc0df3d6.zip
qemu-d18431547f388db1e43c0cbc8a423ea9cc0df3d6.tar.gz
qemu-d18431547f388db1e43c0cbc8a423ea9cc0df3d6.tar.bz2
ui/vdagent: fix serial reset of guest agent
In order to reset the guest agent, we send CLOSED & OPENED events. They are correctly received by the guest kernel. However, they might not be noticed by the guest agent process, as the IO task (poll() for example) might be wake up after both CLOSED & OPENED have been processed. Wait until the guest agent is disconnected to re-open our side. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20220912102455.111765-6-marcandre.lureau@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--ui/vdagent.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/ui/vdagent.c b/ui/vdagent.c
index 819e0dc..4bf50f0 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -471,7 +471,7 @@ static void vdagent_clipboard_reset_serial(VDAgentChardev *vd)
/* reopen the agent connection to reset the serial state */
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
- qemu_chr_be_event(chr, CHR_EVENT_OPENED);
+ /* OPENED again after the guest disconnected, see set_fe_open */
}
static void vdagent_clipboard_notify(Notifier *notifier, void *data)
@@ -875,6 +875,9 @@ static void vdagent_chr_set_fe_open(struct Chardev *chr, int fe_open)
{
if (!fe_open) {
trace_vdagent_close();
+ /* To reset_serial, we CLOSED our side. Make sure the other end knows we
+ * are ready again. */
+ qemu_chr_be_event(chr, CHR_EVENT_OPENED);
return;
}