[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] tools/libxl: add support for emulated NVMe drives



> -----Original Message-----
> From: Paul Durrant [mailto:paul.durrant@xxxxxxxxxx]
> Sent: 13 January 2017 13:57
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
> Subject: [PATCH] tools/libxl: add support for emulated NVMe drives
> 
> Upstream QEMU supports emulation of NVM Express a.k.a. NVMe drives.
> 
> This patch adds a new vdev type into libxl to allow such drives to be
> presented to HVM guests. Because the purpose of the new vdev is purely
> to configure emulation, the syntax only supports specification of
> whole disks. Also there is no need to introduce a new concrete VBD
> encoding for NVMe drives.
> 
> NOTE: QEMU's emulation only supports a single NVMe namespace, so the
>       vdev syntax does not include specification of a namespace.
>       Also, current versions of SeaBIOS do not support booting from
>       NVMe devices, so the vdev should only be used for secondary
>       drives.
> 
> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> ---

Sorry, forgot to cc maintainers... will re-send.

  Paul

>  docs/man/xen-vbd-interface.markdown.7 | 15 ++++++++-------
>  docs/man/xl-disk-configuration.pod.5  |  4 ++--
>  tools/libxl/libxl_device.c            |  8 ++++++++
>  tools/libxl/libxl_dm.c                |  6 ++++++
>  4 files changed, 24 insertions(+), 9 deletions(-)
> 
> diff --git a/docs/man/xen-vbd-interface.markdown.7 b/docs/man/xen-vbd-
> interface.markdown.7
> index 1c996bf..8fd378c 100644
> --- a/docs/man/xen-vbd-interface.markdown.7
> +++ b/docs/man/xen-vbd-interface.markdown.7
> @@ -8,12 +8,12 @@ emulated IDE, AHCI or SCSI disks.
>  The abstract interface involves specifying, for each block device:
> 
>   * Nominal disk type: Xen virtual disk (aka xvd*, the default); SCSI
> -   (sd*); IDE or AHCI (hd*).
> +   (sd*); IDE or AHCI (hd*); NVMe.
> 
> -   For HVM guests, each whole-disk hd* and and sd* device is made
> -   available _both_ via emulated IDE resp. SCSI controller, _and_ as a
> -   Xen VBD.  The HVM guest is entitled to assume that the IDE or SCSI
> -   disks available via the emulated IDE controller target the same
> +   For HVM guests, each whole-disk hd*, sd* or nvme* device is made
> +   available _both_ via emulated IDE, SCSI controller or NVMe drive
> +   respectively _and_ as a Xen VBD.  The HVM guest is entitled to
> +   assume that the disks available via the emulation target the same
>     underlying devices as the corresponding Xen VBD (ie, multipath).
>     In hd* case with hdtype=ahci, disk will be AHCI via emulated
>     ich9 disk controller.
> @@ -42,8 +42,7 @@ The abstract interface involves specifying, for each block
> device:
>     treat each vbd as it would a partition or slice or LVM volume (for
>     example by putting or expecting a filesystem on it).
> 
> -   Non-whole disk devices cannot be passed through to HVM guests via
> -   the emulated IDE or SCSI controllers.
> +   Only whole disk devices can be emulated for HVM guests.
> 
> 
>  Configuration file syntax
> @@ -56,6 +55,7 @@ The config file syntaxes are, for example
>         d536p37  xvdtq37  Xen virtual disk 536 partition 37
>         sdb3              SCSI disk 1 partition 3
>         hdc2              IDE disk 2 partition 2
> +       nvme0             NVMe disk 0 (whole disk only)
> 
>  The d*p* syntax is not supported by xm/xend.
> 
> @@ -78,6 +78,7 @@ encodes the information above as follows:
>       8 << 8 | disk << 4 | partition      sd, disks and partitions up to 15
>       3 << 8 | disk << 6 | partition      hd, disks 0..1, partitions 0..63
>      22 << 8 | (disk-2) << 6 | partition  hd, disks 2..3, partitions 0..63
> +    1 << 28 | disk << 8                  nvme, all disks, whole disk only
>      2 << 28 onwards                      reserved for future use
>     other values less than 1 << 28        deprecated / reserved
> 
> diff --git a/docs/man/xl-disk-configuration.pod.5 b/docs/man/xl-disk-
> configuration.pod.5
> index d3eedc1..c40418e 100644
> --- a/docs/man/xl-disk-configuration.pod.5
> +++ b/docs/man/xl-disk-configuration.pod.5
> @@ -127,8 +127,8 @@ designation in some specifications).  L<xen-vbd-
> interface(7)>
> 
>  =item Supported values
> 
> -hd[x], xvd[x], sd[x] etc.  Please refer to the above specification for
> -further details.
> +hd[x], xvd[x], sd[x], nvme[x] etc.  Please refer to the above specification
> +for further details.
> 
>  =item Deprecated values
> 
> diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
> index b2aeefc..63a738c 100644
> --- a/tools/libxl/libxl_device.c
> +++ b/tools/libxl/libxl_device.c
> @@ -532,6 +532,14 @@ int libxl__device_disk_dev_number(const char
> *virtpath, int *pdisk,
>          if (ppartition) *ppartition = partition;
>          return (8 << 8) | (disk << 4) | partition;
>      }
> +    if (!memcmp(virtpath, "nvme", 4)) {
> +        disk = strtoul(virtpath + 4, &ep, 10);
> +        if (*ep)
> +            return -1;
> +        if (pdisk) *pdisk = disk;
> +        if (ppartition) *ppartition = 0;
> +        return (1 << 28) | (disk << 8);
> +    }
>      return -1;
>  }
> 
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index 281058d..980dad1 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -1430,6 +1430,12 @@ static int
> libxl__build_device_model_args_new(libxl__gc *gc,
>                                                          format,
>                                                          &disks[i],
>                                                          colo_mode);
> +                } else if (strncmp(disks[i].vdev, "nvme", 4) == 0) {
> +                    flexarray_vappend(dm_args,
> +                        "-drive",  GCSPRINTF("file=%s,if=none,id=nvmedisk-
> %d,format=%s,cache=writeback", target_path, disk, format),
> +                        "-device", 
> GCSPRINTF("nvme,drive=nvmedisk-%d,serial=%d",
> disk, disk),
> +                        NULL);
> +                    continue;
>                  } else if (disk < 6 && b_info->u.hvm.hdtype == 
> LIBXL_HDTYPE_AHCI)
> {
>                      if (!disks[i].readwrite) {
>                          LOGD(ERROR, guest_domid,
> --
> 2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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