[libvirt PATCHv2 0/5] qemu: do not use deprecated options for new virtiofsd (virtiofs epopee)

Also, allow migration if we think we can. Ján Tomko (5): tests: vhostuser: add virtiofsd json descriptor tests: qemuxmlconf: adjust test case to new virtiofsd qemu: fill capabilities for virtiofsd qemu: do not use deprecated options for new virtiofsd qemu: migration: allow migration for virtiofs src/conf/domain_conf.h | 1 + src/qemu/qemu_migration.c | 9 +- src/qemu/qemu_vhost_user.c | 60 ++++++++++++ src/qemu/qemu_vhost_user.h | 12 +++ src/qemu/qemu_virtiofs.c | 92 +++++++++++++------ .../libexec/qemu/vhost-user/test-virtiofsd | 10 ++ .../qemu/vhost-user/50-qemu-virtiofsd.json | 5 + tests/qemuvhostusertest.c | 1 + .../vhost-user-fs-fd-memory.xml | 3 +- 9 files changed, 161 insertions(+), 32 deletions(-) create mode 100755 tests/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd create mode 100644 tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json -- 2.45.2

Add the capabilities from the latest virtiofsd main branch and adjust the order in the priority test accordingly. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- .../usr/libexec/qemu/vhost-user/test-virtiofsd | 10 ++++++++++ .../usr/share/qemu/vhost-user/50-qemu-virtiofsd.json | 5 +++++ tests/qemuvhostusertest.c | 1 + 3 files changed, 16 insertions(+) create mode 100755 tests/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd create mode 100644 tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json diff --git a/tests/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd b/tests/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd new file mode 100755 index 0000000000..90b38187c9 --- /dev/null +++ b/tests/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd @@ -0,0 +1,10 @@ +#!/bin/sh + +cat <<EOF +{ + "type": "fs", + "features": [ + "migrate-precopy" + ] +} +EOF diff --git a/tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json b/tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json new file mode 100644 index 0000000000..b908bc6b30 --- /dev/null +++ b/tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json @@ -0,0 +1,5 @@ +{ + "description": "virtiofsd vhost-user-fs", + "type": "fs", + "binary": "/usr/libexec/qemu/vhost-user/test-vhost-user-gpu" +} diff --git a/tests/qemuvhostusertest.c b/tests/qemuvhostusertest.c index 4bbad94f74..1f8553fc2d 100644 --- a/tests/qemuvhostusertest.c +++ b/tests/qemuvhostusertest.c @@ -60,6 +60,7 @@ testVUPrecedence(const void *opaque G_GNUC_UNUSED) const char *expected[] = { PREFIX "/share/qemu/vhost-user/30-gpu.json", SYSCONFDIR "/qemu/vhost-user/40-gpu.json", + PREFIX "/share/qemu/vhost-user/50-qemu-virtiofsd.json", PREFIX "/share/qemu/vhost-user/60-gpu.json", NULL }; -- 2.45.2

Now that we have a fake virtiofsd json descriptor in our vhost-user test data, we can remove the explicitly specified binary and our mocking will ensure this test won't be affected by the host state. Also remove the locking options, since they were never supported by the Rust version of virtiofsd. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- tests/qemuxmlconfdata/vhost-user-fs-fd-memory.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-memory.xml b/tests/qemuxmlconfdata/vhost-user-fs-fd-memory.xml index 1d0bc26c46..b0b1b44081 100644 --- a/tests/qemuxmlconfdata/vhost-user-fs-fd-memory.xml +++ b/tests/qemuxmlconfdata/vhost-user-fs-fd-memory.xml @@ -28,10 +28,9 @@ <controller type='pci' index='0' model='pci-root'/> <filesystem type='mount' accessmode='passthrough'> <driver type='virtiofs' queue='1024'/> - <binary path='/usr/libexec/virtiofsd' xattr='on'> + <binary xattr='on'> <cache mode='always'/> <sandbox mode='chroot'/> - <lock posix='off' flock='off'/> <thread_pool size='16'/> </binary> <idmap> -- 2.45.2

