We'll need to transfer the chardev attached to vhost-user-blk, to
support backend-transfer migration for vhost-user-blk. So, prepare
chardev vmsd now.

Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
 chardev/char-backend-transfer.c         | 52 +++++++++++++++++++++++++
 chardev/meson.build                     |  1 +
 include/chardev/char-backend-transfer.h | 17 ++++++++
 3 files changed, 70 insertions(+)
 create mode 100644 chardev/char-backend-transfer.c
 create mode 100644 include/chardev/char-backend-transfer.h

diff --git a/chardev/char-backend-transfer.c b/chardev/char-backend-transfer.c
new file mode 100644
index 0000000000..f1a399c7fa
--- /dev/null
+++ b/chardev/char-backend-transfer.c
@@ -0,0 +1,52 @@
+/*
+ * Event notifier migration support
+ * Copyright (c) Yandex Technologies LLC, 2025
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "chardev/char-fe.h"
+#include "migration/vmstate.h"
+
+typedef struct CharBackendTransferTmp {
+    CharBackend *parent;
+    int fd;
+} CharBackendTransferTmp;
+
+static int char_backend_transfer_pre_save(void *opaque)
+{
+    CharBackendTransferTmp *tmp = opaque;
+
+    tmp->fd = qemu_chr_get_client(tmp->parent->chr);
+    if (tmp->fd < 0) {
+        return -1;
+    }
+
+    return 0;
+}
+
+static int char_backend_transfer_post_load(void *opaque, int version_id)
+{
+    CharBackendTransferTmp *tmp = opaque;
+
+    return qemu_chr_add_client(tmp->parent->chr, tmp->fd);
+}
+
+const VMStateDescription vmstate_backend_transfer_char_tmp = {
+    .name = "backend-transfer-char-tmp",
+    .pre_save = char_backend_transfer_pre_save,
+    .post_load = char_backend_transfer_post_load,
+    .fields = (const VMStateField[]) {
+        VMSTATE_FD(fd, CharBackendTransferTmp),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+const VMStateDescription vmstate_backend_transfer_char = {
+    .name = "backend-transfer-char",
+    .fields = (const VMStateField[]) {
+        VMSTATE_WITH_TMP(CharBackend, CharBackendTransferTmp,
+                         vmstate_backend_transfer_char_tmp),
+        VMSTATE_END_OF_LIST()
+    },
+};
diff --git a/chardev/meson.build b/chardev/meson.build
index 56ee39ac0b..239c8cd072 100644
--- a/chardev/meson.build
+++ b/chardev/meson.build
@@ -31,6 +31,7 @@ chardev_ss = chardev_ss.apply({})
 
 system_ss.add(files(
     'char-hmp-cmds.c',
+    'char-backend-transfer.c',
     'msmouse.c',
     'wctablet.c',
     'testdev.c'))
diff --git a/include/chardev/char-backend-transfer.h 
b/include/chardev/char-backend-transfer.h
new file mode 100644
index 0000000000..2c3da5f836
--- /dev/null
+++ b/include/chardev/char-backend-transfer.h
@@ -0,0 +1,17 @@
+/*
+ * Event notifier migration support
+ * Copyright (c) Yandex Technologies LLC, 2025
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef CHAR_BACKEND_TRANSFER_H
+#define CHAR_BACKEND_TRANSFER_H
+
+#include "qemu/typedefs.h"
+
+extern const VMStateDescription vmstate_backend_transfer_char;
+#define VMSTATE_BACKEND_TRANSFER_CHARDEV(_field, _state)                       
\
+    VMSTATE_STRUCT(_field, _state, 0, vmstate_backend_transfer_char,           
\
+                   CharBackend)
+
+#endif
-- 
2.48.1


Reply via email to