a41c76
From eb7fe047e08a536a6c888e61fbe5b149ecb6ce6a Mon Sep 17 00:00:00 2001
a41c76
Message-Id: <eb7fe047e08a536a6c888e61fbe5b149ecb6ce6a@dist-git>
a41c76
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
a41c76
Date: Wed, 4 Mar 2020 12:42:49 +0100
a41c76
Subject: [PATCH] qemu: build vhost-user-fs device command line
a41c76
MIME-Version: 1.0
a41c76
Content-Type: text/plain; charset=UTF-8
a41c76
Content-Transfer-Encoding: 8bit
a41c76
a41c76
Format the 'vhost-user-fs' device on the QEMU command line.
a41c76
a41c76
This device provides shared file system access using the FUSE protocol
a41c76
carried over virtio.
a41c76
The actual file server is implemented in an external vhost-user-fs device
a41c76
backend process.
a41c76
a41c76
https://bugzilla.redhat.com/show_bug.cgi?id=1694166
a41c76
a41c76
Signed-off-by: Ján Tomko <jtomko@redhat.com>
a41c76
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
a41c76
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
a41c76
Tested-by: Andrea Bolognani <abologna@redhat.com>
a41c76
(cherry picked from commit 0627150a56fd53841918d558d8466feceb18552a)
a41c76
Signed-off-by: Ján Tomko <jtomko@redhat.com>
a41c76
https://bugzilla.redhat.com/show_bug.cgi?id=1694166
a41c76
Message-Id: <2df3adbe3991cb97a06707e818c30dfcb1f6de26.1583322091.git.jtomko@redhat.com>
a41c76
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
a41c76
---
a41c76
 src/qemu/qemu_command.c                       | 46 +++++++++++++++++-
a41c76
 ...vhost-user-fs-fd-memory.x86_64-latest.args | 39 +++++++++++++++
a41c76
 ...vhost-user-fs-hugepages.x86_64-latest.args | 47 +++++++++++++++++++
a41c76
 tests/qemuxml2argvtest.c                      |  3 ++
a41c76
 4 files changed, 133 insertions(+), 2 deletions(-)
a41c76
 create mode 100644 tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args
a41c76
 create mode 100644 tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args
a41c76
a41c76
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
a41c76
index 7fdf58f067..fc5366d88d 100644
a41c76
--- a/src/qemu/qemu_command.c
a41c76
+++ b/src/qemu/qemu_command.c
a41c76
@@ -2589,6 +2589,46 @@ qemuBuildDisksCommandLine(virCommandPtr cmd,
a41c76
 }
a41c76
 
a41c76
 
