]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: fill capabilities for virtiofsd
authorJán Tomko <jtomko@redhat.com>
Thu, 4 Jul 2024 13:54:28 +0000 (15:54 +0200)
committerJán Tomko <jtomko@redhat.com>
Wed, 10 Jul 2024 10:32:23 +0000 (12:32 +0200)
Run the daemon with --print-capabilities first, to see what it supports.

Signed-off-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_vhost_user.c
src/qemu/qemu_vhost_user.h
src/qemu/qemu_virtiofs.c
tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json
tests/qemuxmlconftest.c

index eef3629a2d6e403a2e99e7f7645e6d02e20cd09e..32df908d9512fb5e502730e1035b14c8215f81f5 100644 (file)
@@ -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);
 }
index 1b9d07f1a426b3ab2e7fddab109f186c5ea6e1b5..0fcc4f1f9b61341fdba959718f9f869d08265dea 100644 (file)
@@ -899,6 +899,7 @@ struct _virDomainFSDef {
     virDomainIdMapDef idmap;
     virDomainVirtioOptions *virtio;
     virObject *privateData;
+    virBitmap *caps;
 };
 
 
index 0294daab80e638a4a4a62fc22ee17b9eb556f7fe..de3ef640a3527bc2c4f93515834e4d165f455bc2 100644 (file)
@@ -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,52 @@ qemuVhostUserFillDomainGPU(virQEMUDriver *driver,
     return ret;
 }
 
+int
+qemuVhostUserFillFSCapabilities(virBitmap **caps,
+                                const char *binary)
+{
+    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 +488,11 @@ qemuVhostUserFillDomainFS(virQEMUDriver *driver,
             continue;
 
         fs->binary = g_strdup(vu->binary);
+
+        /* skip binaries that can't report their capabilities */
+        if (qemuVhostUserFillFSCapabilities(&fs->caps,
+                                            vu->binary) == -1)
+            continue;
         break;
     }
 
index d1aa6ca189f3c18aef9cae50ce29b28c0c1eea09..c39fbfebe835e39e6867f1c16940c928b4900d01 100644 (file)
@@ -46,3 +46,14 @@ qemuVhostUserFillDomainGPU(virQEMUDriver *driver,
 int
 qemuVhostUserFillDomainFS(virQEMUDriver *driver,
                           virDomainFSDef *fs);
+
+int
+qemuVhostUserFillFSCapabilities(virBitmap **caps,
+                                const char *binary);
+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);
index 78897d81778b09cc1b1f67cfe8db44c2aa28d2e4..0df8d67b1beff7b36d3b6673e533ee2168ba5882 100644 (file)
@@ -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) < 0)
+            return -1;
+    } else {
+        if (qemuVhostUserFillDomainFS(driver, fs) < 0)
+            return -1;
+    }
 
     if (!driver->privileged && !fs->idmap.uidmap) {
         if (qemuVirtioFSPrepareIdMap(fs) < 0)
index b908bc6b30a01bf406d50fd0247f81eb6687f35f..5cf2c986f8aa4e8bea2fb07e861a79a6151fb2bf 100644 (file)
@@ -1,5 +1,5 @@
 {
   "description": "virtiofsd vhost-user-fs",
   "type": "fs",
-  "binary": "/usr/libexec/qemu/vhost-user/test-vhost-user-gpu"
+  "binary": "/usr/libexec/qemu/vhost-user/test-virtiofsd"
 }
index 4f2966109d8da59d49e9cdceb4ca885e3c06943c..389d31800b07f7cee56737b42fa7b23743a0274c 100644 (file)
@@ -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;