qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH for-10.1 00/10] Support vdagent migration
@ 2025-03-11 15:59 marcandre.lureau
  2025-03-11 15:59 ` [PATCH for-10.1 01/10] ui/gtk: warn if setting the clipboard failed marcandre.lureau
                   ` (10 more replies)
  0 siblings, 11 replies; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>


iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmfQXbMcHG1hcmNhbmRy
ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5bmLD/49TJdk8vSnG/G53f3Z
UdUGdDiv98lAr/1wPZvmLPGfxiVLrVQK9Rarjnq9+dzmjoJC+w8THyPIvlvlKAQO
aNSe5LV2lcYFLZwJqXQdGHTEWWZX3BmXroSFY06F9znX4lrNSg/cxLaI+Lt+dbEt
BA9IIMzGYB+zhkgJh86Yji1Ioz29qwMgb4etf4OtP3PqT7/djWxxdlYLmyqN7D13
seHAkvhaA7sqglLcfUv0MjrNA1Yxg3QQmbmiErpyaHo9kQ2AuV49THZl5/Pe3WR5
FJAeO83G8hdxdqFuDvnXB0ID2klqWYkZTJsTD75F1hU1yqszkVt8k4mUWubTIDNm
VEFKGz/S+xR2rO0RGgGzMPzEm0FSPbLq1+U2ETRf3xBns0Jbqe6njHeLGAzmOx9p
3F8fkM4mzIrs3oOU/e7dlxOl9N6uQhVfJW6G+9QMLPLveIpNR6CGphbgHuMK8PPL
vZ1WNrGa/xoHvqQi2FvIJJrnKYYBJDXQW1edM+apDgO9jBSmiO5XlKZjeNHwgZ6J
0sNmJUKCmk2SPGtFHdpdRfjfYfN2eR07eTVnVgstpHCUZi0nRz+4A6yq4k0SQLQH
ZWsaq6cdZyfNOOdSHaLfI/2/36eiLpVCAuwn+AjK+XvPR6mQc9rwebV8N5nXLEZ8
OFcig1i00RhHBRJFPrOjWIFIQg==
=iTg5
-----END PGP SIGNATURE-----

Marc-André Lureau (10):
  ui/gtk: warn if setting the clipboard failed
  ui/clipboard: use int for selection field
  ui/clipboard: split out QemuClipboardContent
  ui/clipboard: add vmstate_cbinfo
  ui/clipboard: delay clipboard update when not running
  ui/vdagent: replace Buffer with GByteArray
  ui/vdagent: keep "connected" state
  ui/vdagent: factor out clipboard peer registration
  ui/vdagent: add migration support
  ui/vdagent: remove migration blocker

 include/ui/clipboard.h |  31 +++++--
 ui/clipboard.c         |  66 +++++++++++++-
 ui/gtk-clipboard.c     |  13 ++-
 ui/vdagent.c           | 202 +++++++++++++++++++++++++++++++++++------
 4 files changed, 268 insertions(+), 44 deletions(-)

-- 
2.47.0



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 01/10] ui/gtk: warn if setting the clipboard failed
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:24   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 02/10] ui/clipboard: use int for selection field marcandre.lureau
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Just in case.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/gtk-clipboard.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/ui/gtk-clipboard.c b/ui/gtk-clipboard.c
index 8d8a636fd1..65d89ec601 100644
--- a/ui/gtk-clipboard.c
+++ b/ui/gtk-clipboard.c
@@ -19,6 +19,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 
 #include "ui/gtk.h"
