[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