[libvirt] [PATCH] libxl: add support for cache=directsync to to libxl_device_disk

Olaf Hering olaf at aepfle.de
Fri May 30 14:54:29 UTC 2014


Up to now xend and libxl did not have any way and need to specify a cache=
mode for block devices. At least the libxl driver did just ignore the
cachemode value.

With xen-4.5 a new knob was added to libxl which instructs qemu to use
threads=native cache=directsync in the qdisk driver. This mode was disabled
early due to a pvops kernel bug. As a workaround cache=writeback was set as
default. The kernel bug is long fixed. I assume the forward ported xenlinux
kernel never had this bug.

This change exposes the knob to libvirt. If cache=directsync is set qemu is
instructed to use native AIO.

This change also lays the ground work to set cache=unsafe at some point.
It is currently under investigation whether libxl should expose such knob.

Signed-off-by: Olaf Hering <olaf at aepfle.de>
---
 src/libxl/libxl_conf.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 4cb062e..79f4a82 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -739,6 +739,20 @@ libxlDiskSetDiscard(libxl_device_disk *x_disk, int discard)
 #endif
 }
 
+static void
+libxlDiskSetCacheMode(libxl_device_disk *x_disk, int cachemode)
+{
+    switch (cachemode) {
+#if defined(LIBXL_HAVE_DEVICE_DISK_DIRECT_IO_SAFE)
+    case VIR_DOMAIN_DISK_CACHE_DIRECTSYNC:
+        x_disk->direct_io_safe = 1;
+        break;
+#endif
+    default:
+        break;
+    }
+}
+
 
 int
 libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk)
@@ -855,6 +869,7 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk)
     x_disk->readwrite = !l_disk->readonly;
     x_disk->is_cdrom = l_disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0;
     libxlDiskSetDiscard(x_disk, l_disk->discard);
+    libxlDiskSetCacheMode(x_disk, l_disk->cachemode);
     /* An empty CDROM must have the empty format, otherwise libxl fails. */
     if (x_disk->is_cdrom && !x_disk->pdev_path)
         x_disk->format = LIBXL_DISK_FORMAT_EMPTY;




More information about the libvir-list mailing list