@@ -95,11 +96,13 @@ static void gd_clipboard_update_info(GtkDisplayState *gd,
             gtk_clipboard_clear(gd->gtkcb[s]);
             if (targets) {
                 gd->cbowner[s] = true;
-                gtk_clipboard_set_with_data(gd->gtkcb[s],
-                                            targets, n_targets,
-                                            gd_clipboard_get_data,
-                                            gd_clipboard_clear,
-                                            gd);
+                if (!gtk_clipboard_set_with_data(gd->gtkcb[s],
+                                                 targets, n_targets,
+                                                 gd_clipboard_get_data,
+                                                 gd_clipboard_clear,
+                                                 gd)) {
+                    warn_report("Failed to set GTK clipboard");
+                }
 
                 gtk_target_table_free(targets, n_targets);
             }
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 02/10] ui/clipboard: use int for selection field
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
  2025-03-11 15:59 ` [PATCH for-10.1 01/10] ui/gtk: warn if setting the clipboard failed marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:25   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 03/10] ui/clipboard: split out QemuClipboardContent marcandre.lureau
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

This allows to use a VMSTATE_INT32 field for migration purposes.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/clipboard.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/ui/clipboard.h b/include/ui/clipboard.h
index ab6acdbd8a..14b6099e73 100644
--- a/include/ui/clipboard.h
+++ b/include/ui/clipboard.h
@@ -112,7 +112,7 @@ struct QemuClipboardNotify {
 struct QemuClipboardInfo {
     uint32_t refcount;
     QemuClipboardPeer *owner;
-    QemuClipboardSelection selection;
+    int selection; /* QemuClipboardSelection */
     bool has_serial;
     uint32_t serial;
     struct {
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 03/10] ui/clipboard: split out QemuClipboardContent
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
  2025-03-11 15:59 ` [PATCH for-10.1 01/10] ui/gtk: warn if setting the clipboard failed marcandre.lureau
  2025-03-11 15:59 ` [PATCH for-10.1 02/10] ui/clipboard: use int for selection field marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:25   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 04/10] ui/clipboard: add vmstate_cbinfo marcandre.lureau
                   ` (7 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Allows to use VMSTATE STRUCT in following migration support patch.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/clipboard.h | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/include/ui/clipboard.h b/include/ui/clipboard.h
index 14b6099e73..88cfff91ef 100644
--- a/include/ui/clipboard.h
+++ b/include/ui/clipboard.h
@@ -25,6 +25,7 @@ typedef enum QemuClipboardSelection QemuClipboardSelection;
 typedef struct QemuClipboardPeer QemuClipboardPeer;
 typedef struct QemuClipboardNotify QemuClipboardNotify;
 typedef struct QemuClipboardInfo QemuClipboardInfo;
+typedef struct QemuClipboardContent QemuClipboardContent;
 
 /**
  * enum QemuClipboardType
@@ -97,6 +98,24 @@ struct QemuClipboardNotify {
     };
 };
 
+
+/**
+ * struct QemuClipboardContent
+ *
+ * @available: whether the data is available
+ * @requested: whether the data was requested
+ * @size: the size of the @data
+ * @data: the clipboard data
+ *
+ * Clipboard content.
+ */
+struct QemuClipboardContent {
+    bool available;
+    bool requested;
+    uint32_t size;
+    void *data;
+};
+
 /**
  * struct QemuClipboardInfo
  *
@@ -115,12 +134,7 @@ struct QemuClipboardInfo {
     int selection; /* QemuClipboardSelection */
     bool has_serial;
     uint32_t serial;
-    struct {
-        bool available;
-        bool requested;
-        size_t size;
-        void *data;
-    } types[QEMU_CLIPBOARD_TYPE__COUNT];
+    QemuClipboardContent types[QEMU_CLIPBOARD_TYPE__COUNT];
 };
 
 /**
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 04/10] ui/clipboard: add vmstate_cbinfo
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (2 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 03/10] ui/clipboard: split out QemuClipboardContent marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:26   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 05/10] ui/clipboard: delay clipboard update when not running marcandre.lureau
                   ` (6 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Add a VMStateDescriptor for QemuClipboardInfo.

Each clipboard owner will have to save its QemuClipboardInfo and
reregister its owned clipboard after loading. (the global cbinfo has
only pointers to owners, so it can't restore the relation with its owner
if it was to handle migration)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/ui/clipboard.h |  3 +++
 ui/clipboard.c         | 26 ++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/include/ui/clipboard.h b/include/ui/clipboard.h
index 88cfff91ef..62a96ce9ff 100644
--- a/include/ui/clipboard.h
+++ b/include/ui/clipboard.h
@@ -2,6 +2,7 @@
 #define QEMU_CLIPBOARD_H
 
 #include "qemu/notify.h"
+#include "migration/vmstate.h"
 
 /**
  * DOC: Introduction
@@ -27,6 +28,8 @@ typedef struct QemuClipboardNotify QemuClipboardNotify;
 typedef struct QemuClipboardInfo QemuClipboardInfo;
 typedef struct QemuClipboardContent QemuClipboardContent;
 
+extern const VMStateDescription vmstate_cbinfo;
+
 /**
  * enum QemuClipboardType
  *
diff --git a/ui/clipboard.c b/ui/clipboard.c
index 132086eb13..f5db60c63d 100644
--- a/ui/clipboard.c
+++ b/ui/clipboard.c
@@ -7,6 +7,32 @@ static NotifierList clipboard_notifiers =
 
 static QemuClipboardInfo *cbinfo[QEMU_CLIPBOARD_SELECTION__COUNT];
 
+static const VMStateDescription vmstate_cbcontent = {
+    .name = "clipboard/content",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .fields = (const VMStateField[]) {
+        VMSTATE_BOOL(available, QemuClipboardContent),
+        VMSTATE_BOOL(requested, QemuClipboardContent),
+        VMSTATE_UINT32(size, QemuClipboardContent),
+        VMSTATE_VBUFFER_ALLOC_UINT32(data, QemuClipboardContent, 0, 0, size),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+const VMStateDescription vmstate_cbinfo = {
+    .name = "clipboard",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .fields = (const VMStateField[]) {
+        VMSTATE_INT32(selection, QemuClipboardInfo),
+        VMSTATE_BOOL(has_serial, QemuClipboardInfo),
+        VMSTATE_UINT32(serial, QemuClipboardInfo),
+        VMSTATE_STRUCT_ARRAY(types, QemuClipboardInfo, QEMU_CLIPBOARD_TYPE__COUNT, 0, vmstate_cbcontent, QemuClipboardContent),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 void qemu_clipboard_peer_register(QemuClipboardPeer *peer)
 {
     notifier_list_add(&clipboard_notifiers, &peer->notifier);
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 05/10] ui/clipboard: delay clipboard update when not running
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (3 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 04/10] ui/clipboard: add vmstate_cbinfo marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:29   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 06/10] ui/vdagent: replace Buffer with GByteArray marcandre.lureau
                   ` (5 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

When VM is paused, we shouldn't notify of clipboard changes, similar to
how input are being treated.

On unsuspend, notify of the current state.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/clipboard.c | 40 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/ui/clipboard.c b/ui/clipboard.c
index f5db60c63d..ec00a0b8ec 100644
--- a/ui/clipboard.c
+++ b/ui/clipboard.c
@@ -1,4 +1,5 @@
 #include "qemu/osdep.h"
+#include "system/runstate.h"
 #include "ui/clipboard.h"
 #include "trace.h"
 
@@ -7,6 +8,10 @@ static NotifierList clipboard_notifiers =
 
 static QemuClipboardInfo *cbinfo[QEMU_CLIPBOARD_SELECTION__COUNT];
 
+static VMChangeStateEntry *cb_change_state_entry = NULL;
+
+static bool cb_reset_serial_on_resume = false;
+
 static const VMStateDescription vmstate_cbcontent = {
     .name = "clipboard/content",
     .version_id = 0,
@@ -33,8 +38,32 @@ const VMStateDescription vmstate_cbinfo = {
     }
 };
 
+static void qemu_clipboard_change_state(void *opaque, bool running, RunState state)
+{
+    int i;
+
+    if (!running) {
+        return;
+    }
+
+    if (cb_reset_serial_on_resume) {
+        qemu_clipboard_reset_serial();
+    }
+
+    for (i = 0; i < QEMU_CLIPBOARD_SELECTION__COUNT; i++) {
+        if (cbinfo[i]) {
+            qemu_clipboard_update(cbinfo[i]);
+        }
+    }
+
+}
+
 void qemu_clipboard_peer_register(QemuClipboardPeer *peer)
 {
+    if (cb_change_state_entry == NULL) {
+        cb_change_state_entry = qemu_add_vm_change_state_handler(qemu_clipboard_change_state, NULL);
+    }
+
     notifier_list_add(&clipboard_notifiers, &peer->notifier);
 }
 
@@ -109,7 +138,9 @@ void qemu_clipboard_update(QemuClipboardInfo *info)
         }
     }
 
-    notifier_list_notify(&clipboard_notifiers, &notify);
+    if (runstate_is_running() || runstate_check(RUN_STATE_SUSPENDED)) {
+        notifier_list_notify(&clipboard_notifiers, &notify);
+    }
 
     if (cbinfo[info->selection] != info) {
         qemu_clipboard_info_unref(cbinfo[info->selection]);
@@ -189,7 +220,12 @@ void qemu_clipboard_reset_serial(void)
             info->serial = 0;
         }
     }
-    notifier_list_notify(&clipboard_notifiers, &notify);
+
+    if (runstate_is_running() || runstate_check(RUN_STATE_SUSPENDED)) {
+        notifier_list_notify(&clipboard_notifiers, &notify);
+    } else {
+        cb_reset_serial_on_resume = true;
+    }
 }
 
 void qemu_clipboard_set_data(QemuClipboardPeer *peer,
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 06/10] ui/vdagent: replace Buffer with GByteArray
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (4 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 05/10] ui/clipboard: delay clipboard update when not running marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:30   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 07/10] ui/vdagent: keep "connected" state marcandre.lureau
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Buffer is slightly more advanced than GByteArray, since it has a
cursor/position. But vdagent code doesn't need it. This simplify a bit
the code, and migration state.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 724eff972f..ddd8990318 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -47,7 +47,7 @@ struct VDAgentChardev {
     uint32_t msgsize;
     uint8_t *xbuf;
     uint32_t xoff, xsize;
-    Buffer outbuf;
+    GByteArray *outbuf;
 
     /* mouse */
     DeviceState mouse_dev;