Run the daemon with --print-capabilities first, to see what it supports. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/conf/domain_conf.h | 1 + src/qemu/qemu_vhost_user.c | 60 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_vhost_user.h | 12 ++++++++ src/qemu/qemu_virtiofs.c | 9 ++++-- 4 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 2818a9f1f5..b3a0d26cde 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -899,6 +899,7 @@ struct _virDomainFSDef { virDomainIdMapDef idmap; virDomainVirtioOptions *virtio; virObject *privateData; + virBitmap *caps; }; diff --git a/src/qemu/qemu_vhost_user.c b/src/qemu/qemu_vhost_user.c index 0294daab80..30a60db528 100644 --- a/src/qemu/qemu_vhost_user.c +++ b/src/qemu/qemu_vhost_user.c @@ -22,6 +22,7 @@ #include "qemu_vhost_user.h" #include "qemu_interop_config.h" +#include "virbitmap.h" #include "virjson.h" #include "virlog.h" #include "viralloc.h" @@ -90,6 +91,12 @@ VIR_ENUM_IMPL(qemuVhostUserGPUFeature, "render-node", ); +VIR_ENUM_IMPL(qemuVhostUserFSFeature, + QEMU_VHOST_USER_FS_FEATURE_LAST, + "migrate-precopy", + "separate-options", +); + typedef struct _qemuVhostUserGPU qemuVhostUserGPU; struct _qemuVhostUserGPU { size_t nfeatures; @@ -414,6 +421,53 @@ qemuVhostUserFillDomainGPU(virQEMUDriver *driver, return ret; } +int +qemuVhostUserFillFSCapabilities(virBitmap **caps, + const char *binary, + bool reportError G_GNUC_UNUSED) +{ + g_autoptr(virJSONValue) doc = NULL; + g_autofree char *output = NULL; + g_autoptr(virCommand) cmd = NULL; + virJSONValue *featuresJSON; + size_t nfeatures; + size_t i; + g_autoptr(virBitmap) features = NULL; + + cmd = virCommandNewArgList(binary, "--print-capabilities", NULL); + virCommandSetOutputBuffer(cmd, &output); + if (virCommandRun(cmd, NULL) < 0) + return -2; + + if (!(doc = virJSONValueFromString(output))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to parse json capabilities '%1$s'"), + binary); + return -1; + } + + /* Older virtiofsd did not print any features */ + if (!(featuresJSON = virJSONValueObjectGetArray(doc, "features"))) + return 0; + + features = virBitmapNew(0); + nfeatures = virJSONValueArraySize(featuresJSON); + + for (i = 0; i < nfeatures; i++) { + virJSONValue *item = virJSONValueArrayGet(featuresJSON, i); + const char *tmpStr = virJSONValueGetString(item); + int tmp; + + if ((tmp = qemuVhostUserFSFeatureTypeFromString(tmpStr)) < 0) { + VIR_DEBUG("ignoring unknown virtiofs feature '%s'", tmpStr); + continue; + } + virBitmapSetBitExpand(features, tmp); + } + + *caps = g_steal_pointer(&features); + return 0; +} int qemuVhostUserFillDomainFS(virQEMUDriver *driver, @@ -435,6 +489,12 @@ qemuVhostUserFillDomainFS(virQEMUDriver *driver, continue; fs->binary = g_strdup(vu->binary); + + /* skip binaries that can't report their capabilities */ + if (qemuVhostUserFillFSCapabilities(&fs->caps, + vu->binary, + false) == -1) + continue; break; } diff --git a/src/qemu/qemu_vhost_user.h b/src/qemu/qemu_vhost_user.h index d1aa6ca189..f9cd549d5d 100644 --- a/src/qemu/qemu_vhost_user.h +++ b/src/qemu/qemu_vhost_user.h @@ -46,3 +46,15 @@ qemuVhostUserFillDomainGPU(virQEMUDriver *driver, int qemuVhostUserFillDomainFS(virQEMUDriver *driver, virDomainFSDef *fs); + +int +qemuVhostUserFillFSCapabilities(virBitmap **caps, + const char *binary, + bool reportError); +typedef enum { + QEMU_VHOST_USER_FS_FEATURE_MIGRATE_PRECOPY = 0, + QEMU_VHOST_USER_FS_FEATURE_SEPARATE_OPTIONS, + QEMU_VHOST_USER_FS_FEATURE_LAST +} qemuVhostUserFSFeature; + +VIR_ENUM_DECL(qemuVhostUserFSFeature); diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c index 78897d8177..aba6a19562 100644 --- a/src/qemu/qemu_virtiofs.c +++ b/src/qemu/qemu_virtiofs.c @@ -446,8 +446,13 @@ qemuVirtioFSPrepareDomain(virQEMUDriver *driver, if (fs->sock) return 0; - if (!fs->binary && qemuVhostUserFillDomainFS(driver, fs) < 0) - return -1; + if (fs->binary) { + if (qemuVhostUserFillFSCapabilities(&fs->caps, fs->binary, true) < 0) + return -1; + } else { + if (qemuVhostUserFillDomainFS(driver, fs) < 0) + return -1; + } if (!driver->privileged && !fs->idmap.uidmap) { if (qemuVirtioFSPrepareIdMap(fs) < 0) -- 2.45.2

