]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add directsync cache mode support for disk driver
authorOsier Yang <jyang@redhat.com>
Fri, 2 Sep 2011 13:36:58 +0000 (21:36 +0800)
committerOsier Yang <jyang@redhat.com>
Fri, 2 Sep 2011 13:36:58 +0000 (21:36 +0800)
Newer QEMU introduced cache=directsync for -drive, this patchset
is to expose it in libvirt layer.

  * Introduced a new QEMU capability flag ($prefix_CACHE_DIRECTSYNC),
    As even $prefix_CACHE_V2 is set, we can't known if directsync
    is supported.

docs/formatdomain.html.in
docs/schemas/domain.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
tests/qemuargv2xmltest.c
tests/qemuxml2argvtest.c
tools/virsh.pod

index f46771df0f9db66d1845add27ed7b7dd7d4433b2..8fd6ca1f8da27d669c5c05a8e1b79f308207c969 100644 (file)
           <li>
             The optional <code>cache</code> attribute controls the
             cache mechanism, possible values are "default", "none",
-            "writethrough" and "writeback".
+            "writethrough", "writeback", and "directsync". "directsync"
+            is like "writethrough", but it bypasses the host page
+            cache.
             <span class="since">Since 0.6.0</span>
           </li>
           <li>
index dd8c41ae0cb80209846d3bf450922c5dfce09835..e43b17decb551da101f4af52d5c0eff41a5bad07 100644 (file)
         <value>none</value>
         <value>writeback</value>
         <value>writethrough</value>
+        <value>directsync</value>
       </choice>
     </attribute>
   </define>
index 00212db08beab4d0b00759229eab1ac86c26e6a8..a2de8df18ae3cb3ae3a252f2570544581a8d2815 100644 (file)
@@ -160,7 +160,8 @@ VIR_ENUM_IMPL(virDomainDiskCache, VIR_DOMAIN_DISK_CACHE_LAST,
               "default",
               "none",
               "writethrough",
-              "writeback")
+              "writeback",
+              "directsync")
 
 VIR_ENUM_IMPL(virDomainDiskErrorPolicy, VIR_DOMAIN_DISK_ERROR_POLICY_LAST,
               "default",
index 8382d2839ff75940aea0cbd5d669dba274771575..0abb75e3d1e52bb7e6bbfaa5dc16708b29cec1bb 100644 (file)
@@ -165,6 +165,7 @@ enum  virDomainDiskCache {
     VIR_DOMAIN_DISK_CACHE_DISABLE,
     VIR_DOMAIN_DISK_CACHE_WRITETHRU,
     VIR_DOMAIN_DISK_CACHE_WRITEBACK,
+    VIR_DOMAIN_DISK_CACHE_DIRECTSYNC,
 
     VIR_DOMAIN_DISK_CACHE_LAST
 };
index f665de4c094a0a48796800fe14b0210fa5c93ca3..631d683101194610b59b2426d2fa749467a40d9d 100644 (file)
@@ -125,6 +125,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
               "sga",
               "virtio-blk-pci.event_idx",
               "virtio-net-pci.event_idx",
+              "cache-directsync",
     );
 
 struct qemu_feature_flags {
@@ -902,8 +903,11 @@ qemuCapsComputeCmdFlags(const char *help,
     if (strstr(help, "-drive")) {
         qemuCapsSet(flags, QEMU_CAPS_DRIVE);
         if (strstr(help, "cache=") &&
-            !strstr(help, "cache=on|off"))
+            !strstr(help, "cache=on|off")) {
             qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_V2);
+            if (strstr(help, "directsync"))
+                qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC);
+        }
         if (strstr(help, "format="))
             qemuCapsSet(flags, QEMU_CAPS_DRIVE_FORMAT);
         if (strstr(help, "readonly="))
