From 2d6d67e1544a8a86249a1e958e1829b41bf84cde Mon Sep 17 00:00:00 2001 From: Hiroki Narukawa Date: Thu, 9 Sep 2021 12:34:48 +0900 Subject: [PATCH] qemu: Implement virtio-blk queue-size option The option "queue-size" in virtio-blk was added in qemu-2.12.0, and default value increased from qemu-5.0.0. However, increasing this value may lead to drop of random access performance. Signed-off-by: Hiroki Narukawa Reviewed-by: Peter Krempa --- src/qemu/qemu_command.c | 3 +++ src/qemu/qemu_validate.c | 6 ++++++ .../disk-virtio-queues.x86_64-latest.args | 10 ++++++++-- tests/qemuxml2argvdata/disk-virtio-queues.xml | 12 ++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 73868ab4b7..95f0a26564 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1738,6 +1738,9 @@ qemuBuildDiskDeviceStr(const virDomainDef *def, if (disk->queues) { virBufferAsprintf(&opt, ",num-queues=%u", disk->queues); } + if (disk->queue_size > 0) { + virBufferAsprintf(&opt, ",queue-size=%u", disk->queue_size); + } qemuBuildVirtioOptionsStr(&opt, disk->virtio); diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 6b685881a8..6b1a0f6c02 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2826,6 +2826,12 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, "QEMU binary")); return -1; } + if (disk->queue_size > 0 && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("queue-size property isn't supported by this QEMU binary")); + return -1; + } break; case VIR_DOMAIN_DISK_BUS_USB: diff --git a/tests/qemuxml2argvdata/disk-virtio-queues.x86_64-latest.args b/tests/qemuxml2argvdata/disk-virtio-queues.x86_64-latest.args index 6637088a35..b1ff6de857 100644 --- a/tests/qemuxml2argvdata/disk-virtio-queues.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-virtio-queues.x86_64-latest.args @@ -27,9 +27,15 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ -no-acpi \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ --blockdev '{"driver":"file","filename":"/tmp/data.img","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"driver":"file","filename":"/tmp/data.img","node-name":"libvirt-3-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw","file":"libvirt-3-storage"}' \ +-device virtio-blk-pci,num-queues=4,bus=pci.0,addr=0x3,drive=libvirt-3-format,id=virtio-disk0,bootindex=1 \ +-blockdev '{"driver":"file","filename":"/tmp/data1.img","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw","file":"libvirt-2-storage"}' \ +-device virtio-blk-pci,queue-size=256,bus=pci.0,addr=0x4,drive=libvirt-2-format,id=virtio-disk1 \ +-blockdev '{"driver":"file","filename":"/tmp/data2.img","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ -blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \ --device virtio-blk-pci,num-queues=4,bus=pci.0,addr=0x3,drive=libvirt-1-format,id=virtio-disk0,bootindex=1 \ +-device virtio-blk-pci,num-queues=4,queue-size=256,bus=pci.0,addr=0x5,drive=libvirt-1-format,id=virtio-disk2 \ -audiodev id=audio1,driver=none \ -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ -msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-virtio-queues.xml b/tests/qemuxml2argvdata/disk-virtio-queues.xml index ea1001bdd4..3cfa958c97 100644 --- a/tests/qemuxml2argvdata/disk-virtio-queues.xml +++ b/tests/qemuxml2argvdata/disk-virtio-queues.xml @@ -23,6 +23,18 @@
+ + + + +
+ + + + + +
+