]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add new attribute wrpolicy to <driver> element
authorDeepak C Shetty <deepakcs@linux.vnet.ibm.com>
Tue, 17 Jan 2012 12:44:18 +0000 (18:14 +0530)
committerEric Blake <eblake@redhat.com>
Tue, 17 Jan 2012 22:37:42 +0000 (15:37 -0700)
This introduces new attribute wrpolicy with only supported
value as immediate. This will be an optional
attribute with no defaults. This helps specify whether
to skip the host page cache.

When wrpolicy is specified, meaning when wrpolicy=immediate
a writeback is explicitly initiated for the dirty pages in
the host page cache as part of the guest file write operation.

Usage:
<filesystem type='mount' accessmode='passthrough'>
  <driver type='path' wrpolicy='immediate'/>
  <source dir='/export/to/guest'/>
  <target dir='mount_tag'/>
</filesystem>

Currently this only works with type='mount' for the QEMU/KVM driver.

Signed-off-by: Deepak C Shetty <deepakcs@linux.vnet.ibm.com>
12 files changed:
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
tests/qemuhelptest.c
tests/qemuxml2argvdata/qemuxml2argv-fs9p.args
tests/qemuxml2argvdata/qemuxml2argv-fs9p.xml
tests/qemuxml2argvtest.c

index 6bb5721a74a342ce17dd96d4c83765e47d570f1c..de9b480ac2d9a4273d09ac5da99b6ac64b5f6a4e 100644 (file)
       &lt;target dir='/'/&gt;
     &lt;/filesystem&gt;
     &lt;filesystem type='mount' accessmode='passthrough'&gt;
-      &lt;driver type='path'/&gt;
+      &lt;driver type='path' wrpolicy='immediate'/&gt;
       &lt;source dir='/export/to/guest'/&gt;
       &lt;target dir='/import/from/host'/&gt;
       &lt;readonly/&gt;
         sub-element <code>driver</code>, with an
         attribute <code>type='path'</code>
         or <code>type='handle'</code> <span class="since">(since
-        0.9.7)</span>.
+        0.9.7)</span>. The driver block has an optional attribute
+        <code>wrpolicy</code> that further controls interaction with
+        the host page cache; omitting the attribute gives default behavior,
+        while the value <code>immediate</code> means that a host writeback
+        is immediately triggered for all pages touched during a guest file
+        write operation <span class="since">(since 0.9.10)</span>.
         </dd>
         <dt><code>type='template'</code></dt>
         <dd>
index 27b9a1f0467c6eac1a63766633ff2c3e209555ff..2041dfbbc2b4db3a805321097cdcf2bd11a36519 100644 (file)
                     <value>handle</value>
                   </choice>
                 </attribute>
+                <optional>
+                  <attribute name="wrpolicy">
+                    <value>immediate</value>
+                  </attribute>
+                </optional>
                 <empty/>
               </element>
             </optional>
index 96a4669fc38b086da510628d28fa2810b809400f..f97014eef47e71489ef9b5a5e41d5f7ccb74db0c 100644 (file)
@@ -266,6 +266,9 @@ VIR_ENUM_IMPL(virDomainFSAccessMode, VIR_DOMAIN_FS_ACCESSMODE_LAST,
               "mapped",
               "squash")
 
+VIR_ENUM_IMPL(virDomainFSWrpolicy, VIR_DOMAIN_FS_WRPOLICY_LAST,
+              "default",
+              "immediate")
 
 VIR_ENUM_IMPL(virDomainNet, VIR_DOMAIN_NET_TYPE_LAST,
               "user",
@@ -3460,6 +3463,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
     char *source = NULL;
     char *target = NULL;
     char *accessmode = NULL;
+    char *wrpolicy = NULL;
 
     if (VIR_ALLOC(def) < 0) {
         virReportOOMError();
@@ -3509,6 +3513,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
                 def->readonly = 1;
             } else if ((fsdriver == NULL) && (xmlStrEqual(cur->name, BAD_CAST "driver"))) {
                 fsdriver = virXMLPropString(cur, "type");
+                wrpolicy = virXMLPropString(cur, "wrpolicy");
             }
         }
         cur = cur->next;
@@ -3522,6 +3527,16 @@ virDomainFSDefParseXML(xmlNodePtr node,
         }
     }
 