index 13af0b9d7bc423e0e0f00cacf33d3362c5da50fb..c01d438ca8900a88a63566e32a699930842a1a19 100644 (file)
@@ -100,6 +100,7 @@ enum qemuCapsFlags {
     QEMU_CAPS_SGA               = 62, /* Serial Graphics Adapter */
     QEMU_CAPS_VIRTIO_BLK_EVENT_IDX = 63, /* virtio-blk-pci.event_idx */
     QEMU_CAPS_VIRTIO_NET_EVENT_IDX = 64, /* virtio-net-pci.event_idx */
+    QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC = 65, /* Is cache=directsync supported? */
 
     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
index 44a553bc635625b09d8f04b1184d2018c790cabf..fa52dc0ab962ec3e571bcc2194caee59f07cfc29 100644 (file)
@@ -64,14 +64,16 @@ VIR_ENUM_DECL(qemuDiskCacheV2)
 VIR_ENUM_IMPL(qemuDiskCacheV1, VIR_DOMAIN_DISK_CACHE_LAST,
               "default",
               "off",
-              "off", /* writethrough not supported, so for safety, disable */
-              "on"); /* Old 'on' was equivalent to 'writeback' */
+              "off",  /* writethrough not supported, so for safety, disable */
+              "on",   /* Old 'on' was equivalent to 'writeback' */
+              "off"); /* directsync not supported, for safety, disable */
 
 VIR_ENUM_IMPL(qemuDiskCacheV2, VIR_DOMAIN_DISK_CACHE_LAST,
               "default",
               "none",
               "writethrough",
-              "writeback");
+              "writeback",
+              "directsync");
 
 VIR_ENUM_DECL(qemuVideo)
 
@@ -1516,10 +1518,21 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
     }
 
     if (disk->cachemode) {
-        const char *mode =
-            qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_V2) ?
-            qemuDiskCacheV2TypeToString(disk->cachemode) :
-            qemuDiskCacheV1TypeToString(disk->cachemode);
+        const char *mode = NULL;
+
+        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_V2)) {
+            mode = qemuDiskCacheV2TypeToString(disk->cachemode);
+
+            if (disk->cachemode == VIR_DOMAIN_DISK_CACHE_DIRECTSYNC &&
+                !qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC)) {
+                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                                _("disk cache mode 'directsync' is not "
+                                  "supported by this QEMU"));
+                goto error;
+            }
+        } else {
+            mode = qemuDiskCacheV1TypeToString(disk->cachemode);
+        }
 
         virBufferAsprintf(&opt, ",cache=%s", mode);
     } else if (disk->shared && !disk->readonly) {
@@ -5211,6 +5224,8 @@ qemuParseCommandLineDisk(virCapsPtr caps,
                 def->cachemode = VIR_DOMAIN_DISK_CACHE_WRITEBACK;
             else if (STREQ(values[i], "writethrough"))
                 def->cachemode = VIR_DOMAIN_DISK_CACHE_WRITETHRU;
+            else if (STREQ(values[i], "directsync"))
+                def->cachemode = VIR_DOMAIN_DISK_CACHE_DIRECTSYNC;
         } else if (STREQ(keywords[i], "werror") ||
                    STREQ(keywords[i], "rerror")) {
             if (STREQ(values[i], "stop"))
index c2b6cf2a8b4167bd7761ffc08c6ac8d03f4a5b40..91f15af6bb08e2f700dc32140c28d68266e31dc6 100644 (file)
@@ -168,6 +168,7 @@ mymain(void)
     DO_TEST("disk-drive-cache-v2-wt");
     DO_TEST("disk-drive-cache-v2-wb");
     DO_TEST("disk-drive-cache-v2-none");
+    DO_TEST("disk-drive-cache-directsync");
     DO_TEST("disk-drive-network-nbd");
     DO_TEST("disk-drive-network-rbd");
     DO_TEST("disk-drive-network-sheepdog");
index 6e8da5e756faa7538cc70c25ec3a29c9277d0e63..b009bf3cb52da932329b70c0e02ee6905507c23b 100644 (file)
@@ -338,6 +338,9 @@ mymain(void)
             QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
     DO_TEST("disk-drive-cache-v2-none", false,
             QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-cache-directsync", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC, QEMU_CAPS_DRIVE_FORMAT);
     DO_TEST("disk-drive-network-nbd", false,
             QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
     DO_TEST("disk-drive-network-rbd", false,
index 772d33247f4260c3b892b54a6f048f88be333711..2e765725a3bff898f6824dce9160dc5729d14b87 100644 (file)
@@ -1099,7 +1099,8 @@ floppy device; consider using B<update-device> for this usage instead.
 I<mode> can specify the two specific mode I<readonly> or I<shareable>.
 I<persistent> indicates the changes will affect the next boot of the domain.
 I<sourcetype> can indicate the type of source (block|file)
-I<cache> can be one of "default", "none", "writethrough" or "writeback".
+I<cache> can be one of "default", "none", "writethrough", "writeback", or
+"directsync".
 I<serial> is the serial of disk device. I<shareable> indicates the disk device
 is shareable between domains.
 I<address> is the address of disk device in the form of pci:domain.bus.slot.function,