@@ -142,16 +142,16 @@ static void vdagent_send_buf(VDAgentChardev *vd)
 {
     uint32_t len;
 
-    while (!buffer_empty(&vd->outbuf)) {
+    while (vd->outbuf->len) {
         len = qemu_chr_be_can_write(CHARDEV(vd));
         if (len == 0) {
             return;
         }
-        if (len > vd->outbuf.offset) {
-            len = vd->outbuf.offset;
+        if (len > vd->outbuf->len) {
+            len = vd->outbuf->len;
         }
-        qemu_chr_be_write(CHARDEV(vd), vd->outbuf.buffer, len);
-        buffer_advance(&vd->outbuf, len);
+        qemu_chr_be_write(CHARDEV(vd), vd->outbuf->data, len);
+        g_byte_array_remove_range(vd->outbuf, 0, len);
     }
 }
 
@@ -166,7 +166,7 @@ static void vdagent_send_msg(VDAgentChardev *vd, VDAgentMessage *msg)
 
     msg->protocol = VD_AGENT_PROTOCOL;
 
-    if (vd->outbuf.offset + msgsize > VDAGENT_BUFFER_LIMIT) {
+    if (vd->outbuf->len + msgsize > VDAGENT_BUFFER_LIMIT) {
         error_report("buffer full, dropping message");
         return;
     }
@@ -177,9 +177,8 @@ static void vdagent_send_msg(VDAgentChardev *vd, VDAgentMessage *msg)
         if (chunk.size > 1024) {
             chunk.size = 1024;
         }
-        buffer_reserve(&vd->outbuf, sizeof(chunk) + chunk.size);
-        buffer_append(&vd->outbuf, &chunk, sizeof(chunk));
-        buffer_append(&vd->outbuf, msgbuf + msgoff, chunk.size);
+        g_byte_array_append(vd->outbuf, (void*)&chunk, sizeof (chunk));
+        g_byte_array_append(vd->outbuf, msgbuf + msgoff, chunk.size);
         msgoff += chunk.size;
     }
     vdagent_send_buf(vd);
@@ -859,7 +858,7 @@ static void vdagent_disconnect(VDAgentChardev *vd)
 {
     trace_vdagent_disconnect();
 
-    buffer_reset(&vd->outbuf);
+    g_byte_array_set_size(vd->outbuf, 0);
     vdagent_reset_bufs(vd);
     vd->caps = 0;
     if (vd->mouse_hs) {
@@ -920,7 +919,7 @@ static void vdagent_chr_init(Object *obj)
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
 
-    buffer_init(&vd->outbuf, "vdagent-outbuf");
+    vd->outbuf = g_byte_array_new();
     error_setg(&vd->migration_blocker,
                "The vdagent chardev doesn't yet support migration");
 }
@@ -934,7 +933,7 @@ static void vdagent_chr_fini(Object *obj)
     if (vd->mouse_hs) {
         qemu_input_handler_unregister(vd->mouse_hs);
     }
-    buffer_free(&vd->outbuf);
+    g_clear_pointer(&vd->outbuf, g_byte_array_unref);
 }
 
 static const TypeInfo vdagent_chr_type_info = {
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 07/10] ui/vdagent: keep "connected" state
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (5 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 06/10] ui/vdagent: replace Buffer with GByteArray marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:31   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 08/10] ui/vdagent: factor out clipboard peer registration marcandre.lureau
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

During post-load of migration, virtio will notify of fe_open state.
However vdagent code will handle this as a reconnection. This will
trigger a connection reset/caps with the agent.

Check if the state actually changed before resetting the connection.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index ddd8990318..011a9057ee 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -40,6 +40,7 @@ struct VDAgentChardev {
     bool clipboard;
 
     /* guest vdagent */
+    bool connected;
     uint32_t caps;
     VDIChunkHeader chunk;
     uint32_t chunksize;
@@ -858,6 +859,7 @@ static void vdagent_disconnect(VDAgentChardev *vd)
 {
     trace_vdagent_disconnect();
 
+    vd->connected = false;
     g_byte_array_set_size(vd->outbuf, 0);
     vdagent_reset_bufs(vd);
     vd->caps = 0;
@@ -876,6 +878,10 @@ static void vdagent_chr_set_fe_open(struct Chardev *chr, int fe_open)
 
     trace_vdagent_fe_open(fe_open);
 
+    if (vd->connected == fe_open) {
+        return;
+    }
+
     if (!fe_open) {
         trace_vdagent_close();
         vdagent_disconnect(vd);
@@ -885,6 +891,7 @@ static void vdagent_chr_set_fe_open(struct Chardev *chr, int fe_open)
         return;
     }
 
+    vd->connected = true;
     vdagent_send_caps(vd, true);
 }
 
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 08/10] ui/vdagent: factor out clipboard peer registration
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (6 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 07/10] ui/vdagent: keep "connected" state marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:32   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 09/10] ui/vdagent: add migration support marcandre.lureau
                   ` (2 subsequent siblings)
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

This allows common code reuse during migration.

Note that resetting the serial is now done regardless if the clipboard
peer was registered or not. This should still be correct.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 011a9057ee..125c659af7 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -694,6 +694,18 @@ static void vdagent_chr_open(Chardev *chr,
     *be_opened = true;
 }
 
+static void vdagent_clipboard_peer_register(VDAgentChardev *vd)
+{
+    if (vd->cbpeer.notifier.notify != NULL) {
+        return;
+    }
+
+    vd->cbpeer.name = "vdagent";
+    vd->cbpeer.notifier.notify = vdagent_clipboard_notify;
+    vd->cbpeer.request = vdagent_clipboard_request;
+    qemu_clipboard_peer_register(&vd->cbpeer);
+}
+
 static void vdagent_chr_recv_caps(VDAgentChardev *vd, VDAgentMessage *msg)
 {
     VDAgentAnnounceCapabilities *caps = (void *)msg->data;
@@ -720,13 +732,9 @@ static void vdagent_chr_recv_caps(VDAgentChardev *vd, VDAgentMessage *msg)
 
     memset(vd->last_serial, 0, sizeof(vd->last_serial));
 
-    if (have_clipboard(vd) && vd->cbpeer.notifier.notify == NULL) {
+    if (have_clipboard(vd)) {
         qemu_clipboard_reset_serial();
-
-        vd->cbpeer.name = "vdagent";
-        vd->cbpeer.notifier.notify = vdagent_clipboard_notify;
-        vd->cbpeer.request = vdagent_clipboard_request;
-        qemu_clipboard_peer_register(&vd->cbpeer);
+        vdagent_clipboard_peer_register(vd);
     }
 }
 
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 09/10] ui/vdagent: add migration support
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (7 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 08/10] ui/vdagent: factor out clipboard peer registration marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-05-09 11:38   ` Daniel P. Berrangé
  2025-03-11 15:59 ` [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker marcandre.lureau
  2025-03-11 16:12 ` [PATCH for-10.1 00/10] Support vdagent migration Daniel P. Berrangé
  10 siblings, 1 reply; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 139 insertions(+)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index 125c659af7..cc5738a6ea 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -10,6 +10,7 @@
 #include "ui/clipboard.h"
 #include "ui/console.h"
 #include "ui/input.h"
