This will be used to support backend-transfer migration for
vhost-user-blk, we'll migrate event notifier fds through
migration stream, to avoid extra contact with backend.

Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
 include/migration/vmstate.h        |  7 ++++
 migration/meson.build              |  1 +
 migration/vmstate-event-notifier.c | 54 ++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+)
 create mode 100644 migration/vmstate-event-notifier.c

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index f243518fb5..7f1f1c166a 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -1294,4 +1294,11 @@ void vmstate_register_ram_global(struct MemoryRegion 
*memory);
 
 bool vmstate_check_only_migratable(const VMStateDescription *vmsd);
 
+extern const VMStateDescription vmstate_event_notifier;
+
+#define VMSTATE_EVENT_NOTIFIER(_field, _struct) \
+    VMSTATE_STRUCT(_field, _struct, 0, vmstate_event_notifier, \
+                   EventNotifier)
+
+
 #endif
diff --git a/migration/meson.build b/migration/meson.build
index 16909d54c5..b5341ae0cb 100644
--- a/migration/meson.build
+++ b/migration/meson.build
@@ -5,6 +5,7 @@ migration_files = files(
   'xbzrle.c',
   'vmstate-types.c',
   'vmstate.c',
+  'vmstate-event-notifier.c',
   'qemu-file.c',
   'yank_functions.c',
 )
diff --git a/migration/vmstate-event-notifier.c 
b/migration/vmstate-event-notifier.c
new file mode 100644
index 0000000000..2076eec961
--- /dev/null
+++ b/migration/vmstate-event-notifier.c
@@ -0,0 +1,54 @@
+/*
+ * Event notifier migration support
+ * Copyright (c) Yandex Technologies LLC, 2025
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/event_notifier.h"
+#include "migration/vmstate.h"
+
+static int event_notifier_pre_save(void *opaque)
+{
+    struct EventNotifier *e = opaque;
+
+    if (!e->initialized || e->rfd != e->wfd) {
+        return -1;
+    }
+
+    return 0;
+}
+
+static int event_notifier_pre_load(void *opaque)
+{
+    struct EventNotifier *e = opaque;
+
+    if (e->initialized) {
+        return -1;
+    }
+
+    return 0;
+}
+
+static int event_notifier_post_load(void *opaque, int version_id)
+{
+    struct EventNotifier *e = opaque;
+
+    if (e->rfd < 0) {
+        return -1;
+    }
+
+    e->wfd = e->rfd;
+    e->initialized = true;
+
+    return 0;
+}
+
+const VMStateDescription vmstate_event_notifier = {
+    .name = "event-notifier",
+    .pre_save = event_notifier_pre_save,
+    .pre_load = event_notifier_pre_load,
+    .post_load = event_notifier_post_load,
+    .fields = (const VMStateField[]){VMSTATE_FD(rfd, EventNotifier),
+                                     VMSTATE_END_OF_LIST()},
+};
-- 
2.48.1


Reply via email to