]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Add support for zero-detection writes
authorMartin Kletzander <mkletzan@redhat.com>
Mon, 14 Dec 2015 08:35:20 +0000 (09:35 +0100)
committerMartin Kletzander <mkletzan@redhat.com>
Tue, 14 Jun 2016 06:25:25 +0000 (08:25 +0200)
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
13 files changed:
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.args [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.xml
tests/qemuxml2argvtest.c

index b9f3fe06a24ebbea1a2e1f83e532cd19f5a10659..1ef59378c5cd585a548ab06fa34ed74b8be235c1 100644 (file)
@@ -333,6 +333,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               "qxl.max_outputs", /* 225 */
               "qxl-vga.max_outputs",
               "spice-unix",
+              "drive-detect-zeroes",
     );
 
 
@@ -2650,6 +2651,7 @@ static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = {
     { "machine", "mem-merge", QEMU_CAPS_MEM_MERGE },
     { "machine", "vmport", QEMU_CAPS_MACHINE_VMPORT_OPT },
     { "drive", "discard", QEMU_CAPS_DRIVE_DISCARD },
+    { "drive", "detect-zeroes", QEMU_CAPS_DRIVE_DETECT_ZEROES },
     { "realtime", "mlock", QEMU_CAPS_MLOCK },
     { "boot-opts", "strict", QEMU_CAPS_BOOT_STRICT },
     { "boot-opts", "reboot-timeout", QEMU_CAPS_REBOOT_TIMEOUT },
index d33ba008ae4b64bf38f27389e479b227a5e8754a..f7ede4a3b0cdf8f82afafa6ddb4bceefede9c676 100644 (file)
@@ -366,6 +366,7 @@ typedef enum {
     QEMU_CAPS_QXL_MAX_OUTPUTS, /* -device qxl,max-outputs= */
     QEMU_CAPS_QXL_VGA_MAX_OUTPUTS, /* -device qxl-vga,max-outputs= */
     QEMU_CAPS_SPICE_UNIX, /* -spice unix */
+    QEMU_CAPS_DRIVE_DETECT_ZEROES, /* -drive detect-zeroes= */
 
     QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
index 490260f15e4f6968ea874bd8fa891083ae2d0375..48be3990a20c235b5642fd40d92966de103e40fa 100644 (file)
@@ -1391,6 +1391,30 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
         }
     }
 
