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(a)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);