|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4] libxl: add option for discard support to xl disk configuration
On Mon, May 05, 2014 at 04:04:21PM +0200, Olaf Hering wrote:
> 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.
>
> v4:
> rebase ontop of commit 6ec48cf4 (direct_io_safe)
> rebase ontop of fixup commit for 6ec48cf4 (direct_io_safe)
> add testcases to tools/libxl/check-xl-disk-parse
> v3:
> enable discard unconditionally by always writing discard-enable=1 to xenstore
> fix typos in xl-disk-configuration.txt
> update description in blkif.h, property should be ignored if unsupported
> v2:
> rename xenstore property from discard_enable to discard-enable
> update description in xl-disk-configuration.txt
> use libxl_defbool as type for discard_enable
> update check-xl-disk-parse to use "<default>"
> add LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_ENABLE to libxl.h
>
> Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
> docs/misc/xl-disk-configuration.txt | 15 +++++++
> tools/libxl/check-xl-disk-parse | 80
> +++++++++++++++++++++++++++++++++----
> tools/libxl/libxl.c | 2 +
> tools/libxl/libxl.h | 5 +++
> tools/libxl/libxl_types.idl | 1 +
> tools/libxl/libxlu_disk.c | 2 +
> tools/libxl/libxlu_disk_l.l | 4 ++
> xen/include/public/io/blkif.h | 10 +++++
> 8 files changed, 112 insertions(+), 7 deletions(-)
>
> diff --git a/docs/misc/xl-disk-configuration.txt
> b/docs/misc/xl-disk-configuration.txt
> index 11fee9a..e2a56f3 100644
> --- a/docs/misc/xl-disk-configuration.txt
> +++ b/docs/misc/xl-disk-configuration.txt
> @@ -217,6 +217,21 @@ If in the future the bug is fixed properly this option
> will then be
> silently ignored.
>
>
> +discard=<boolean>
> +---------------
> +
> +Description: Instruct backend to advertise discard support to
> frontend
> +Supported values: on, off, 0, 1
> +Mandatory: No
> +Default value: on
> +
> +This option is an advisory setting for the backend driver, depending on 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
> ============================================
> diff --git a/tools/libxl/check-xl-disk-parse b/tools/libxl/check-xl-disk-parse
> index 0698586..c564e01 100755
> --- a/tools/libxl/check-xl-disk-parse
> +++ b/tools/libxl/check-xl-disk-parse
> @@ -62,7 +62,8 @@ disk: {
> "removable": 0,
> "readwrite": 1,
> "is_cdrom": 0,
> - "direct_io_safe": false
> + "direct_io_safe": false,
> + "discard_enable": "True"
> }
>
> END
> @@ -84,7 +85,8 @@ disk: {
> "removable": 1,
> "readwrite": 0,
> "is_cdrom": 1,
> - "direct_io_safe": false
> + "direct_io_safe": false,
> + "discard_enable": "False"
> }
>
> END
> @@ -107,7 +109,8 @@ disk: {
> "removable": 0,
> "readwrite": 1,
> "is_cdrom": 0,
> - "direct_io_safe": false
> + "direct_io_safe": false,
> + "discard_enable": "True"
> }
>
> EOF
> @@ -125,7 +128,8 @@ disk: {
> "removable": 1,
> "readwrite": 0,
> "is_cdrom": 1,
> - "direct_io_safe": false
> + "direct_io_safe": false,
> + "discard_enable": "False"
> }
>
> EOF
> @@ -147,7 +151,8 @@ disk: {
> "removable": 1,
> "readwrite": 0,
> "is_cdrom": 1,
> - "direct_io_safe": false
> + "direct_io_safe": false,
> + "discard_enable": "False"
> }
>
> EOF
> @@ -166,7 +171,8 @@ disk: {
> "removable": 0,
> "readwrite": 1,
> "is_cdrom": 0,
> - "direct_io_safe": false
> + "direct_io_safe": false,
> + "discard_enable": "True"
> }
>
> EOF
> @@ -187,7 +193,8 @@ disk: {
> "removable": 0,
> "readwrite": 1,
> "is_cdrom": 0,
> - "direct_io_safe": false
> + "direct_io_safe": false,
> + "discard_enable": "True"
> }
>
> EOF
> @@ -196,4 +203,63 @@ EOF
> # http://www.drbd.org/users-guide-emb/s-xen-configure-domu.html
> one 0 drbd:app01,hda,w
>
> +expected <<END
> +disk: {
> + "backend_domid": 0,
> + "backend_domname": null,
> + "pdev_path": "/some/disk/image.raw",
> + "vdev": "hda",
> + "backend": "unknown",
> + "format": "raw",
> + "script": null,
> + "removable": 0,
> + "readwrite": 1,
> + "is_cdrom": 0,
> + "direct_io_safe": false,
> + "discard_enable": "True"
> +}
> +
> +END
> +one 0 discard=on vdev=hda target=/some/disk/image.raw
> +one 0 discard=1 vdev=hda target=/some/disk/image.raw
> +
> +expected <<END
> +disk: {
> + "backend_domid": 0,
> + "backend_domname": null,
> + "pdev_path": "/some/disk/image.raw",
> + "vdev": "hda",
> + "backend": "unknown",
> + "format": "raw",
> + "script": null,
> + "removable": 0,
> + "readwrite": 1,
> + "is_cdrom": 0,
> + "direct_io_safe": false,
> + "discard_enable": "False"
> +}
> +
> +END
> +one 0 discard=off vdev=hda target=/some/disk/image.raw
> +one 0 discard=0 vdev=hda target=/some/disk/image.raw
> +
> +expected <<END
> +disk: {
> + "backend_domid": 0,
> + "backend_domname": null,
> + "pdev_path": "/some/disk/image.iso",
> + "vdev": "hda",
> + "backend": "unknown",
> + "format": "raw",
> + "script": null,
> + "removable": 1,
> + "readwrite": 0,
> + "is_cdrom": 1,
> + "direct_io_safe": false,
> + "discard_enable": "False"
> +}
> +
> +END
> +one 0 cdrom discard=off vdev=hda target=/some/disk/image.iso
> +
> complete
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index d59ce0c..2b7352c 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -2209,6 +2209,8 @@ static void device_disk_add(libxl__egc *egc, uint32_t
> domid,
> flexarray_append(back, "direct-io-safe");
> flexarray_append(back, "1");
> }
> + flexarray_append_pair(back, "discard-enable",
> + libxl_defbool_val(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.h b/tools/libxl/libxl.h
> index 84f9c0e..c7aa817 100644
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -102,6 +102,11 @@
> #define LIBXL_HAVE_DEVICE_DISK_DIRECT_IO_SAFE 1
>
> /*
> + * The libxl_device_disk has the discard_enable field.
> + */
> +#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_ENABLE 1
> +
> +/*
> * libxl ABI compatibility
> *
> * The only guarantee which libxl makes regarding ABI compatibility
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 8944686..52f1aa9 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -417,6 +417,7 @@ libxl_device_disk = Struct("device_disk", [
> ("readwrite", integer),
> ("is_cdrom", integer),
> ("direct_io_safe", bool),
> + ("discard_enable", libxl_defbool),
> ])
>
> libxl_device_nic = Struct("device_nic", [
> diff --git a/tools/libxl/libxlu_disk.c b/tools/libxl/libxlu_disk.c
> index 18fe386..5827025 100644
> --- a/tools/libxl/libxlu_disk.c
> +++ b/tools/libxl/libxlu_disk.c
> @@ -79,6 +79,8 @@ int xlu_disk_parse(XLU_Config *cfg,
> if (!disk->pdev_path || !strcmp(disk->pdev_path, ""))
> disk->format = LIBXL_DISK_FORMAT_EMPTY;
> }
> + if (libxl_defbool_is_default(disk->discard_enable))
> + libxl_defbool_setdefault(&disk->discard_enable, !!disk->readwrite);
>
> if (!disk->vdev) {
> xlu__disk_err(&dpc,0, "no vdev specified");
> diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l
> index ba8577c..7fb378a 100644
> --- a/tools/libxl/libxlu_disk_l.l
> +++ b/tools/libxl/libxlu_disk_l.l
> @@ -174,6 +174,10 @@ backendtype=[^,]*,? { STRIP(',');
> setbackendtype(DPC,FROMEQUALS); }
> vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
> script=[^,]*,? { STRIP(','); SAVESTRING("script", script, FROMEQUALS);
> }
> direct-io-safe,? { DPC->disk->direct_io_safe = 1; }
> +discard=on,? { libxl_defbool_set(&DPC->disk->discard_enable, true); }
> +discard=1,? { libxl_defbool_set(&DPC->disk->discard_enable, true); }
> +discard=off,? { libxl_defbool_set(&DPC->disk->discard_enable, false);
> }
> +discard=0,? { libxl_defbool_set(&DPC->disk->discard_enable, false); }
I think this automatically generated?
>
> /* the target magic parameter, eats the rest of the string */
>
> diff --git a/xen/include/public/io/blkif.h b/xen/include/public/io/blkif.h
> index 1e7cea9..27a88ba 100644
> --- a/xen/include/public/io/blkif.h
> +++ b/xen/include/public/io/blkif.h
> @@ -197,6 +197,16 @@
> *
> *------------------------- 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. The
> + * backend driver should ignore the property if the property is set but
> + * the backing storage does not support the feature.
? I think you want to say: "The backend driver should ignore the propery
if the backing storage does not expose this functionality."
> + *
> * discard-alignment
> * Values: <uint32_t>
> * Default Value: 0
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |