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
