[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] 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. Signed-off-by: Olaf Hering <olaf@xxxxxxxxx> --- docs/misc/xl-disk-configuration.txt | 13 +++++++++++++ tools/libxl/check-xl-disk-parse | 21 ++++++++++++++------- tools/libxl/libxl.c | 2 ++ tools/libxl/libxl_types.idl | 1 + tools/libxl/libxlu_disk.c | 1 + tools/libxl/libxlu_disk_i.h | 2 +- tools/libxl/libxlu_disk_l.l | 8 ++++++++ xen/include/public/io/blkif.h | 8 ++++++++ 8 files changed, 48 insertions(+), 8 deletions(-) diff --git a/docs/misc/xl-disk-configuration.txt b/docs/misc/xl-disk-configuration.txt index 5bd456d..4f81394 100644 --- a/docs/misc/xl-disk-configuration.txt +++ b/docs/misc/xl-disk-configuration.txt @@ -178,6 +178,19 @@ information to be interpreted by the executable program <script>, 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 + +This option instructs the backend driver, depending of the value, to advertise +discard support (TRIM, UNMAP) to the frontend. It allows to disable "hole +punching" for file based backends which were intentionally created non-sparse. + + ============================================ DEPRECATED PARAMETERS, PREFIXES AND SYNTAXES diff --git a/tools/libxl/check-xl-disk-parse b/tools/libxl/check-xl-disk-parse index 797277c..485b8c6 100755 --- a/tools/libxl/check-xl-disk-parse +++ b/tools/libxl/check-xl-disk-parse @@ -61,7 +61,8 @@ disk: { "script": null, "removable": 0, "readwrite": 1, - "is_cdrom": 0 + "is_cdrom": 0, + "discard_enable": 1 } END @@ -82,7 +83,8 @@ disk: { "script": null, "removable": 1, "readwrite": 0, - "is_cdrom": 1 + "is_cdrom": 1, + "discard_enable": 1 } END @@ -104,7 +106,8 @@ disk: { "script": null, "removable": 0, "readwrite": 1, - "is_cdrom": 0 + "is_cdrom": 0, + "discard_enable": 1 } EOF @@ -121,7 +124,8 @@ disk: { "script": null, "removable": 1, "readwrite": 0, - "is_cdrom": 1 + "is_cdrom": 1, + "discard_enable": 1 } EOF @@ -142,7 +146,8 @@ disk: { "script": null, "removable": 1, "readwrite": 0, - "is_cdrom": 1 + "is_cdrom": 1, + "discard_enable": 1 } EOF @@ -160,7 +165,8 @@ disk: { "script": "block-iscsi", "removable": 0, "readwrite": 1, - "is_cdrom": 0 + "is_cdrom": 0, + "discard_enable": 1 } EOF @@ -180,7 +186,8 @@ disk: { "script": "block-drbd", "removable": 0, "readwrite": 1, - "is_cdrom": 0 + "is_cdrom": 0, + "discard_enable": 1 } EOF diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2845ca4..3633a7d 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2196,6 +2196,8 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, flexarray_append(back, disk->readwrite ? "w" : "r"); flexarray_append(back, "device-type"); flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk"); + flexarray_append(back, "discard_enable"); + flexarray_append(back, libxl__sprintf(gc, "%d", (disk->discard_enable) ? 1 : 0)); flexarray_append(front, "backend-id"); flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid)); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 649ce50..b58b198 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -415,6 +415,7 @@ libxl_device_disk = Struct("device_disk", [ ("removable", integer), ("readwrite", integer), ("is_cdrom", integer), + ("discard_enable", integer), ]) libxl_device_nic = Struct("device_nic", [ diff --git a/tools/libxl/libxlu_disk.c b/tools/libxl/libxlu_disk.c index 18fe386..ee82a8d 100644 --- a/tools/libxl/libxlu_disk.c +++ b/tools/libxl/libxlu_disk.c @@ -58,6 +58,7 @@ int xlu_disk_parse(XLU_Config *cfg, dpc.disk = disk; disk->readwrite = 1; + disk->discard_enable = 1; /* Doing it twice?! */ for (i=0; i<nspecs; i++) { e = dpc_prep(&dpc, specs[i]); diff --git a/tools/libxl/libxlu_disk_i.h b/tools/libxl/libxlu_disk_i.h index 4fccd4a..c002d02 100644 --- a/tools/libxl/libxlu_disk_i.h +++ b/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, discard_set, had_depr_prefix; const char *spec; } DiskParseContext; diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l index 7c4e7f1..2afd5e7 100644 --- a/tools/libxl/libxlu_disk_l.l +++ b/tools/libxl/libxlu_disk_l.l @@ -173,6 +173,10 @@ backendtype=[^,]*,? { STRIP(','); setbackendtype(DPC,FROMEQUALS); } vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); } script=[^,]*,? { STRIP(','); SAVESTRING("script", script, FROMEQUALS); } +discard=on,? { DPC->disk->discard_enable = 1; DPC->discard_set = 1; } +discard=1,? { DPC->disk->discard_enable = 1; DPC->discard_set = 1; } +discard=off,? { DPC->disk->discard_enable = 0; DPC->discard_set = 1; } +discard=0,? { DPC->disk->discard_enable = 0; DPC->discard_set = 1; } /* the target magic parameter, eats the rest of the string */ @@ -244,6 +248,10 @@ phy:/.* { DPC->had_depr_prefix=1; DEPRECATE(0); } xlu__disk_err(DPC,yytext,"too many positional parameters"); return 0; /* don't print any more errors */ } + if (!DPC->discard_set) { + DPC->discard_set = 1; + DPC->disk->discard_enable = 1; + } } . { diff --git a/xen/include/public/io/blkif.h b/xen/include/public/io/blkif.h index 542f123..0121e19 100644 --- a/xen/include/public/io/blkif.h +++ b/xen/include/public/io/blkif.h @@ -175,6 +175,14 @@ * *------------------------- Backend Device Properties ------------------------- * + * discard_enable + * Values: 0/1 (boolean) + * Default Value: 1 + * + * This optional property, set by the toolstack, instructs the backend to + * offer discard to the frontend. If the property is missing the backend + * should offer discard if the backing storage actually supports it. + * * discard-alignment * Values: <uint32_t> * Default Value: 0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |