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