a41c76
+static int
a41c76
+qemuBuildVHostUserFsCommandLine(virCommandPtr cmd,
a41c76
+                                virDomainFSDef *fs,
a41c76
+                                const virDomainDef *def,
a41c76
+                                qemuDomainObjPrivatePtr priv)
a41c76
+{
a41c76
+    g_autofree char *chardev_alias = NULL;
a41c76
+    g_auto(virBuffer) opt = VIR_BUFFER_INITIALIZER;
a41c76
+
a41c76
+    chardev_alias = g_strdup_printf("chr-vu-%s", fs->info.alias);
a41c76
+
a41c76
+    virCommandAddArg(cmd, "-chardev");
a41c76
+    virBufferAddLit(&opt, "socket");
a41c76
+    virBufferAsprintf(&opt, ",id=%s", chardev_alias);
a41c76
+    virBufferAddLit(&opt, ",path=");
a41c76
+    virQEMUBuildBufferEscapeComma(&opt, QEMU_DOMAIN_FS_PRIVATE(fs)->vhostuser_fs_sock);
a41c76
+    virCommandAddArgBuffer(cmd, &opt;;
a41c76
+
a41c76
+    virCommandAddArg(cmd, "-device");
a41c76
+
a41c76
+    if (qemuBuildVirtioDevStr(&opt, "vhost-user-fs", priv->qemuCaps,
a41c76
+                              VIR_DOMAIN_DEVICE_FS, fs) < 0)
a41c76
+        return -1;
a41c76
+
a41c76
+    virBufferAsprintf(&opt, ",chardev=%s", chardev_alias);
a41c76
+    if (fs->queue_size)
a41c76
+        virBufferAsprintf(&opt, ",queue-size=%llu", fs->queue_size);
a41c76
+    virBufferAddLit(&opt, ",tag=");
a41c76
+    virQEMUBuildBufferEscapeComma(&opt, fs->dst);
a41c76
+    if (qemuBuildVirtioOptionsStr(&opt, fs->virtio, priv->qemuCaps) < 0)
a41c76
+        return -1;
a41c76
+
a41c76
+    if (qemuBuildDeviceAddressStr(&opt, def, &fs->info, priv->qemuCaps) < 0)
a41c76
+        return -1;
a41c76
+
a41c76
+    virCommandAddArgBuffer(cmd, &opt;;
a41c76
+    return 0;
a41c76
+}
a41c76
+
a41c76
+
a41c76
 static char *
a41c76
 qemuBuildFSStr(virDomainFSDefPtr fs)
a41c76
 {
a41c76
@@ -2681,7 +2721,7 @@ static int
a41c76
 qemuBuildFilesystemCommandLine(virCommandPtr cmd,
a41c76
                                const virDomainDef *def,
a41c76
                                virQEMUCapsPtr qemuCaps,
a41c76
-                               qemuDomainObjPrivatePtr priv G_GNUC_UNUSED)
a41c76
+                               qemuDomainObjPrivatePtr priv)
a41c76
 {
a41c76
     size_t i;
a41c76
 
a41c76
@@ -2696,7 +2736,9 @@ qemuBuildFilesystemCommandLine(virCommandPtr cmd,
a41c76
             break;
a41c76
 
a41c76
         case VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS:
a41c76
-            /* TODO: vhost-user-fs-pci */
a41c76
+            /* vhost-user-fs-pci */
a41c76
+            if (qemuBuildVHostUserFsCommandLine(cmd, def->fss[i], def, priv) < 0)
a41c76
+                return -1;
a41c76
             break;
a41c76
 
a41c76
         case VIR_DOMAIN_FS_DRIVER_TYPE_LOOP:
a41c76
diff --git a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args
a41c76
new file mode 100644
a41c76
index 0000000000..a7df45a7f0
a41c76
--- /dev/null
a41c76
+++ b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.x86_64-latest.args
a41c76
@@ -0,0 +1,39 @@
a41c76
+LC_ALL=C \
a41c76
+PATH=/bin \
a41c76
+HOME=/tmp/lib/domain--1-guest \
a41c76
+USER=test \
a41c76
+LOGNAME=test \
a41c76
+XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \
a41c76
+XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \
a41c76
+XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
a41c76
+QEMU_AUDIO_DRV=none \
a41c76
+/usr/bin/qemu-system-x86_64 \
a41c76
+-name guest=guest,debug-threads=on \
a41c76
+-S \
a41c76
+-object secret,id=masterKey0,format=raw,\
a41c76
+file=/tmp/lib/domain--1-guest/master-key.aes \
a41c76
+-machine pc,accel=kvm,usb=off,dump-guest-core=off \
a41c76
+-cpu qemu64 \
a41c76
+-m 14336 \
a41c76
+-overcommit mem-lock=off \
a41c76
+-smp 2,sockets=2,cores=1,threads=1 \
a41c76
+-object memory-backend-file,id=ram-node0,\
a41c76
+mem-path=/var/lib/libvirt/qemu/ram/libvirt/qemu/-1-guest/ram-node0,share=yes,\
a41c76
+size=15032385536 \
a41c76
+-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
a41c76
+-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
a41c76
+-display none \
a41c76
+-no-user-config \
a41c76
+-nodefaults \
a41c76
+-chardev socket,id=charmonitor,fd=1729,server,nowait \
a41c76
+-mon chardev=charmonitor,id=monitor,mode=control \
a41c76
+-rtc base=utc \
a41c76
+-no-shutdown \
a41c76
+-no-acpi \
a41c76
+-boot strict=on \
a41c76
+-chardev socket,id=chr-vu-fs0,path=/tmp/lib/domain--1-guest/fs0.vhost-fs.sock \
a41c76
+-device vhost-user-fs-pci,chardev=chr-vu-fs0,queue-size=1024,tag=mount_tag,\
a41c76
+bus=pci.0,addr=0x2 \
a41c76
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
a41c76
+resourcecontrol=deny \
a41c76
+-msg timestamp=on
a41c76
diff --git a/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args
a41c76
new file mode 100644
a41c76
index 0000000000..39190b8d3e
a41c76
--- /dev/null
a41c76
+++ b/tests/qemuxml2argvdata/vhost-user-fs-hugepages.x86_64-latest.args
a41c76
@@ -0,0 +1,47 @@
a41c76
+LC_ALL=C \
a41c76
+PATH=/bin \
a41c76
+HOME=/tmp/lib/domain--1-guest \
a41c76
+USER=test \
a41c76
+LOGNAME=test \
a41c76
+XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \
a41c76
+XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \
a41c76
+XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \
a41c76
+QEMU_AUDIO_DRV=none \
a41c76
+/usr/bin/qemu-system-x86_64 \
a41c76
+-name guest=guest,debug-threads=on \
a41c76
+-S \
a41c76
+-object secret,id=masterKey0,format=raw,\
a41c76
+file=/tmp/lib/domain--1-guest/master-key.aes \
a41c76
+-machine q35,accel=tcg,usb=off,dump-guest-core=off \
a41c76
+-cpu qemu64 \
a41c76
+-m 2048 \
a41c76
+-overcommit mem-lock=off \
a41c76
+-smp 2,sockets=2,cores=1,threads=1 \
a41c76
+-object memory-backend-file,id=ram-node0,prealloc=yes,\
a41c76
+mem-path=/dev/hugepages2M/libvirt/qemu/-1-guest,share=yes,size=2147483648 \
a41c76
+-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
a41c76
+-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
a41c76
+-display none \
a41c76
+-no-user-config \
a41c76
+-nodefaults \
a41c76
+-chardev socket,id=charmonitor,fd=1729,server,nowait \
a41c76
+-mon chardev=charmonitor,id=monitor,mode=control \
a41c76
+-rtc base=utc \
a41c76
+-no-shutdown \
a41c76
+-boot strict=on \
a41c76
+-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\
a41c76
+addr=0x1 \
a41c76
+-device pcie-root-port,port=0x9,chassis=2,id=pci.2,bus=pcie.0,addr=0x1.0x1 \
a41c76
+-device pcie-root-port,port=0xa,chassis=3,id=pci.3,bus=pcie.0,addr=0x1.0x2 \
a41c76
+-device pcie-root-port,port=0xb,chassis=4,id=pci.4,bus=pcie.0,addr=0x1.0x3 \
a41c76
+-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/guest.qcow2",\
a41c76
+"node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
a41c76
+-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"qcow2",\
a41c76
+"file":"libvirt-1-storage"}' \
a41c76
+-device virtio-blk-pci,scsi=off,bus=pci.4,addr=0x0,drive=libvirt-1-format,\
a41c76
+id=virtio-disk0,bootindex=1 \
a41c76
+-chardev socket,id=chr-vu-fs0,path=/tmp/lib/domain--1-guest/fs0.vhost-fs.sock \
a41c76
+-device vhost-user-fs-pci,chardev=chr-vu-fs0,tag=mount_tag,bus=pci.1,addr=0x0 \
a41c76
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
a41c76
+resourcecontrol=deny \
a41c76
+-msg timestamp=on
a41c76
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
a41c76
index a391823090..265ffce465 100644
a41c76
--- a/tests/qemuxml2argvtest.c
a41c76
+++ b/tests/qemuxml2argvtest.c
a41c76
@@ -3053,6 +3053,9 @@ mymain(void)
a41c76
 
a41c76
     DO_TEST_CAPS_VER("launch-security-sev", "2.12.0");
a41c76
 
a41c76
+    DO_TEST_CAPS_LATEST("vhost-user-fs-fd-memory");
a41c76
+    DO_TEST_CAPS_LATEST("vhost-user-fs-hugepages");
a41c76
+
a41c76
     DO_TEST("riscv64-virt",
a41c76
             QEMU_CAPS_DEVICE_VIRTIO_MMIO);
a41c76
     DO_TEST("riscv64-virt-pci",
a41c76
-- 
a41c76
2.25.1
a41c76