On 7/4/24 15:54, Ján Tomko wrote:
Run the daemon with --print-capabilities first, to see what it supports.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/conf/domain_conf.h | 1 + src/qemu/qemu_vhost_user.c | 60 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_vhost_user.h | 12 ++++++++ src/qemu/qemu_virtiofs.c | 9 ++++-- 4 files changed, 80 insertions(+), 2 deletions(-)
Since I don't have /usr/libexec/virtiofsd on my system, then I'm seeing some tests failing after this.
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 2818a9f1f5..b3a0d26cde 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -899,6 +899,7 @@ struct _virDomainFSDef { virDomainIdMapDef idmap; virDomainVirtioOptions *virtio; virObject *privateData; + virBitmap *caps;
Surely this must be coupled with corresponding virBitmapFree() call in virDomainFSDefFree().
};
diff --git a/src/qemu/qemu_vhost_user.c b/src/qemu/qemu_vhost_user.c index 0294daab80..30a60db528 100644 --- a/src/qemu/qemu_vhost_user.c +++ b/src/qemu/qemu_vhost_user.c @@ -22,6 +22,7 @@
#include "qemu_vhost_user.h" #include "qemu_interop_config.h" +#include "virbitmap.h" #include "virjson.h" #include "virlog.h" #include "viralloc.h" @@ -90,6 +91,12 @@ VIR_ENUM_IMPL(qemuVhostUserGPUFeature, "render-node", );
+VIR_ENUM_IMPL(qemuVhostUserFSFeature, + QEMU_VHOST_USER_FS_FEATURE_LAST, + "migrate-precopy", + "separate-options", +); + typedef struct _qemuVhostUserGPU qemuVhostUserGPU; struct _qemuVhostUserGPU { size_t nfeatures; @@ -414,6 +421,53 @@ qemuVhostUserFillDomainGPU(virQEMUDriver *driver, return ret; }
+int +qemuVhostUserFillFSCapabilities(virBitmap **caps, + const char *binary, + bool reportError G_GNUC_UNUSED)
If it's unused then why introduce it at all?
+{ + g_autoptr(virJSONValue) doc = NULL; + g_autofree char *output = NULL; + g_autoptr(virCommand) cmd = NULL; + virJSONValue *featuresJSON; + size_t nfeatures; + size_t i; + g_autoptr(virBitmap) features = NULL; + + cmd = virCommandNewArgList(binary, "--print-capabilities", NULL); + virCommandSetOutputBuffer(cmd, &output); + if (virCommandRun(cmd, NULL) < 0) + return -2; + + if (!(doc = virJSONValueFromString(output))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to parse json capabilities '%1$s'"), + binary); + return -1; + } + + /* Older virtiofsd did not print any features */ + if (!(featuresJSON = virJSONValueObjectGetArray(doc, "features"))) + return 0; + + features = virBitmapNew(0); + nfeatures = virJSONValueArraySize(featuresJSON); + + for (i = 0; i < nfeatures; i++) { + virJSONValue *item = virJSONValueArrayGet(featuresJSON, i); + const char *tmpStr = virJSONValueGetString(item); + int tmp; + + if ((tmp = qemuVhostUserFSFeatureTypeFromString(tmpStr)) < 0) { + VIR_DEBUG("ignoring unknown virtiofs feature '%s'", tmpStr); + continue; + } + virBitmapSetBitExpand(features, tmp); + } + + *caps = g_steal_pointer(&features); + return 0; +}
Squash this in please: diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bfef89e1be..abc8e4ed66 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2600,6 +2600,7 @@ void virDomainFSDefFree(virDomainFSDef *def) g_free(def->sock); g_free(def->idmap.uidmap); g_free(def->idmap.gidmap); + virBitmapFree(def->caps); g_free(def); } diff --git a/src/qemu/qemu_vhost_user.c b/src/qemu/qemu_vhost_user.c index 30a60db528..de3ef640a3 100644 --- a/src/qemu/qemu_vhost_user.c +++ b/src/qemu/qemu_vhost_user.c @@ -423,8 +423,7 @@ qemuVhostUserFillDomainGPU(virQEMUDriver *driver, int qemuVhostUserFillFSCapabilities(virBitmap **caps, - const char *binary, - bool reportError G_GNUC_UNUSED) + const char *binary) { g_autoptr(virJSONValue) doc = NULL; g_autofree char *output = NULL; @@ -492,8 +491,7 @@ qemuVhostUserFillDomainFS(virQEMUDriver *driver, /* skip binaries that can't report their capabilities */ if (qemuVhostUserFillFSCapabilities(&fs->caps, - vu->binary, - false) == -1) + vu->binary) == -1) continue; break; } diff --git a/src/qemu/qemu_vhost_user.h b/src/qemu/qemu_vhost_user.h index f9cd549d5d..c39fbfebe8 100644 --- a/src/qemu/qemu_vhost_user.h +++ b/src/qemu/qemu_vhost_user.h @@ -49,8 +49,7 @@ qemuVhostUserFillDomainFS(virQEMUDriver *driver, int qemuVhostUserFillFSCapabilities(virBitmap **caps, - const char *binary, - bool reportError); + const char *binary); typedef enum { QEMU_VHOST_USER_FS_FEATURE_MIGRATE_PRECOPY = 0, QEMU_VHOST_USER_FS_FEATURE_SEPARATE_OPTIONS, diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c index aba6a19562..0df8d67b1b 100644 --- a/src/qemu/qemu_virtiofs.c +++ b/src/qemu/qemu_virtiofs.c @@ -447,7 +447,7 @@ qemuVirtioFSPrepareDomain(virQEMUDriver *driver, return 0; if (fs->binary) { - if (qemuVhostUserFillFSCapabilities(&fs->caps, fs->binary, true) < 0) + if (qemuVhostUserFillFSCapabilities(&fs->caps, fs->binary) < 0) return -1; } else { if (qemuVhostUserFillDomainFS(driver, fs) < 0) diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 4f2966109d..389d31800b 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -1076,6 +1076,8 @@ mymain(void) virFileWrapperAddPrefix("/usr/libexec/qemu/vhost-user", abs_srcdir "/qemuvhostuserdata/usr/libexec/qemu/vhost-user"); + virFileWrapperAddPrefix("/usr/libexec/virtiofsd", + abs_srcdir "/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd"); if (!(conn = virGetConnect())) return EXIT_FAILURE;

Use the to-be-introduced virtiofsd capability to mark whether new options are safe to use. Depends on: https://gitlab.com/virtio-fs/virtiofsd/-/merge_requests/231 https://issues.redhat.com/browse/RHEL-7108 Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_virtiofs.c | 83 +++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c index aba6a19562..2271051b9a 100644 --- a/src/qemu/qemu_virtiofs.c +++ b/src/qemu/qemu_virtiofs.c @@ -139,36 +139,67 @@ qemuVirtioFSBuildCommandLine(virQEMUDriverConfig *cfg, virCommandPassFD(cmd, *fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); *fd = -1; - virCommandAddArg(cmd, "-o"); - virBufferAddLit(&opts, "source="); - virQEMUBuildBufferEscapeComma(&opts, fs->src->path); - if (fs->cache) - virBufferAsprintf(&opts, ",cache=%s", virDomainFSCacheModeTypeToString(fs->cache)); - if (fs->sandbox) - virBufferAsprintf(&opts, ",sandbox=%s", virDomainFSSandboxModeTypeToString(fs->sandbox)); - - if (fs->xattr == VIR_TRISTATE_SWITCH_ON) - virBufferAddLit(&opts, ",xattr"); - else if (fs->xattr == VIR_TRISTATE_SWITCH_OFF) - virBufferAddLit(&opts, ",no_xattr"); - - if (fs->flock == VIR_TRISTATE_SWITCH_ON) - virBufferAddLit(&opts, ",flock"); - else if (fs->flock == VIR_TRISTATE_SWITCH_OFF) - virBufferAddLit(&opts, ",no_flock"); - - if (fs->posix_lock == VIR_TRISTATE_SWITCH_ON) - virBufferAddLit(&opts, ",posix_lock"); - else if (fs->posix_lock == VIR_TRISTATE_SWITCH_OFF) - virBufferAddLit(&opts, ",no_posix_lock"); - - virCommandAddArgBuffer(cmd, &opts); + if (virBitmapIsBitSet(fs->caps, QEMU_VHOST_USER_FS_FEATURE_SEPARATE_OPTIONS)) { + /* Note that this option format is used by the Rust version of the daemon + * since v1.0.0, which is way longer than the capability existed. + * The -o style of options can be removed once we bump the minimal + * QEMU version to 8.0.0, which dropped the C virtiofsd daemon */ + virCommandAddArg(cmd, "--shared-dir"); + virCommandAddArg(cmd, fs->src->path); + + if (fs->cache) { + virCommandAddArg(cmd, "--cache"); + virCommandAddArg(cmd, virDomainFSCacheModeTypeToString(fs->cache)); + } + if (fs->sandbox) { + virCommandAddArg(cmd, "--sandbox"); + virCommandAddArg(cmd, virDomainFSSandboxModeTypeToString(fs->sandbox)); + } + + if (fs->xattr == VIR_TRISTATE_SWITCH_ON) + virCommandAddArg(cmd, "--xattr"); + + if (fs->posix_lock != VIR_TRISTATE_SWITCH_ABSENT || + fs->flock != VIR_TRISTATE_SWITCH_ABSENT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("locking options are not supported by this virtiofsd")); + return NULL; + } + } else { + virCommandAddArg(cmd, "-o"); + virBufferAddLit(&opts, "source="); + virQEMUBuildBufferEscapeComma(&opts, fs->src->path); + if (fs->cache) + virBufferAsprintf(&opts, ",cache=%s", virDomainFSCacheModeTypeToString(fs->cache)); + if (fs->sandbox) + virBufferAsprintf(&opts, ",sandbox=%s", virDomainFSSandboxModeTypeToString(fs->sandbox)); + + if (fs->xattr == VIR_TRISTATE_SWITCH_ON) + virBufferAddLit(&opts, ",xattr"); + else if (fs->xattr == VIR_TRISTATE_SWITCH_OFF) + virBufferAddLit(&opts, ",no_xattr"); + + if (fs->flock == VIR_TRISTATE_SWITCH_ON) + virBufferAddLit(&opts, ",flock"); + else if (fs->flock == VIR_TRISTATE_SWITCH_OFF) + virBufferAddLit(&opts, ",no_flock"); + + if (fs->posix_lock == VIR_TRISTATE_SWITCH_ON) + virBufferAddLit(&opts, ",posix_lock"); + else if (fs->posix_lock == VIR_TRISTATE_SWITCH_OFF) + virBufferAddLit(&opts, ",no_posix_lock"); + + virCommandAddArgBuffer(cmd, &opts); + } if (fs->thread_pool_size >= 0) virCommandAddArgFormat(cmd, "--thread-pool-size=%i", fs->thread_pool_size); - if (cfg->virtiofsdDebug) - virCommandAddArg(cmd, "-d"); + if (cfg->virtiofsdDebug) { + if (virBitmapIsBitSet(fs->caps, QEMU_VHOST_USER_FS_FEATURE_SEPARATE_OPTIONS)) + virCommandAddArgList(cmd, "--log-level", "debug", NULL); + else + virCommandAddArg(cmd, "-d"); + } for (i = 0; i < fs->idmap.nuidmap; i++) { virCommandAddArgFormat(cmd, "--uid-map=:%u:%u:%u:", -- 2.45.2

Allow migration if the "migrate-precopy" capability is present or libvirt is not the one running the virtiofs daemon. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_migration.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 26c082fc08..4fd7a0aafb 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -39,6 +39,7 @@ #include "qemu_slirp.h" #include "qemu_block.h" #include "qemu_tpm.h" +#include "qemu_vhost_user.h" #include "domain_audit.h" #include "virlog.h" @@ -1576,8 +1577,12 @@ qemuMigrationSrcIsAllowed(virDomainObj *vm, virDomainFSDef *fs = vm->def->fss[i]; if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("migration with virtiofs device is not supported")); + if (fs->sock || + virBitmapIsBitSet(fs->caps, QEMU_VHOST_USER_FS_FEATURE_MIGRATE_PRECOPY)) + continue; + + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("migration with this virtiofs device is not supported")); return false; } } -- 2.45.2

On 7/4/24 15:54, Ján Tomko wrote:
Also, allow migration if we think we can.
Ján Tomko (5): tests: vhostuser: add virtiofsd json descriptor tests: qemuxmlconf: adjust test case to new virtiofsd qemu: fill capabilities for virtiofsd qemu: do not use deprecated options for new virtiofsd qemu: migration: allow migration for virtiofs
src/conf/domain_conf.h | 1 + src/qemu/qemu_migration.c | 9 +- src/qemu/qemu_vhost_user.c | 60 ++++++++++++ src/qemu/qemu_vhost_user.h | 12 +++ src/qemu/qemu_virtiofs.c | 92 +++++++++++++------ .../libexec/qemu/vhost-user/test-virtiofsd | 10 ++ .../qemu/vhost-user/50-qemu-virtiofsd.json | 5 + tests/qemuvhostusertest.c | 1 + .../vhost-user-fs-fd-memory.xml | 3 +- 9 files changed, 161 insertions(+), 32 deletions(-) create mode 100755 tests/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd create mode 100644 tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Ján Tomko
-
Michal Prívozník