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