[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.