2014-02-04 00:53:57 +01:00
|
|
|
References: FATE#316071
|
|
|
|
Subject: libxl: add option for discard support to xl disk configuration
|
|
|
|
|
|
|
|
Handle new option discard=on|off for disk configuration. It is supposed
|
|
|
|
to disable discard support if file based backing storage was
|
|
|
|
intentionally created non-sparse to avoid fragmentation of the file.
|
|
|
|
|
|
|
|
The option is a boolean and intended for the backend driver. A new
|
|
|
|
boolean property "discard-enable" is written to the backend node. An
|
|
|
|
upcoming patch for qemu will make use of this property. The kernel
|
|
|
|
blkback driver may be updated as well to disable discard for phy based
|
|
|
|
backing storage.
|
|
|
|
|
|
|
|
This change does not break ABI. Instead of adding a new member ->discard_enable
|
|
|
|
to struct libxl_device_disk the existing ->readwrite member is reused.
|
|
|
|
|
|
|
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
|
|
|
---
|
|
|
|
docs/misc/xl-disk-configuration.txt | 15 +++++++++++++++
|
|
|
|
tools/libxl/libxl.c | 2 ++
|
|
|
|
tools/libxl/libxl.h | 11 +++++++++++
|
|
|
|
tools/libxl/libxlu_disk.c | 3 +++
|
|
|
|
tools/libxl/libxlu_disk_i.h | 2 +-
|
|
|
|
tools/libxl/libxlu_disk_l.l | 4 ++++
|
|
|
|
6 files changed, 36 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
Index: xen-4.4.0-testing/docs/misc/xl-disk-configuration.txt
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.4.0-testing.orig/docs/misc/xl-disk-configuration.txt
|
|
|
|
+++ xen-4.4.0-testing/docs/misc/xl-disk-configuration.txt
|
|
|
|
@@ -178,6 +178,21 @@ information to be interpreted by the exe
|
|
|
|
These scripts are normally called "block-<script>".
|
|
|
|
|
|
|
|
|
|
|
|
+discard=<boolean>
|
|
|
|
+---------------
|
|
|
|
+
|
|
|
|
+Description: Instruct backend to advertise discard support to frontend
|
|
|
|
+Supported values: on, off, 0, 1
|
|
|
|
+Mandatory: No
|
|
|
|
+Default value: on if, available for that backend typ
|
|
|
|
+
|
|
|
|
+This option is an advisory setting for the backend driver, depending of the
|
|
|
|
+value, to advertise discard support (TRIM, UNMAP) to the frontend. The real
|
|
|
|
+benefit of this option is to be able to force it off rather than on. It allows
|
|
|
|
+to disable "hole punching" for file based backends which were intentionally
|
|
|
|
+created non-sparse to avoid fragmentation of the file.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
|
|
============================================
|
|
|
|
DEPRECATED PARAMETERS, PREFIXES AND SYNTAXES
|
|
|
|
Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.4.0-testing.orig/tools/libxl/libxl.c
|
|
|
|
+++ xen-4.4.0-testing/tools/libxl/libxl.c
|
2014-05-13 19:13:17 +02:00
|
|
|
@@ -2480,6 +2480,8 @@ static void device_disk_add(libxl__egc *
|
2014-02-04 00:53:57 +01:00
|
|
|
flexarray_append(back, disk->readwrite ? "w" : "r");
|
|
|
|
flexarray_append(back, "device-type");
|
|
|
|
flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
|
|
|
|
+ if (disk->readwrite == LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC)
|
|
|
|
+ flexarray_append_pair(back, "discard-enable", "0");
|
|
|
|
|
|
|
|
flexarray_append(front, "backend-id");
|
|
|
|
flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
|
|
|
|
Index: xen-4.4.0-testing/tools/libxl/libxl.h
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.4.0-testing.orig/tools/libxl/libxl.h
|
|
|
|
+++ xen-4.4.0-testing/tools/libxl/libxl.h
|
|
|
|
@@ -95,6 +95,17 @@
|
|
|
|
#define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1
|
|
|
|
|
|
|
|
/*
|
|
|
|
+ * The libxl_device_disk lacks discard_enable field, disabling discard
|
|
|
|
+ * is supported without breaking the ABI. This is done by overloading
|
|
|
|
+ * struct libxl_device_disk->readwrite:
|
|
|
|
+ * readwrite == 0: disk is readonly, no discard
|
|
|
|
+ * readwrite == 1: disk is readwrite, backend driver may enable discard
|
|
|
|
+ * readwrite == MAGIC: disk is readwrite, backend driver should not offer
|
|
|
|
+ * discard to the frontend driver.
|
|
|
|
+ */
|
|
|
|
+#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC 0xdcadU
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
* libxl ABI compatibility
|
|
|
|
*
|
|
|
|
* The only guarantee which libxl makes regarding ABI compatibility
|
|
|
|
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk.c
|
|
|
|
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
|
|
|
@@ -80,6 +80,9 @@ int xlu_disk_parse(XLU_Config *cfg,
|
|
|
|
disk->format = LIBXL_DISK_FORMAT_EMPTY;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if (disk->readwrite && dpc.disable_discard)
|
|
|
|
+ disk->readwrite = LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC;
|
|
|
|
+
|
|
|
|
if (!disk->vdev) {
|
|
|
|
xlu__disk_err(&dpc,0, "no vdev specified");
|
|
|
|
goto x_err;
|
|
|
|
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_i.h
|
|
|
|
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
|
|
|
@@ -10,7 +10,7 @@ typedef struct {
|
|
|
|
void *scanner;
|
|
|
|
YY_BUFFER_STATE buf;
|
|
|
|
libxl_device_disk *disk;
|
|
|
|
- int access_set, had_depr_prefix;
|
|
|
|
+ int access_set, disable_discard, had_depr_prefix;
|
|
|
|
const char *spec;
|
|
|
|
} DiskParseContext;
|
|
|
|
|
|
|
|
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
|
|
|
===================================================================
|
|
|
|
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_l.l
|
|
|
|
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
|
|
|
@@ -173,6 +173,10 @@ backendtype=[^,]*,? { STRIP(','); setbac
|
|
|
|
|
|
|
|
vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
|
|
|
|
script=[^,]*,? { STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
|
|
|
|
+discard=on,? { DPC->disable_discard = 0; }
|
|
|
|
+discard=1,? { DPC->disable_discard = 0; }
|
|
|
|
+discard=off,? { DPC->disable_discard = 1; }
|
|
|
|
+discard=0,? { DPC->disable_discard = 1; }
|
|
|
|
|
|
|
|
/* the target magic parameter, eats the rest of the string */
|
|
|
|
|