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

Re: [PATCH 2/2] libgnttab: Add support for Linux dma-buf offset


  • To: Oleksandr Andrushchenko <andr2000@xxxxxxxxx>, "ian.jackson@xxxxxxxxxxxxx" <ian.jackson@xxxxxxxxxxxxx>, "wl@xxxxxxx" <wl@xxxxxxx>
  • From: Oleksandr Andrushchenko <Oleksandr_Andrushchenko@xxxxxxxx>
  • Date: Tue, 30 Jun 2020 09:42:51 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZAYV/fPERlBKmfHX9kr4E69CpyHZBcKQdUD7fHXbbHU=; b=ghfi9hn2UDX3Q2jql2aqQH3bx6ZQl+DSnzd5qOdfcgiF7Ur4w6Ot4IP82z6NcKebg4YgLjhz7N9uryKtotUaNy+te9tKE/YtGbbvr8b0GHjKy9wAus9h5q+XTpd5vPbph4jeGjQAWA0vEkzR4Fq6Hbmt4ZyigiotAyNOJxGNrzjNEz/jECgrnQlLOHpSScgGWHQ4rgK4g5q3uAd6a8H3SA0qbp11J7JYBzvtt2PwyaHTdysSpw62tf4xld54Y79p4Lu/jvBgV7RXnEJo6fifeDnnLcYLB+F3QtPa9s1zCKxgwKx2q40RBWOZl8uivt/NxejNv4wpVkSdVYPZmdVFcw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NcJyvzceWJxQvwzEJn/unQ/w7YHl8nRlNOG9AbUSDYFi4AGOZ6gSaBrJEzuf5rnuenWE8P6pGiF50ev2hgG2jSfrwkQWQ4J/rICy+1OXo78LEDmnzFX5jjRV5VljWu4S2/b1Mv2tYkEB84/H5wg0miRvntMWMSL8A/Vdx0KQIkE5rgoRg7VnUoi22mLlYm/1JoDmfRERw2EGdzH4XgeXI+hlkoLdo4FFnsjz2boheHqvlsegLJ1aowXmlN1uxs6sfiUVPhsV0Q3PjzguZ7blVnSE4uVubti5ijgwKzB71n+AUK8wluuVeRqNWdzrQY6jPoRYmUZTZwtYBYUt4MZ7Cg==
  • Authentication-results: gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=none action=none header.from=epam.com;
  • Cc: "jgross@xxxxxxxx" <jgross@xxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Tue, 30 Jun 2020 09:43:21 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHWLoWvWdjq7ozlqkeaZNP0F/2zoKjxKJiA
  • Thread-topic: [PATCH 2/2] libgnttab: Add support for Linux dma-buf offset

Ian, Wei, would you mind looking at the below please?

Thank you in advance,

Oleksandr

