[libvirt] [PATCH 2/2] qemu: add capability checking for qcow2 cache configuration
John Ferlan
jferlan at redhat.com
Tue Sep 12 21:23:00 UTC 2017
On 09/07/2017 02:09 AM, Liu Qing wrote:
> Add qemu capabilities QEMU_CAPS_L2_CACHE_SIZE,
> QEMU_CAPS_REFCOUNT_CACHE_SIZE, QEMU_CAPS_CACHE_CLEAN_INTERVAL.
> Add testing for the above qemu capabilities.
>
> Signed-off-by: Liu Qing <liuqing at huayun.com>
> ---
>
> Patch 2 - a) use QMP instead of qemu version to identify qemu capabilities.
> b) change capablity names with prefix drive.qcow2.
> c) merge the three test cases to one.
>
> src/qemu/qemu_capabilities.c | 9 +++++
> src/qemu/qemu_capabilities.h | 3 ++
> src/qemu/qemu_command.c | 39 ++++++++++++++++++----
> tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml | 3 ++
> .../caps_2.6.0-gicv2.aarch64.xml | 3 ++
> .../caps_2.6.0-gicv3.aarch64.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml | 3 ++
> tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 3 ++
> .../qemuxml2argv-disk-drive-qcow2-cache.args | 28 ++++++++++++++++
> tests/qemuxml2argvtest.c | 4 +++
> 17 files changed, 113 insertions(+), 6 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-qcow2-cache.args
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index e7ea6f4..e8cce38 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -439,6 +439,9 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
> "virtio-net.tx_queue_size",
> "chardev-reconnect",
> "virtio-gpu.max_outputs",
The format of the data has every 5th element counted, so this needs
before the following:
/* 270 */
> + "drive.qcow2.l2-cache-size",
> + "drive.qcow2.refcount-cache-size",
> + "drive.qcow2.cache-clean-interval",
> );
>
>
> @@ -1811,6 +1814,12 @@ static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsIntelIOMMU[] = {
> static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = {
> { "blockdev-add/arg-type/options/+gluster/debug-level", QEMU_CAPS_GLUSTER_DEBUG_LEVEL},
> { "blockdev-add/arg-type/+gluster/debug", QEMU_CAPS_GLUSTER_DEBUG_LEVEL},
> + { "blockdev-add/arg-type/options/+qcow2/l2-cache-size", QEMU_CAPS_DRIVE_QCOW2_L2_CACHE_SIZE},
> + { "blockdev-add/arg-type/options/+qcow2/refcount-cache-size", QEMU_CAPS_DRIVE_QCOW2_REFCOUNT_CACHE_SIZE},
> + { "blockdev-add/arg-type/options/+qcow2/cache-clean-interval", QEMU_CAPS_DRIVE_QCOW2_CACHE_CLEAN_INTERVAL},
> + { "blockdev-add/arg-type/+qcow2/l2-cache-size", QEMU_CAPS_DRIVE_QCOW2_L2_CACHE_SIZE},
> + { "blockdev-add/arg-type/+qcow2/refcount-cache-size", QEMU_CAPS_DRIVE_QCOW2_REFCOUNT_CACHE_SIZE},
> + { "blockdev-add/arg-type/+qcow2/cache-clean-interval", QEMU_CAPS_DRIVE_QCOW2_CACHE_CLEAN_INTERVAL},
Ugh! I see the first 3 are necessary because of qemu changes similar to
the +gluster debug setting, yuck. At least for that one, the argument
appears to have changed name as well... Seems qemu 2.8 is the magic
inflection point, though.
> };
>
> struct virQEMUCapsObjectTypeProps {
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index f32687d..81fb759 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -425,6 +425,9 @@ typedef enum {
> QEMU_CAPS_VIRTIO_NET_TX_QUEUE_SIZE, /* virtio-net-*.tx_queue_size */
> QEMU_CAPS_CHARDEV_RECONNECT, /* -chardev reconnect */
> QEMU_CAPS_VIRTIO_GPU_MAX_OUTPUTS, /* -device virtio-(vga|gpu-*),max-outputs= */
Similar formatting comment add before the following group:
/* 270 */
Similar to patch1, I don't mind making the changes here. Especially
since I already know I have some conflicts queued up in other patches on
list that I'm trying to get reviewed/ACK'd.
Secondarily, perhaps others may have comments about the new format and
I'd rather see them addressed now rather than after pushing...
John
> + QEMU_CAPS_DRIVE_QCOW2_L2_CACHE_SIZE, /* -drive support qcow2 l2 cache size */
> + QEMU_CAPS_DRIVE_QCOW2_REFCOUNT_CACHE_SIZE, /* -drive support qcow2 refcount cache size */
> + QEMU_CAPS_DRIVE_QCOW2_CACHE_CLEAN_INTERVAL, /* -drive qcow2 cache clean interval */
>
> QEMU_CAPS_LAST /* this must always be the last item */
> } virQEMUCapsFlags;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 391aaba..e2592e0 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1433,12 +1433,39 @@ qemuBuildDriveSourceStr(virDomainDiskDefPtr disk,
> qemuformat = "luks";
> virBufferAsprintf(buf, "format=%s,", qemuformat);
> }
> - if (disk->src->l2_cache_size > 0)
> - virBufferAsprintf(buf, "l2-cache-size=%llu,", disk->src->l2_cache_size);
> - if (disk->src->refcount_cache_size > 0)
> - virBufferAsprintf(buf, "refcount-cache-size=%llu,", disk->src->refcount_cache_size);
> - if (disk->src->cache_clean_interval > 0)
> - virBufferAsprintf(buf, "cache-clean-interval=%llu,", disk->src->cache_clean_interval);
> +
> + if (disk->src->l2_cache_size > 0) {
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_QCOW2_L2_CACHE_SIZE)) {
> + virBufferAsprintf(buf, "l2-cache-size=%llu,",
> + disk->src->l2_cache_size);
> + } else {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("l2-cache-size is not supported by this QEMU"));
> + goto cleanup;
> + }
> + }
> +
> + if (disk->src->refcount_cache_size > 0) {
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_QCOW2_REFCOUNT_CACHE_SIZE)) {
> + virBufferAsprintf(buf, "refcount-cache-size=%llu,",
> + disk->src->refcount_cache_size);
> + } else {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("refcount-cache-size is not supported by this QEMU"));
> + goto cleanup;
> + }
> + }
> +
> + if (disk->src->cache_clean_interval > 0) {
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_QCOW2_CACHE_CLEAN_INTERVAL)) {
> + virBufferAsprintf(buf, "cache-clean-interval=%llu,",
> + disk->src->cache_clean_interval);
> + } else {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("cache-clean-interval is not supported by this QEMU"));
> + goto cleanup;
> + }
> + }
>
> ret = 0;
>
> diff --git a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
> index 2ba40fc..2ccaca8 100644
> --- a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
> @@ -194,6 +194,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2005000</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
> index 0b34fa3..2438de2 100644
> --- a/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
> @@ -172,6 +172,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2006000</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
> index d41d578..b677d40 100644
> --- a/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
> @@ -172,6 +172,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2006000</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
> index f1c9fc9..a680b62 100644
> --- a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
> @@ -167,6 +167,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2006000</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
> index bdf006f..0ebf8a2 100644
> --- a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
> @@ -204,6 +204,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2006000</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
> index fe7bca9..44bc54c 100644
> --- a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
> @@ -134,6 +134,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2007000</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
> index 3fd28f0..3b6c1ed 100644
> --- a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
> @@ -207,6 +207,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2007000</version>
> <kvmVersion>0</kvmVersion>
> <package> (v2.7.0)</package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
> index 21bbb82..85f39fb 100644
> --- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
> @@ -136,6 +136,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2007093</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
> index 761f9d1..d673891 100644
> --- a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
> @@ -209,6 +209,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2008000</version>
> <kvmVersion>0</kvmVersion>
> <package> (v2.8.0)</package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml
> index a373a6d..b093244 100644
> --- a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64le.xml
> @@ -172,6 +172,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2009000</version>
> <kvmVersion>0</kvmVersion>
> <package> (v2.9.0)</package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml
> index e80782c..beba716 100644
> --- a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml
> @@ -137,6 +137,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2009000</version>
> <kvmVersion>0</kvmVersion>
> <package></package>
> diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
> index 3641d03..64b99b0 100644
> --- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
> @@ -220,6 +220,9 @@
> <flag name='vnc-multi-servers'/>
> <flag name='chardev-reconnect'/>
> <flag name='virtio-gpu.max_outputs'/>
> + <flag name='drive.qcow2.l2-cache-size'/>
> + <flag name='drive.qcow2.refcount-cache-size'/>
> + <flag name='drive.qcow2.cache-clean-interval'/>
> <version>2009000</version>
> <kvmVersion>0</kvmVersion>
> <package> (v2.9.0)</package>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-qcow2-cache.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-qcow2-cache.args
> new file mode 100644
> index 0000000..d13be92
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-qcow2-cache.args
> @@ -0,0 +1,28 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name QEMUGuest1 \
> +-S \
> +-M pc \
> +-m 214 \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-nographic \
> +-nodefaults \
> +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
> +server,nowait \
> +-mon chardev=charmonitor,id=monitor,mode=readline \
> +-no-acpi \
> +-boot c \
> +-usb \
> +-drive file=/dev/HostVG/QEMUGuest1,format=qcow2,l2-cache-size=2097152,\
> +refcount-cache-size=524288,cache-clean-interval=900,if=none,id=drive-ide0-0-0,\
> +cache=none \
> +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
> +-drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,media=cdrom,\
> +id=drive-ide0-1-0,readonly=on \
> +-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index d6ada22..5baad68 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -910,6 +910,10 @@ mymain(void)
> QEMU_CAPS_DRIVE_CACHE_UNSAFE);
> DO_TEST("disk-drive-copy-on-read",
> QEMU_CAPS_DRIVE_COPY_ON_READ);
> + DO_TEST("disk-drive-qcow2-cache",
> + QEMU_CAPS_DRIVE_QCOW2_L2_CACHE_SIZE,
> + QEMU_CAPS_DRIVE_QCOW2_REFCOUNT_CACHE_SIZE,
> + QEMU_CAPS_DRIVE_QCOW2_CACHE_CLEAN_INTERVAL);
> DO_TEST("disk-drive-network-nbd", NONE);
> DO_TEST("disk-drive-network-nbd-export", NONE);
> DO_TEST("disk-drive-network-nbd-ipv6", NONE);
>
More information about the libvir-list
mailing list