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