+    if (wrpolicy) {
+        if ((def->wrpolicy = virDomainFSWrpolicyTypeFromString(wrpolicy)) <= 0) {
+            virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                 _("unknown filesystem write policy '%s'"), wrpolicy);
+            goto error;
+        }
+    } else {
+        def->wrpolicy = VIR_DOMAIN_FS_WRPOLICY_DEFAULT;
+    }
+
     if (source == NULL) {
         virDomainReportError(VIR_ERR_NO_SOURCE,
                              target ? "%s" : NULL, target);
@@ -3548,6 +3563,7 @@ cleanup:
     VIR_FREE(target);
     VIR_FREE(source);
     VIR_FREE(accessmode);
+    VIR_FREE(wrpolicy);
 
     return def;
 
@@ -10166,6 +10182,7 @@ virDomainFSDefFormat(virBufferPtr buf,
     const char *type = virDomainFSTypeToString(def->type);
     const char *accessmode = virDomainFSAccessModeTypeToString(def->accessmode);
     const char *fsdriver = virDomainFSDriverTypeTypeToString(def->fsdriver);
+    const char *wrpolicy = virDomainFSWrpolicyTypeToString(def->wrpolicy);
 
     if (!type) {
         virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@@ -10185,7 +10202,14 @@ virDomainFSDefFormat(virBufferPtr buf,
                       type, accessmode);
 
     if (def->fsdriver) {
-        virBufferAsprintf(buf, "      <driver type='%s'/>\n", fsdriver);
+        virBufferAsprintf(buf, "      <driver type='%s'", fsdriver);
+
+        /* Don't generate anything if wrpolicy is set to default */
+        if (def->wrpolicy) {
+            virBufferAsprintf(buf, " wrpolicy='%s'", wrpolicy);
+        }
+
+        virBufferAddLit(buf, "/>\n");
     }
 
     if (def->src) {
index f3c45be07c14372dd477b391e9b9f425bdbf5381..b121f9c17ecc3f827e05af2ff0bfa3dd5355a6c8 100644 (file)
@@ -491,12 +491,21 @@ enum virDomainFSAccessMode {
     VIR_DOMAIN_FS_ACCESSMODE_LAST
 };
 
+/* Filesystem Write policy */
+enum virDomainFSWrpolicy {
+    VIR_DOMAIN_FS_WRPOLICY_DEFAULT = 0,
+    VIR_DOMAIN_FS_WRPOLICY_IMMEDIATE,
+
+    VIR_DOMAIN_FS_WRPOLICY_LAST
+};
+
 typedef struct _virDomainFSDef virDomainFSDef;
 typedef virDomainFSDef *virDomainFSDefPtr;
 struct _virDomainFSDef {
     int type;
     int fsdriver;
     int accessmode;
+    int wrpolicy; /* enum virDomainFSWrpolicy */
     char *src;
     char *dst;
     unsigned int readonly : 1;
@@ -1985,6 +1994,7 @@ VIR_ENUM_DECL(virDomainControllerModelUSB)
 VIR_ENUM_DECL(virDomainFS)
 VIR_ENUM_DECL(virDomainFSDriverType)
 VIR_ENUM_DECL(virDomainFSAccessMode)
+VIR_ENUM_DECL(virDomainFSWrpolicy)
 VIR_ENUM_DECL(virDomainNet)
 VIR_ENUM_DECL(virDomainNetBackend)
 VIR_ENUM_DECL(virDomainNetVirtioTxMode)
index faab0e252a933a3b9253baae96744f5a84fb70bc..df8e4b0eec05e959f442d99783ae5857006468f8 100644 (file)
@@ -316,6 +316,8 @@ virDomainDiskTypeToString;
 virDomainFSDefFree;
 virDomainFSTypeFromString;
 virDomainFSTypeToString;
+virDomainFSWrpolicyTypeFromString;
+virDomainFSWrpolicyTypeToString;
 virDomainFindByID;
 virDomainFindByName;
 virDomainFindByUUID;
index e9ae44d325cefb3437267be740e9555e7c5459b2..0a1c9aa3841b79a4938e0e9b2f9431afd55263ba 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * qemu_capabilities.c: QEMU capabilities generation
  *
- * Copyright (C) 2006-2011 Red Hat, Inc.
+ * Copyright (C) 2006-2012 Red Hat, Inc.
  * Copyright (C) 2006 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -149,6 +149,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
               "blk-sg-io",
               "drive-copy-on-read",
               "cpu-host",
+              "fsdev-writeout",
     );
 
 struct qemu_feature_flags {
@@ -1090,6 +1091,8 @@ qemuCapsComputeCmdFlags(const char *help,
         qemuCapsSet(flags, QEMU_CAPS_FSDEV);
         if (strstr(fsdev, "readonly"))
             qemuCapsSet(flags, QEMU_CAPS_FSDEV_READONLY);
+        if (strstr(fsdev, "writeout"))
+            qemuCapsSet(flags, QEMU_CAPS_FSDEV_WRITEOUT);
     }
     if (strstr(help, "-smbios type"))
         qemuCapsSet(flags, QEMU_CAPS_SMBIOS_TYPE);
index d69f854a2d27a1b3684e17611a8471880f889f40..1d4d10e59d0f99b5be69a5a63781e45782feb160 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * qemu_capabilities.h: QEMU capabilities generation
  *
- * Copyright (C) 2006-2011 Red Hat, Inc.
+ * Copyright (C) 2006-2012 Red Hat, Inc.
  * Copyright (C) 2006 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -122,6 +122,7 @@ enum qemuCapsFlags {
     QEMU_CAPS_VIRTIO_BLK_SG_IO   = 81, /* support for SG_IO commands, reportedly added in 0.11 */
     QEMU_CAPS_DRIVE_COPY_ON_READ = 82, /* -drive copy-on-read */
     QEMU_CAPS_CPU_HOST          = 83, /* support for -cpu host */
+    QEMU_CAPS_FSDEV_WRITEOUT     = 84, /* -fsdev writeout supported */
 
     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
index eccbe01638b8e11531f5e40ea5b1a39b4f384e68..3bbe9cf6393378d2bb5816f2a99341f10e2bd82c 100644 (file)
@@ -2138,6 +2138,7 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
     const char *driver = qemuDomainFSDriverTypeToString(fs->fsdriver);
+    const char *wrpolicy = virDomainFSWrpolicyTypeToString(fs->wrpolicy);
 
     if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
         qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -2170,6 +2171,17 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
             goto error;
         }
     }
+
+    if (fs->wrpolicy) {
+       if (qemuCapsGet(qemuCaps, QEMU_CAPS_FSDEV_WRITEOUT)) {
+           virBufferAsprintf(&opt, ",writeout=%s", wrpolicy);
+       } else {
+           qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                          _("filesystem writeout not supported"));
+           goto error;
+       }
+    }
+
     virBufferAsprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
     virBufferAsprintf(&opt, ",path=%s", fs->src);
 
index 164707df5627104fd6291de68dc64810928555e5..8802271d394c02fb83666e9757af0a45d8fe79cd 100644 (file)
@@ -666,7 +666,8 @@ mymain(void)
             QEMU_CAPS_FSDEV_READONLY,
             QEMU_CAPS_VIRTIO_BLK_SCSI,
             QEMU_CAPS_VIRTIO_BLK_SG_IO,
-            QEMU_CAPS_CPU_HOST);
+            QEMU_CAPS_CPU_HOST,
+            QEMU_CAPS_FSDEV_WRITEOUT);
 
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
index 857981052f3f1ae966f82ce0df2c1b8c08b74197..f244114f0454d3241aeebb476b4bf3561e1a2e18 100644 (file)
@@ -4,10 +4,10 @@ unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \
 /dev/HostVG/QEMUGuest1 -fsdev local,security_model=passthrough,id=fsdev-fs0,\
 path=/export/to/guest -device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,\
 mount_tag=/import/from/host,bus=pci.0,addr=0x3 \
--fsdev local,security_model=mapped,id=fsdev-fs1,\
+-fsdev local,security_model=mapped,writeout=immediate,id=fsdev-fs1,\
 path=/export/to/guest2 -device virtio-9p-pci,id=fs1,fsdev=fsdev-fs1,\
 mount_tag=/import/from/host2,bus=pci.0,addr=0x4 \
--fsdev handle,id=fsdev-fs2,\
+-fsdev handle,writeout=immediate,id=fsdev-fs2,\
 path=/export/to/guest3 -device virtio-9p-pci,id=fs2,fsdev=fsdev-fs2,\
 mount_tag=/import/from/host3,bus=pci.0,addr=0x5 \
 -usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
index 07d7e8abe33175c06982af636768f1c2fa2944ba..e31db4879c573a267e54f5e8a21b08a5a9e651fd 100644 (file)
       <target dir='/import/from/host'/>
     </filesystem>
     <filesystem accessmode='mapped'>
-      <driver type='path'/>
+      <driver type='path' wrpolicy='immediate'/>
       <source dir='/export/to/guest2'/>
       <target dir='/import/from/host2'/>
     </filesystem>
     <filesystem>
-      <driver type='handle'/>
+      <driver type='handle' wrpolicy='immediate'/>
       <source dir='/export/to/guest3'/>
       <target dir='/import/from/host3'/>
     </filesystem>
index d1834f59d3e3179dac281e64d69d8e68606228bc..5cec86bed496be480222f3fc0c67d80f7f8bbda2 100644 (file)
@@ -651,7 +651,8 @@ mymain(void)
     DO_TEST("sound-device", false,
             QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_HDA_DUPLEX);
     DO_TEST("fs9p", false,
-            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_FSDEV);
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_FSDEV,
+            QEMU_CAPS_FSDEV_WRITEOUT);
 
     DO_TEST("hostdev-usb-address", false, NONE);
     DO_TEST("hostdev-usb-address-device", false,