+    if (disk->detect_zeroes) {
+        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_DETECT_ZEROES)) {
+            int detect_zeroes = disk->detect_zeroes;
+
+            /*
+             * As a convenience syntax, if discards are ignored and
+             * zero detection is set to 'unmap', then simply behave
+             * like zero detection is set to 'on'.  But don't change
+             * it in the XML for easier adjustments.  This behaviour
+             * is documented.
+             */
+            if (disk->discard != VIR_DOMAIN_DISK_DISCARD_UNMAP &&
+                detect_zeroes == VIR_DOMAIN_DISK_DETECT_ZEROES_UNMAP)
+                detect_zeroes = VIR_DOMAIN_DISK_DETECT_ZEROES_ON;
+
+            virBufferAsprintf(&opt, ",detect-zeroes=%s",
+                              virDomainDiskDetectZeroesTypeToString(detect_zeroes));
+        } else {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("detect_zeroes is not supported by this QEMU binary"));
+            goto error;
+        }
+    }
+
     if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MONITOR_JSON)) {
         const char *wpolicy = NULL, *rpolicy = NULL;
 
index 5e9b34d8a49375050fa82b7ea54737edd54dcf23..964b6f020483c5da4bae767235464d7f7aab362a 100644 (file)
   <flag name='device-tray-moved-event'/>
   <flag name='nec-usb-xhci-ports'/>
   <flag name='name-guest'/>
+  <flag name='drive-detect-zeroes'/>
   <version>2001001</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index df1eb5ecd343ddb1552daafb643709462041e15c..112ac95eabee8b525d5e026e6bffc6edc8263791 100644 (file)
   <flag name='qxl.max_outputs'/>
   <flag name='qxl-vga.max_outputs'/>
   <flag name='spice-unix'/>
+  <flag name='drive-detect-zeroes'/>
   <version>2004000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index 83f1e146d8574c9f045ab59f2b59fc59d503ddc9..d7781cf215a1a724c947601b19ab8c914c327116 100644 (file)
   <flag name='qxl.max_outputs'/>
   <flag name='qxl-vga.max_outputs'/>
   <flag name='spice-unix'/>
+  <flag name='drive-detect-zeroes'/>
   <version>2005000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index 8b68291aecb4e989bcd48c75349c953afb118c38..29f3b5ac3f11658b4f2e0d4870bddd30ee6e9275 100644 (file)
   <flag name='nec-usb-xhci-ports'/>
   <flag name='virtio-scsi-pci.iothread'/>
   <flag name='name-guest'/>
+  <flag name='drive-detect-zeroes'/>
   <version>2005094</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index d65523ee285fca7699591c3c2e790b823aa99f7d..7c0dcf6b218b4300c1f04ca21b5827bdb9647665 100644 (file)
   <flag name='nec-usb-xhci-ports'/>
   <flag name='virtio-scsi-pci.iothread'/>
   <flag name='name-guest'/>
+  <flag name='drive-detect-zeroes'/>
   <version>2005094</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index 771d20954387a9366ab8c1ff11b86b7e4831e5ed..8438deb3d6d4322ed7a32848580d03bc87a54da3 100644 (file)
   <flag name='nec-usb-xhci-ports'/>
   <flag name='virtio-scsi-pci.iothread'/>
   <flag name='name-guest'/>
+  <flag name='drive-detect-zeroes'/>
   <version>2005094</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index c9f296542dc11d73abc57edd94b6cdb68d28cb3e..442d5a7e404729c8b58a13a45208a7942c2a1a8a 100644 (file)
   <flag name='qxl.max_outputs'/>
   <flag name='qxl-vga.max_outputs'/>
   <flag name='spice-unix'/>
+  <flag name='drive-detect-zeroes'/>
   <version>2006000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.args
new file mode 100644 (file)
index 0000000..ea65141
--- /dev/null
@@ -0,0 +1,27 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu \
+-name test \
+-S \
+-M pc-0.13 \
+-m 1024 \
+-smp 1 \
+-uuid 92d7a226-cfae-425b-a6d3-00bbf9ec5c9e \
+-nographic \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-test/monitor.sock,server,nowait \
+-no-acpi \
+-boot dc \
+-usb \
+-drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\
+id=drive-virtio-disk0,discard=unmap,detect-zeroes=unmap \
+-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\
+id=virtio-disk0 \
+-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\
+media=cdrom,id=drive-ide0-1-0,readonly=on,discard=ignore,detect-zeroes=on \
+-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
index 8953f50f3f92e6a450e9626ad962e7a1e5007009..1546ac134f1a2c15d71addc084be7282152ab9a2 100644 (file)
@@ -23,7 +23,7 @@
       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
     </disk>
     <disk type='file' device='cdrom'>
-      <driver discard='ignore' detect_zeroes='off'/>
+      <driver discard='ignore' detect_zeroes='unmap'/>
       <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
       <target dev='hdc' bus='ide'/>
       <readonly/>
index 573162fc4cc06a8dfe0d0ea9ff9cb8392fd1d9a0..c406b645313cf2ba041614b5ccbae06894aa42b2 100644 (file)
@@ -875,6 +875,9 @@ mymain(void)
             QEMU_CAPS_VIRTIO_BLK_SCSI);
     DO_TEST("disk-drive-discard",
             QEMU_CAPS_DRIVE_DISCARD);
+    DO_TEST("disk-drive-detect-zeroes",
+            QEMU_CAPS_DRIVE_DISCARD,
+            QEMU_CAPS_DRIVE_DETECT_ZEROES);
     DO_TEST("disk-snapshot", NONE);
     DO_TEST_PARSE_ERROR("disk-same-targets",
                         QEMU_CAPS_SCSI_LSI,