+#include "migration/vmstate.h"
 #include "trace.h"
 
 #include "qapi/qapi-types-char.h"
@@ -930,6 +931,143 @@ static void vdagent_chr_class_init(ObjectClass *oc, void *data)
     cc->chr_accept_input = vdagent_chr_accept_input;
 }
 
+static int post_load(void *opaque, int version_id)
+{
+    VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(opaque);
+
+    if (have_mouse(vd) && vd->mouse_hs) {
+        qemu_input_handler_activate(vd->mouse_hs);
+    }
+
+    if (have_clipboard(vd)) {
+        vdagent_clipboard_peer_register(vd);
+    }
+
+    return 0;
+}
+
+static const VMStateDescription vmstate_chunk = {
+    .name = "vdagent/chunk",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .fields = (const VMStateField[]) {
+        VMSTATE_UINT32(port, VDIChunkHeader),
+        VMSTATE_UINT32(size, VDIChunkHeader),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static const VMStateDescription vmstate_vdba = {
+    .name = "vdagent/bytearray",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .fields = (const VMStateField[]) {
+        VMSTATE_UINT32(len, GByteArray),
+        VMSTATE_VBUFFER_ALLOC_UINT32(data, GByteArray, 0, 0, len),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+struct CBInfoArray {
+    uint32_t n;
+    QemuClipboardInfo cbinfo[QEMU_CLIPBOARD_SELECTION__COUNT];
+};
+
+static const VMStateDescription vmstate_cbinfo_array = {
+    .name = "cbinfoarray",
+    .fields = (const VMStateField[]) {
+        VMSTATE_UINT32(n, struct CBInfoArray),
+        VMSTATE_STRUCT_VARRAY_UINT32(cbinfo, struct CBInfoArray, n,
+                                     0, vmstate_cbinfo, QemuClipboardInfo),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static int put_cbinfo(QEMUFile *f, void *pv, size_t size,
+                      const VMStateField *field, JSONWriter *vmdesc)
+{
+    VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(pv);
+    struct CBInfoArray cbinfo = { 0, };
+    int i;
+
+    if (!have_clipboard(vd)) {
+        return 0;
+    }
+
+    for (i = 0; i < QEMU_CLIPBOARD_SELECTION__COUNT; i++) {
+        if (qemu_clipboard_peer_owns(&vd->cbpeer, i)) {
+             cbinfo.cbinfo[cbinfo.n++] = *qemu_clipboard_info(i);
+        }
+    }
+
+    return vmstate_save_state(f, &vmstate_cbinfo_array, &cbinfo, vmdesc);
+}
+
+static int get_cbinfo(QEMUFile *f, void *pv, size_t size,
+                      const VMStateField *field)
+{
+    VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(pv);
+    struct CBInfoArray cbinfo = { 0, };
+    int i, ret;
+
+    if (!have_clipboard(vd)) {
+        return 0;
+    }
+
+    vdagent_clipboard_peer_register(vd);
+
+    ret = vmstate_load_state(f, &vmstate_cbinfo_array, &cbinfo, 0);
+    if (ret) {
+        return ret;
+    }
+
+    for (i = 0; i < cbinfo.n; i++) {
+        g_autoptr(QemuClipboardInfo) info = qemu_clipboard_info_new(&vd->cbpeer, cbinfo.cbinfo[i].selection);
+        /* this will steal clipboard data pointer from cbinfo.types */
+        memcpy(info->types, cbinfo.cbinfo[i].types, sizeof(cbinfo.cbinfo[i].types));
+        qemu_clipboard_update(info);
+    }
+
+    return 0;
+}
+
+static const VMStateInfo vmstate_cbinfos = {
+    .name = "vdagent/cbinfos",
+    .get  = get_cbinfo,
+    .put  = put_cbinfo,
+};
+
+static const VMStateDescription vmstate_vdagent = {
+    .name = "vdagent",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .post_load = post_load,
+    .fields = (const VMStateField[]) {
+        VMSTATE_BOOL(connected, VDAgentChardev),
+        VMSTATE_UINT32(caps, VDAgentChardev),
+        VMSTATE_STRUCT(chunk, VDAgentChardev, 0, vmstate_chunk, VDIChunkHeader),
+        VMSTATE_UINT32(chunksize, VDAgentChardev),
+        VMSTATE_UINT32(msgsize, VDAgentChardev),
+        VMSTATE_VBUFFER_ALLOC_UINT32(msgbuf, VDAgentChardev, 0, 0, msgsize),
+        VMSTATE_UINT32(xsize, VDAgentChardev),
+        VMSTATE_UINT32(xoff, VDAgentChardev),
+        VMSTATE_VBUFFER_ALLOC_UINT32(xbuf, VDAgentChardev, 0, 0, xsize),
+        VMSTATE_STRUCT_POINTER(outbuf, VDAgentChardev, vmstate_vdba, GByteArray),
+        VMSTATE_UINT32(mouse_x, VDAgentChardev),
+        VMSTATE_UINT32(mouse_y, VDAgentChardev),
+        VMSTATE_UINT32(mouse_btn, VDAgentChardev),
+        VMSTATE_UINT32(mouse_display, VDAgentChardev),
+        VMSTATE_UINT32_ARRAY(last_serial, VDAgentChardev, QEMU_CLIPBOARD_SELECTION__COUNT),
+        VMSTATE_UINT32_ARRAY(cbpending, VDAgentChardev, QEMU_CLIPBOARD_SELECTION__COUNT),
+        {
+            .name         = "cbinfos",
+            .info         = &vmstate_cbinfos,
+            .flags        = VMS_SINGLE,
+        },
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static void vdagent_chr_init(Object *obj)
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
@@ -937,6 +1075,7 @@ static void vdagent_chr_init(Object *obj)
     vd->outbuf = g_byte_array_new();
     error_setg(&vd->migration_blocker,
                "The vdagent chardev doesn't yet support migration");
+    vmstate_register_any(NULL, &vmstate_vdagent, vd);
 }
 
 static void vdagent_chr_fini(Object *obj)
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (8 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 09/10] ui/vdagent: add migration support marcandre.lureau
@ 2025-03-11 15:59 ` marcandre.lureau
  2025-03-20  8:38   ` Prasad Pandit
  2025-05-09 11:39   ` Daniel P. Berrangé
  2025-03-11 16:12 ` [PATCH for-10.1 00/10] Support vdagent migration Daniel P. Berrangé
  10 siblings, 2 replies; 26+ messages in thread
From: marcandre.lureau @ 2025-03-11 15:59 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, Marc-André Lureau

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Fixes: https://issues.redhat.com/browse/RHEL-81894
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/vdagent.c | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/ui/vdagent.c b/ui/vdagent.c
index cc5738a6ea..3b27ba25fb 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -6,7 +6,6 @@
 #include "qemu/option.h"
 #include "qemu/units.h"
 #include "hw/qdev-core.h"
-#include "migration/blocker.h"
 #include "ui/clipboard.h"
 #include "ui/console.h"
 #include "ui/input.h"
@@ -33,9 +32,6 @@
 struct VDAgentChardev {
     Chardev parent;
 
-    /* TODO: migration isn't yet supported */
-    Error *migration_blocker;
-
     /* config */
     bool mouse;
     bool clipboard;
@@ -673,10 +669,6 @@ static void vdagent_chr_open(Chardev *chr,
     return;
 #endif
 
-    if (migrate_add_blocker(&vd->migration_blocker, errp) != 0) {
-        return;
-    }
-
     vd->mouse = VDAGENT_MOUSE_DEFAULT;
     if (cfg->has_mouse) {
         vd->mouse = cfg->mouse;
@@ -1073,8 +1065,6 @@ static void vdagent_chr_init(Object *obj)
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
 
     vd->outbuf = g_byte_array_new();
-    error_setg(&vd->migration_blocker,
-               "The vdagent chardev doesn't yet support migration");
     vmstate_register_any(NULL, &vmstate_vdagent, vd);
 }
 
@@ -1082,7 +1072,6 @@ static void vdagent_chr_fini(Object *obj)
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
 
-    migrate_del_blocker(&vd->migration_blocker);
     vdagent_disconnect(vd);
     if (vd->mouse_hs) {
         qemu_input_handler_unregister(vd->mouse_hs);
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 00/10] Support vdagent migration
  2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
                   ` (9 preceding siblings ...)
  2025-03-11 15:59 ` [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker marcandre.lureau
@ 2025-03-11 16:12 ` Daniel P. Berrangé
  2025-05-06 10:38   ` Marc-André Lureau
  10 siblings, 1 reply; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-03-11 16:12 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:22PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> 
> iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmfQXbMcHG1hcmNhbmRy
> ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5bmLD/49TJdk8vSnG/G53f3Z
> UdUGdDiv98lAr/1wPZvmLPGfxiVLrVQK9Rarjnq9+dzmjoJC+w8THyPIvlvlKAQO
> aNSe5LV2lcYFLZwJqXQdGHTEWWZX3BmXroSFY06F9znX4lrNSg/cxLaI+Lt+dbEt
> BA9IIMzGYB+zhkgJh86Yji1Ioz29qwMgb4etf4OtP3PqT7/djWxxdlYLmyqN7D13
> seHAkvhaA7sqglLcfUv0MjrNA1Yxg3QQmbmiErpyaHo9kQ2AuV49THZl5/Pe3WR5
> FJAeO83G8hdxdqFuDvnXB0ID2klqWYkZTJsTD75F1hU1yqszkVt8k4mUWubTIDNm
> VEFKGz/S+xR2rO0RGgGzMPzEm0FSPbLq1+U2ETRf3xBns0Jbqe6njHeLGAzmOx9p
> 3F8fkM4mzIrs3oOU/e7dlxOl9N6uQhVfJW6G+9QMLPLveIpNR6CGphbgHuMK8PPL
> vZ1WNrGa/xoHvqQi2FvIJJrnKYYBJDXQW1edM+apDgO9jBSmiO5XlKZjeNHwgZ6J
> 0sNmJUKCmk2SPGtFHdpdRfjfYfN2eR07eTVnVgstpHCUZi0nRz+4A6yq4k0SQLQH
> ZWsaq6cdZyfNOOdSHaLfI/2/36eiLpVCAuwn+AjK+XvPR6mQc9rwebV8N5nXLEZ8
> OFcig1i00RhHBRJFPrOjWIFIQg==
> =iTg5
> -----END PGP SIGNATURE-----

Huh ?  I presume there should have been a cover letter here
instead of the tail end of a pgp signature....

> 
> Marc-André Lureau (10):
>   ui/gtk: warn if setting the clipboard failed
>   ui/clipboard: use int for selection field
>   ui/clipboard: split out QemuClipboardContent
>   ui/clipboard: add vmstate_cbinfo
>   ui/clipboard: delay clipboard update when not running
>   ui/vdagent: replace Buffer with GByteArray
>   ui/vdagent: keep "connected" state
>   ui/vdagent: factor out clipboard peer registration
>   ui/vdagent: add migration support
>   ui/vdagent: remove migration blocker
> 
>  include/ui/clipboard.h |  31 +++++--
>  ui/clipboard.c         |  66 +++++++++++++-
>  ui/gtk-clipboard.c     |  13 ++-
>  ui/vdagent.c           | 202 +++++++++++++++++++++++++++++++++++------
>  4 files changed, 268 insertions(+), 44 deletions(-)
> 
> -- 
> 2.47.0
> 
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker
  2025-03-11 15:59 ` [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker marcandre.lureau
@ 2025-03-20  8:38   ` Prasad Pandit
  2025-03-20  9:05     ` Marc-André Lureau
  2025-05-09 11:39   ` Daniel P. Berrangé
  1 sibling, 1 reply; 26+ messages in thread
From: Prasad Pandit @ 2025-03-20  8:38 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, 11 Mar 2025 at 21:44, <marcandre.lureau@redhat.com> wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> Fixes: https://issues.redhat.com/browse/RHEL-81894
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

* No commit message? Same for patch 09/10.

---
  - Prasad



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker
  2025-03-20  8:38   ` Prasad Pandit
@ 2025-03-20  9:05     ` Marc-André Lureau
  0 siblings, 0 replies; 26+ messages in thread
From: Marc-André Lureau @ 2025-03-20  9:05 UTC (permalink / raw)
  To: Prasad Pandit; +Cc: qemu-devel, kraxel

[-- Attachment #1: Type: text/plain, Size: 594 bytes --]

Well, there isn't much else to say. And there is a Fixes tag. I don't think
we have strict rules about commit message, but I am fine adding more
context on each commit.

Le jeu. 20 mars 2025, 12:39, Prasad Pandit <ppandit@redhat.com> a écrit :

> On Tue, 11 Mar 2025 at 21:44, <marcandre.lureau@redhat.com> wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> > Fixes: https://issues.redhat.com/browse/RHEL-81894
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> * No commit message? Same for patch 09/10.
>
> ---
>   - Prasad
>
>
>

[-- Attachment #2: Type: text/html, Size: 1280 bytes --]

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 00/10] Support vdagent migration
  2025-03-11 16:12 ` [PATCH for-10.1 00/10] Support vdagent migration Daniel P. Berrangé
@ 2025-05-06 10:38   ` Marc-André Lureau
  0 siblings, 0 replies; 26+ messages in thread
From: Marc-André Lureau @ 2025-05-06 10:38 UTC (permalink / raw)
  To: Daniel P. Berrangé; +Cc: qemu-devel, kraxel

Hi

On Tue, Mar 11, 2025 at 8:16 PM Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> On Tue, Mar 11, 2025 at 07:59:22PM +0400, marcandre.lureau@redhat.com wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> >
> > iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmfQXbMcHG1hcmNhbmRy
> > ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5bmLD/49TJdk8vSnG/G53f3Z
> > UdUGdDiv98lAr/1wPZvmLPGfxiVLrVQK9Rarjnq9+dzmjoJC+w8THyPIvlvlKAQO
> > aNSe5LV2lcYFLZwJqXQdGHTEWWZX3BmXroSFY06F9znX4lrNSg/cxLaI+Lt+dbEt
> > BA9IIMzGYB+zhkgJh86Yji1Ioz29qwMgb4etf4OtP3PqT7/djWxxdlYLmyqN7D13
> > seHAkvhaA7sqglLcfUv0MjrNA1Yxg3QQmbmiErpyaHo9kQ2AuV49THZl5/Pe3WR5
> > FJAeO83G8hdxdqFuDvnXB0ID2klqWYkZTJsTD75F1hU1yqszkVt8k4mUWubTIDNm
> > VEFKGz/S+xR2rO0RGgGzMPzEm0FSPbLq1+U2ETRf3xBns0Jbqe6njHeLGAzmOx9p
> > 3F8fkM4mzIrs3oOU/e7dlxOl9N6uQhVfJW6G+9QMLPLveIpNR6CGphbgHuMK8PPL
> > vZ1WNrGa/xoHvqQi2FvIJJrnKYYBJDXQW1edM+apDgO9jBSmiO5XlKZjeNHwgZ6J
> > 0sNmJUKCmk2SPGtFHdpdRfjfYfN2eR07eTVnVgstpHCUZi0nRz+4A6yq4k0SQLQH
> > ZWsaq6cdZyfNOOdSHaLfI/2/36eiLpVCAuwn+AjK+XvPR6mQc9rwebV8N5nXLEZ8
> > OFcig1i00RhHBRJFPrOjWIFIQg==
> > =iTg5
> > -----END PGP SIGNATURE-----
>
> Huh ?  I presume there should have been a cover letter here
> instead of the tail end of a pgp signature....
>

No idea what went wrong. But anyway, there was not much to say in the
cover letter, ttsia.
Up for review?

> >
> > Marc-André Lureau (10):
> >   ui/gtk: warn if setting the clipboard failed
> >   ui/clipboard: use int for selection field
> >   ui/clipboard: split out QemuClipboardContent
> >   ui/clipboard: add vmstate_cbinfo
> >   ui/clipboard: delay clipboard update when not running
> >   ui/vdagent: replace Buffer with GByteArray
> >   ui/vdagent: keep "connected" state
> >   ui/vdagent: factor out clipboard peer registration
> >   ui/vdagent: add migration support
> >   ui/vdagent: remove migration blocker
> >
> >  include/ui/clipboard.h |  31 +++++--
> >  ui/clipboard.c         |  66 +++++++++++++-
> >  ui/gtk-clipboard.c     |  13 ++-
> >  ui/vdagent.c           | 202 +++++++++++++++++++++++++++++++++++------
> >  4 files changed, 268 insertions(+), 44 deletions(-)
> >
> > --
> > 2.47.0
> >
> >
>
> With regards,
> Daniel
> --
> |: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org         -o-            https://fstop138.berrange.com :|
> |: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 01/10] ui/gtk: warn if setting the clipboard failed
  2025-03-11 15:59 ` [PATCH for-10.1 01/10] ui/gtk: warn if setting the clipboard failed marcandre.lureau
@ 2025-05-09 11:24   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:24 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:23PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Just in case.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/gtk-clipboard.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 02/10] ui/clipboard: use int for selection field
  2025-03-11 15:59 ` [PATCH for-10.1 02/10] ui/clipboard: use int for selection field marcandre.lureau
@ 2025-05-09 11:25   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:25 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:24PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> This allows to use a VMSTATE_INT32 field for migration purposes.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/ui/clipboard.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 03/10] ui/clipboard: split out QemuClipboardContent
  2025-03-11 15:59 ` [PATCH for-10.1 03/10] ui/clipboard: split out QemuClipboardContent marcandre.lureau
@ 2025-05-09 11:25   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:25 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:25PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Allows to use VMSTATE STRUCT in following migration support patch.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/ui/clipboard.h | 26 ++++++++++++++++++++------
>  1 file changed, 20 insertions(+), 6 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 04/10] ui/clipboard: add vmstate_cbinfo
  2025-03-11 15:59 ` [PATCH for-10.1 04/10] ui/clipboard: add vmstate_cbinfo marcandre.lureau
@ 2025-05-09 11:26   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:26 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:26PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Add a VMStateDescriptor for QemuClipboardInfo.
> 
> Each clipboard owner will have to save its QemuClipboardInfo and
> reregister its owned clipboard after loading. (the global cbinfo has
> only pointers to owners, so it can't restore the relation with its owner
> if it was to handle migration)
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/ui/clipboard.h |  3 +++
>  ui/clipboard.c         | 26 ++++++++++++++++++++++++++
>  2 files changed, 29 insertions(+)
>

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 05/10] ui/clipboard: delay clipboard update when not running
  2025-03-11 15:59 ` [PATCH for-10.1 05/10] ui/clipboard: delay clipboard update when not running marcandre.lureau
@ 2025-05-09 11:29   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:29 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:27PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> When VM is paused, we shouldn't notify of clipboard changes, similar to
> how input are being treated.
> 
> On unsuspend, notify of the current state.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/clipboard.c | 40 ++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 38 insertions(+), 2 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 06/10] ui/vdagent: replace Buffer with GByteArray
  2025-03-11 15:59 ` [PATCH for-10.1 06/10] ui/vdagent: replace Buffer with GByteArray marcandre.lureau
@ 2025-05-09 11:30   ` Daniel P. Berrangé
  2025-05-09 14:49     ` Marc-André Lureau
  0 siblings, 1 reply; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:30 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:28PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Buffer is slightly more advanced than GByteArray, since it has a
> cursor/position. But vdagent code doesn't need it. This simplify a bit
> the code, and migration state.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/vdagent.c | 25 ++++++++++++-------------
>  1 file changed, 12 insertions(+), 13 deletions(-)
> 
> diff --git a/ui/vdagent.c b/ui/vdagent.c
> index 724eff972f..ddd8990318 100644
> --- a/ui/vdagent.c
> +++ b/ui/vdagent.c

> @@ -177,9 +177,8 @@ static void vdagent_send_msg(VDAgentChardev *vd, VDAgentMessage *msg)
>          if (chunk.size > 1024) {
>              chunk.size = 1024;
>          }
> -        buffer_reserve(&vd->outbuf, sizeof(chunk) + chunk.size);
> -        buffer_append(&vd->outbuf, &chunk, sizeof(chunk));
> -        buffer_append(&vd->outbuf, msgbuf + msgoff, chunk.size);
> +        g_byte_array_append(vd->outbuf, (void*)&chunk, sizeof (chunk));

nit-pick, QEMU style doesn't usually have a space between 'sizeof' and '('

> +        g_byte_array_append(vd->outbuf, msgbuf + msgoff, chunk.size);
>          msgoff += chunk.size;
>      }
>      vdagent_send_buf(vd);

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 07/10] ui/vdagent: keep "connected" state
  2025-03-11 15:59 ` [PATCH for-10.1 07/10] ui/vdagent: keep "connected" state marcandre.lureau
@ 2025-05-09 11:31   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:31 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:29PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> During post-load of migration, virtio will notify of fe_open state.
> However vdagent code will handle this as a reconnection. This will
> trigger a connection reset/caps with the agent.
> 
> Check if the state actually changed before resetting the connection.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/vdagent.c | 7 +++++++
>  1 file changed, 7 insertions(+)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 08/10] ui/vdagent: factor out clipboard peer registration
  2025-03-11 15:59 ` [PATCH for-10.1 08/10] ui/vdagent: factor out clipboard peer registration marcandre.lureau
@ 2025-05-09 11:32   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:32 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:30PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> This allows common code reuse during migration.
> 
> Note that resetting the serial is now done regardless if the clipboard
> peer was registered or not. This should still be correct.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/vdagent.c | 20 ++++++++++++++------
>  1 file changed, 14 insertions(+), 6 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 09/10] ui/vdagent: add migration support
  2025-03-11 15:59 ` [PATCH for-10.1 09/10] ui/vdagent: add migration support marcandre.lureau
@ 2025-05-09 11:38   ` Daniel P. Berrangé
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:38 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:31PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/vdagent.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 139 insertions(+)
> 
> diff --git a/ui/vdagent.c b/ui/vdagent.c
> index 125c659af7..cc5738a6ea 100644
> --- a/ui/vdagent.c
> +++ b/ui/vdagent.c
> @@ -10,6 +10,7 @@
>  #include "ui/clipboard.h"
>  #include "ui/console.h"
>  #include "ui/input.h"
> +#include "migration/vmstate.h"
>  #include "trace.h"


> +static int put_cbinfo(QEMUFile *f, void *pv, size_t size,
> +                      const VMStateField *field, JSONWriter *vmdesc)
> +{
> +    VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(pv);
> +    struct CBInfoArray cbinfo = { 0, };

Just ' = {}' should be sufficient to initialize all fields.

> +    int i;
> +
> +    if (!have_clipboard(vd)) {
> +        return 0;
> +    }
> +
> +    for (i = 0; i < QEMU_CLIPBOARD_SELECTION__COUNT; i++) {
> +        if (qemu_clipboard_peer_owns(&vd->cbpeer, i)) {
> +             cbinfo.cbinfo[cbinfo.n++] = *qemu_clipboard_info(i);
> +        }
> +    }
> +
> +    return vmstate_save_state(f, &vmstate_cbinfo_array, &cbinfo, vmdesc);
> +}
> +
> +static int get_cbinfo(QEMUFile *f, void *pv, size_t size,
> +                      const VMStateField *field)
> +{
> +    VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(pv);
> +    struct CBInfoArray cbinfo = { 0, };

Likewise.

> +    int i, ret;
> +
> +    if (!have_clipboard(vd)) {
> +        return 0;
> +    }
> +
> +    vdagent_clipboard_peer_register(vd);
> +
> +    ret = vmstate_load_state(f, &vmstate_cbinfo_array, &cbinfo, 0);
> +    if (ret) {
> +        return ret;
> +    }
> +
> +    for (i = 0; i < cbinfo.n; i++) {
> +        g_autoptr(QemuClipboardInfo) info = qemu_clipboard_info_new(&vd->cbpeer, cbinfo.cbinfo[i].selection);
> +        /* this will steal clipboard data pointer from cbinfo.types */
> +        memcpy(info->types, cbinfo.cbinfo[i].types, sizeof(cbinfo.cbinfo[i].types));
> +        qemu_clipboard_update(info);
> +    }
> +
> +    return 0;
> +}


Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker
  2025-03-11 15:59 ` [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker marcandre.lureau
  2025-03-20  8:38   ` Prasad Pandit
@ 2025-05-09 11:39   ` Daniel P. Berrangé
  1 sibling, 0 replies; 26+ messages in thread
From: Daniel P. Berrangé @ 2025-05-09 11:39 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: qemu-devel, kraxel

On Tue, Mar 11, 2025 at 07:59:32PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Fixes: https://issues.redhat.com/browse/RHEL-81894
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  ui/vdagent.c | 11 -----------
>  1 file changed, 11 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for-10.1 06/10] ui/vdagent: replace Buffer with GByteArray
  2025-05-09 11:30   ` Daniel P. Berrangé
@ 2025-05-09 14:49     ` Marc-André Lureau
  0 siblings, 0 replies; 26+ messages in thread
From: Marc-André Lureau @ 2025-05-09 14:49 UTC (permalink / raw)
  To: Daniel P. Berrangé; +Cc: qemu-devel, kraxel

Hi

On Fri, May 9, 2025 at 3:31 PM Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> On Tue, Mar 11, 2025 at 07:59:28PM +0400, marcandre.lureau@redhat.com wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> > Buffer is slightly more advanced than GByteArray, since it has a
> > cursor/position. But vdagent code doesn't need it. This simplify a bit
> > the code, and migration state.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  ui/vdagent.c | 25 ++++++++++++-------------
> >  1 file changed, 12 insertions(+), 13 deletions(-)
> >
> > diff --git a/ui/vdagent.c b/ui/vdagent.c
> > index 724eff972f..ddd8990318 100644
> > --- a/ui/vdagent.c
> > +++ b/ui/vdagent.c
>
> > @@ -177,9 +177,8 @@ static void vdagent_send_msg(VDAgentChardev *vd, VDAgentMessage *msg)
> >          if (chunk.size > 1024) {
> >              chunk.size = 1024;
> >          }
> > -        buffer_reserve(&vd->outbuf, sizeof(chunk) + chunk.size);
> > -        buffer_append(&vd->outbuf, &chunk, sizeof(chunk));
> > -        buffer_append(&vd->outbuf, msgbuf + msgoff, chunk.size);
> > +        g_byte_array_append(vd->outbuf, (void*)&chunk, sizeof (chunk));
>
> nit-pick, QEMU style doesn't usually have a space between 'sizeof' and '('

indeed, and it didn't pass checkpatch! thanks

>
> > +        g_byte_array_append(vd->outbuf, msgbuf + msgoff, chunk.size);
> >          msgoff += chunk.size;
> >      }
> >      vdagent_send_buf(vd);
>
> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
>
>
> With regards,
> Daniel
> --
> |: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org         -o-            https://fstop138.berrange.com :|
> |: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2025-05-09 14:50 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-11 15:59 [PATCH for-10.1 00/10] Support vdagent migration marcandre.lureau
2025-03-11 15:59 ` [PATCH for-10.1 01/10] ui/gtk: warn if setting the clipboard failed marcandre.lureau
2025-05-09 11:24   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 02/10] ui/clipboard: use int for selection field marcandre.lureau
2025-05-09 11:25   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 03/10] ui/clipboard: split out QemuClipboardContent marcandre.lureau
2025-05-09 11:25   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 04/10] ui/clipboard: add vmstate_cbinfo marcandre.lureau
2025-05-09 11:26   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 05/10] ui/clipboard: delay clipboard update when not running marcandre.lureau
2025-05-09 11:29   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 06/10] ui/vdagent: replace Buffer with GByteArray marcandre.lureau
2025-05-09 11:30   ` Daniel P. Berrangé
2025-05-09 14:49     ` Marc-André Lureau
2025-03-11 15:59 ` [PATCH for-10.1 07/10] ui/vdagent: keep "connected" state marcandre.lureau
2025-05-09 11:31   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 08/10] ui/vdagent: factor out clipboard peer registration marcandre.lureau
2025-05-09 11:32   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 09/10] ui/vdagent: add migration support marcandre.lureau
2025-05-09 11:38   ` Daniel P. Berrangé
2025-03-11 15:59 ` [PATCH for-10.1 10/10] ui/vdagent: remove migration blocker marcandre.lureau
2025-03-20  8:38   ` Prasad Pandit
2025-03-20  9:05     ` Marc-André Lureau
2025-05-09 11:39   ` Daniel P. Berrangé
2025-03-11 16:12 ` [PATCH for-10.1 00/10] Support vdagent migration Daniel P. Berrangé
2025-05-06 10:38   ` Marc-André Lureau

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).