On 5/20/20 12:04 PM, Oleksandr Andrushchenko wrote:
> From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
>
> Add version 2 of the dma-buf ioctls which adds data_ofs parameter.
>
> dma-buf is backed by a scatter-gather table and has offset parameter
> which tells where the actual data starts. Relevant ioctls are extended
> to support that offset:
>    - when dma-buf is created (exported) from grant references then
>      data_ofs is used to set the offset field in the scatter list
>      of the new dma-buf
>    - when dma-buf is imported and grant references provided then
>      data_ofs is used to report that offset to user-space
>
> Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
> ---
>   tools/include/xen-sys/Linux/gntdev.h  | 53 +++++++++++++++++
>   tools/libs/gnttab/Makefile            |  2 +-
>   tools/libs/gnttab/freebsd.c           | 15 +++++
>   tools/libs/gnttab/gnttab_core.c       | 17 ++++++
>   tools/libs/gnttab/include/xengnttab.h | 13 ++++
>   tools/libs/gnttab/libxengnttab.map    |  6 ++
>   tools/libs/gnttab/linux.c             | 86 +++++++++++++++++++++++++++
>   tools/libs/gnttab/minios.c            | 15 +++++
>   tools/libs/gnttab/private.h           |  9 +++
>   9 files changed, 215 insertions(+), 1 deletion(-)
>
> diff --git a/tools/include/xen-sys/Linux/gntdev.h 
> b/tools/include/xen-sys/Linux/gntdev.h
> index d16076044c71..0c43393cbee5 100644
> --- a/tools/include/xen-sys/Linux/gntdev.h
> +++ b/tools/include/xen-sys/Linux/gntdev.h
> @@ -274,4 +274,57 @@ struct ioctl_gntdev_dmabuf_imp_release {
>       uint32_t reserved;
>   };
>   
> +/*
> + * Version 2 of the ioctls adds @data_ofs parameter.
> + *
> + * dma-buf is backed by a scatter-gather table and has offset
> + * parameter which tells where the actual data starts.
> + * Relevant ioctls are extended to support that offset:
> + *   - when dma-buf is created (exported) from grant references then
> + *     @data_ofs is used to set the offset field in the scatter list
> + *     of the new dma-buf
> + *   - when dma-buf is imported and grant references are provided then
> + *     @data_ofs is used to report that offset to user-space
> + */
> +#define IOCTL_GNTDEV_DMABUF_EXP_FROM_REFS_V2 \
> +    _IOC(_IOC_NONE, 'G', 13, \
> +         sizeof(struct ioctl_gntdev_dmabuf_exp_from_refs_v2))
> +struct ioctl_gntdev_dmabuf_exp_from_refs_v2 {
> +    /* IN parameters. */
> +    /* Specific options for this dma-buf: see GNTDEV_DMA_FLAG_XXX. */
> +    uint32_t flags;
> +    /* Number of grant references in @refs array. */
> +    uint32_t count;
> +    /* Offset of the data in the dma-buf. */
> +    uint32_t data_ofs;
> +    /* OUT parameters. */
> +    /* File descriptor of the dma-buf. */
> +    uint32_t fd;
> +    /* The domain ID of the grant references to be mapped. */
> +    uint32_t domid;
> +    /* Variable IN parameter. */
> +    /* Array of grant references of size @count. */
> +    uint32_t refs[1];
> +};
> +
> +#define IOCTL_GNTDEV_DMABUF_IMP_TO_REFS_V2 \
> +    _IOC(_IOC_NONE, 'G', 14, \
> +         sizeof(struct ioctl_gntdev_dmabuf_imp_to_refs_v2))
> +struct ioctl_gntdev_dmabuf_imp_to_refs_v2 {
> +    /* IN parameters. */
> +    /* File descriptor of the dma-buf. */
> +    uint32_t fd;
> +    /* Number of grant references in @refs array. */
> +    uint32_t count;
> +    /* The domain ID for which references to be granted. */
> +    uint32_t domid;
> +    /* Reserved - must be zero. */
> +    uint32_t reserved;
> +    /* OUT parameters. */
> +    /* Offset of the data in the dma-buf. */
> +    uint32_t data_ofs;
> +    /* Array of grant references of size @count. */
> +    uint32_t refs[1];
> +};
> +
>   #endif /* __LINUX_PUBLIC_GNTDEV_H__ */
> diff --git a/tools/libs/gnttab/Makefile b/tools/libs/gnttab/Makefile
> index 2da8fbbb7f6f..5ee2d965214f 100644
> --- a/tools/libs/gnttab/Makefile
> +++ b/tools/libs/gnttab/Makefile
> @@ -2,7 +2,7 @@ XEN_ROOT = $(CURDIR)/../../..
>   include $(XEN_ROOT)/tools/Rules.mk
>   
>   MAJOR    = 1
> -MINOR    = 2
> +MINOR    = 3
>   LIBNAME  := gnttab
>   USELIBS  := toollog toolcore
>   
> diff --git a/tools/libs/gnttab/freebsd.c b/tools/libs/gnttab/freebsd.c
> index 886b588303a0..baf0f60aa4d3 100644
> --- a/tools/libs/gnttab/freebsd.c
> +++ b/tools/libs/gnttab/freebsd.c
> @@ -319,6 +319,14 @@ int osdep_gnttab_dmabuf_exp_from_refs(xengnttab_handle 
> *xgt, uint32_t domid,
>       abort();
>   }
>   
> +int osdep_gnttab_dmabuf_exp_from_refs_v2(xengnttab_handle *xgt, uint32_t 
> domid,
> +                                         uint32_t flags, uint32_t count,
> +                                         const uint32_t *refs,
> +                                         uint32_t *dmabuf_fd, uint32_t 
> data_ofs)
> +{
> +    abort();
> +}
> +
>   int osdep_gnttab_dmabuf_exp_wait_released(xengnttab_handle *xgt,
>                                             uint32_t fd, uint32_t wait_to_ms)
>   {
> @@ -331,6 +339,13 @@ int osdep_gnttab_dmabuf_imp_to_refs(xengnttab_handle 
> *xgt, uint32_t domid,
>       abort();
>   }
>   
> +int osdep_gnttab_dmabuf_imp_to_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                       uint32_t fd, uint32_t count,
> +                                       uint32_t *refs, uint32_t *data_ofs)
> +{
> +    abort();
> +}
> +
>   int osdep_gnttab_dmabuf_imp_release(xengnttab_handle *xgt, uint32_t fd)
>   {
>       abort();
> diff --git a/tools/libs/gnttab/gnttab_core.c b/tools/libs/gnttab/gnttab_core.c
> index 92e7228a2671..3af3cec80045 100644
> --- a/tools/libs/gnttab/gnttab_core.c
> +++ b/tools/libs/gnttab/gnttab_core.c
> @@ -144,6 +144,15 @@ int xengnttab_dmabuf_exp_from_refs(xengnttab_handle 
> *xgt, uint32_t domid,
>                                                refs, fd);
>   }
>   
> +int xengnttab_dmabuf_exp_from_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                      uint32_t flags, uint32_t count,
> +                                      const uint32_t *refs, uint32_t *fd,
> +                                      uint32_t data_ofs)
> +{
> +    return osdep_gnttab_dmabuf_exp_from_refs_v2(xgt, domid, flags, count,
> +                                                refs, fd, data_ofs);
> +}
> +
>   int xengnttab_dmabuf_exp_wait_released(xengnttab_handle *xgt, uint32_t fd,
>                                          uint32_t wait_to_ms)
>   {
> @@ -156,6 +165,14 @@ int xengnttab_dmabuf_imp_to_refs(xengnttab_handle *xgt, 
> uint32_t domid,
>       return osdep_gnttab_dmabuf_imp_to_refs(xgt, domid, fd, count, refs);
>   }
>   
> +int xengnttab_dmabuf_imp_to_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                    uint32_t fd, uint32_t count, uint32_t 
> *refs,
> +                                    uint32_t *data_ofs)
> +{
> +    return osdep_gnttab_dmabuf_imp_to_refs_v2(xgt, domid, fd, count, refs,
> +                                              data_ofs);
> +}
> +
>   int xengnttab_dmabuf_imp_release(xengnttab_handle *xgt, uint32_t fd)
>   {
>       return osdep_gnttab_dmabuf_imp_release(xgt, fd);
> diff --git a/tools/libs/gnttab/include/xengnttab.h 
> b/tools/libs/gnttab/include/xengnttab.h
> index 111fc88caeb3..0956bd91e0df 100644
> --- a/tools/libs/gnttab/include/xengnttab.h
> +++ b/tools/libs/gnttab/include/xengnttab.h
> @@ -322,12 +322,19 @@ int xengnttab_grant_copy(xengnttab_handle *xgt,
>    * Returns 0 if dma-buf was successfully created and the corresponding
>    * dma-buf's file descriptor is returned in @fd.
>    *
> + * Version 2 also accepts @data_ofs offset of the data in the buffer.
> + *
>    * [1] 
> https://urldefense.com/v3/__https://elixir.bootlin.com/linux/latest/source/Documentation/driver-api/dma-buf.rst__;!!GF_29dbcQIUBPA!nBABkPpEyQW1_5nPE9nbyCbEaCvRjXQxOBKRpRSIGUgAdqcc0VCm4jL-9cCabcWNDS4bc_DR6Q$
>    */
>   int xengnttab_dmabuf_exp_from_refs(xengnttab_handle *xgt, uint32_t domid,
>                                      uint32_t flags, uint32_t count,
>                                      const uint32_t *refs, uint32_t *fd);
>   
> +int xengnttab_dmabuf_exp_from_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                      uint32_t flags, uint32_t count,
> +                                      const uint32_t *refs, uint32_t *fd,
> +                                      uint32_t data_ofs);
> +
>   /*
>    * This will block until the dma-buf with the file descriptor @fd is
>    * released. This is only valid for buffers created with
> @@ -345,10 +352,16 @@ int xengnttab_dmabuf_exp_wait_released(xengnttab_handle 
> *xgt, uint32_t fd,
>   /*
>    * Import a dma-buf with file descriptor @fd and export granted references
>    * to the pages of that dma-buf into array @refs of size @count.
> + *
> + * Version 2 also provides @data_ofs offset of the data in the buffer.
>    */
>   int xengnttab_dmabuf_imp_to_refs(xengnttab_handle *xgt, uint32_t domid,
>                                    uint32_t fd, uint32_t count, uint32_t 
> *refs);
>   
> +int xengnttab_dmabuf_imp_to_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                    uint32_t fd, uint32_t count, uint32_t 
> *refs,
> +                                    uint32_t *data_ofs);
> +
>   /*
>    * This will close all references to an imported buffer, so it can be
>    * released by the owner. This is only valid for buffers created with
> diff --git a/tools/libs/gnttab/libxengnttab.map 
> b/tools/libs/gnttab/libxengnttab.map
> index d2a9b7e18bea..ddf77e064b08 100644
> --- a/tools/libs/gnttab/libxengnttab.map
> +++ b/tools/libs/gnttab/libxengnttab.map
> @@ -36,3 +36,9 @@ VERS_1.2 {
>               xengnttab_dmabuf_imp_to_refs;
>               xengnttab_dmabuf_imp_release;
>   } VERS_1.1;
> +
> +VERS_1.3 {
> +    global:
> +             xengnttab_dmabuf_exp_from_refs_v2;
> +             xengnttab_dmabuf_imp_to_refs_v2;
> +} VERS_1.2;
> diff --git a/tools/libs/gnttab/linux.c b/tools/libs/gnttab/linux.c
> index a01bb6c698c6..75e249fb3202 100644
> --- a/tools/libs/gnttab/linux.c
> +++ b/tools/libs/gnttab/linux.c
> @@ -352,6 +352,51 @@ out:
>       return rc;
>   }
>   
> +int osdep_gnttab_dmabuf_exp_from_refs_v2(xengnttab_handle *xgt, uint32_t 
> domid,
> +                                         uint32_t flags, uint32_t count,
> +                                         const uint32_t *refs,
> +                                         uint32_t *dmabuf_fd,
> +                                         uint32_t data_ofs)
> +{
> +    struct ioctl_gntdev_dmabuf_exp_from_refs_v2 *from_refs_v2 = NULL;
> +    int rc = -1;
> +
> +    if ( !count )
> +    {
> +        errno = EINVAL;
> +        goto out;
> +    }
> +
> +    from_refs_v2 = malloc(sizeof(*from_refs_v2) +
> +                          (count - 1) * sizeof(from_refs_v2->refs[0]));
> +    if ( !from_refs_v2 )
> +    {
> +        errno = ENOMEM;
> +        goto out;
> +    }
> +
> +    from_refs_v2->flags = flags;
> +    from_refs_v2->count = count;
> +    from_refs_v2->domid = domid;
> +    from_refs_v2->data_ofs = data_ofs;
> +
> +    memcpy(from_refs_v2->refs, refs, count * sizeof(from_refs_v2->refs[0]));
> +
> +    if ( (rc = ioctl(xgt->fd, IOCTL_GNTDEV_DMABUF_EXP_FROM_REFS_V2,
> +                     from_refs_v2)) )
> +    {
> +        GTERROR(xgt->logger, "ioctl DMABUF_EXP_FROM_REFS_V2 failed");
> +        goto out;
> +    }
> +
> +    *dmabuf_fd = from_refs_v2->fd;
> +    rc = 0;
> +
> +out:
> +    free(from_refs_v2);
> +    return rc;
> +}
> +
>   int osdep_gnttab_dmabuf_exp_wait_released(xengnttab_handle *xgt,
>                                             uint32_t fd, uint32_t wait_to_ms)
>   {
> @@ -413,6 +458,47 @@ out:
>       return rc;
>   }
>   
> +int osdep_gnttab_dmabuf_imp_to_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                       uint32_t fd, uint32_t count,
> +                                       uint32_t *refs,
> +                                       uint32_t *data_ofs)
> +{
> +    struct ioctl_gntdev_dmabuf_imp_to_refs_v2 *to_refs_v2 = NULL;
> +    int rc = -1;
> +
> +    if ( !count )
> +    {
> +        errno = EINVAL;
> +        goto out;
> +    }
> +
> +    to_refs_v2 = malloc(sizeof(*to_refs_v2) +
> +                        (count - 1) * sizeof(to_refs_v2->refs[0]));
> +    if ( !to_refs_v2 )
> +    {
> +        errno = ENOMEM;
> +        goto out;
> +    }
> +
> +    to_refs_v2->fd = fd;
> +    to_refs_v2->count = count;
> +    to_refs_v2->domid = domid;
> +
> +    if ( (rc = ioctl(xgt->fd, IOCTL_GNTDEV_DMABUF_IMP_TO_REFS_V2, 
> to_refs_v2)) )
> +    {
> +        GTERROR(xgt->logger, "ioctl DMABUF_IMP_TO_REFS_V2 failed");
> +        goto out;
> +    }
> +
> +    memcpy(refs, to_refs_v2->refs, count * sizeof(*refs));
> +    *data_ofs = to_refs_v2->data_ofs;
> +    rc = 0;
> +
> +out:
> +    free(to_refs_v2);
> +    return rc;
> +}
> +
>   int osdep_gnttab_dmabuf_imp_release(xengnttab_handle *xgt, uint32_t fd)
>   {
>       struct ioctl_gntdev_dmabuf_imp_release release;
> diff --git a/tools/libs/gnttab/minios.c b/tools/libs/gnttab/minios.c
> index f78caadd3043..298416b2a98d 100644
> --- a/tools/libs/gnttab/minios.c
> +++ b/tools/libs/gnttab/minios.c
> @@ -120,6 +120,14 @@ int osdep_gnttab_dmabuf_exp_from_refs(xengnttab_handle 
> *xgt, uint32_t domid,
>       return -1;
>   }
>   
> +int osdep_gnttab_dmabuf_exp_from_refs_v2(xengnttab_handle *xgt, uint32_t 
> domid,
> +                                         uint32_t flags, uint32_t count,
> +                                         const uint32_t *refs, uint32_t *fd,
> +                                         uint32_t data_ofs)
> +{
> +    return -1;
> +}
> +
>   int osdep_gnttab_dmabuf_exp_wait_released(xengnttab_handle *xgt,
>                                             uint32_t fd, uint32_t wait_to_ms)
>   {
> @@ -133,6 +141,13 @@ int osdep_gnttab_dmabuf_imp_to_refs(xengnttab_handle 
> *xgt, uint32_t domid,
>       return -1;
>   }
>   
> +int osdep_gnttab_dmabuf_imp_to_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                       uint32_t fd, uint32_t count,
> +                                       uint32_t *refs, uint32_t *data_ofs)
> +{
> +    return -1;
> +}
> +
>   int osdep_gnttab_dmabuf_imp_release(xengnttab_handle *xgt, uint32_t fd)
>   {
>       return -1;
> diff --git a/tools/libs/gnttab/private.h b/tools/libs/gnttab/private.h
> index c5e23639b141..07271637f609 100644
> --- a/tools/libs/gnttab/private.h
> +++ b/tools/libs/gnttab/private.h
> @@ -39,6 +39,11 @@ int osdep_gnttab_dmabuf_exp_from_refs(xengnttab_handle 
> *xgt, uint32_t domid,
>                                         uint32_t flags, uint32_t count,
>                                         const uint32_t *refs, uint32_t *fd);
>   
> +int osdep_gnttab_dmabuf_exp_from_refs_v2(xengnttab_handle *xgt, uint32_t 
> domid,
> +                                         uint32_t flags, uint32_t count,
> +                                         const uint32_t *refs, uint32_t *fd,
> +                                         uint32_t data_ofs);
> +
>   int osdep_gnttab_dmabuf_exp_wait_released(xengnttab_handle *xgt,
>                                             uint32_t fd, uint32_t wait_to_ms);
>   
> @@ -46,6 +51,10 @@ int osdep_gnttab_dmabuf_imp_to_refs(xengnttab_handle *xgt, 
> uint32_t domid,
>                                       uint32_t fd, uint32_t count,
>                                       uint32_t *refs);
>   
> +int osdep_gnttab_dmabuf_imp_to_refs_v2(xengnttab_handle *xgt, uint32_t domid,
> +                                       uint32_t fd, uint32_t count,
> +                                       uint32_t *refs, uint32_t *data_ofs);
> +
>   int osdep_gnttab_dmabuf_imp_release(xengnttab_handle *xgt, uint32_t fd);
>   
>   int osdep_gntshr_open(xengntshr_handle *xgs);

 


Rackspace

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