xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Oleksandr Andrushchenko <Oleksandr_Andrushchenko@epam.com>
To: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
	"ian.jackson@citrix.com" <ian.jackson@citrix.com>,
	"wl@xen.org" <wl@xen.org>
Cc: Oleksandr Andrushchenko <andr2000@gmail.com>,
	Artem Mygaiev <Artem_Mygaiev@epam.com>
Subject: Re: [PATCH 2/2] libgnttab: Add support for Linux dma-buf offset
Date: Fri, 31 Jul 2020 10:53:18 +0000	[thread overview]
Message-ID: <ca641b0d-297d-1d1e-ecc7-0b35a2aa7c91@epam.com> (raw)
In-Reply-To: <20200520090425.28558-3-andr2000@gmail.com>

Hello, Ian, Wei!

Initially I have sent this patch as a part of the series for the display protocol changes,

but later decided to split. At the moment the protocol changes are already

accepted, but this part is still missing feedback and is still wanted.

I would really appreciate if you could have a look at the change below.

Thank you in advance,

Oleksandr Andrushchenko

On 5/20/20 12:04 PM, Oleksandr Andrushchenko wrote:
> From: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
>
> 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@epam.com>
> ---
>   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://elixir.bootlin.com/linux/latest/source/Documentation/driver-api/dma-buf.rst
>    */
>   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);

  parent reply	other threads:[~2020-07-31 10:53 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-20  9:04 [PATCH 0/2] displif: Protocol version 2 Oleksandr Andrushchenko
2020-05-20  9:04 ` [PATCH 1/2] xen/displif: " Oleksandr Andrushchenko
2020-06-29  7:02   ` Jürgen Groß
2020-06-30  6:13     ` Oleksandr Andrushchenko
2020-06-30  7:03       ` Jürgen Groß
2020-06-30  7:09         ` Oleksandr Andrushchenko
2020-06-30  7:30           ` Jürgen Groß
2020-06-30  7:39             ` Oleksandr Andrushchenko
2020-06-30  7:57               ` Jürgen Groß
2020-05-20  9:04 ` [PATCH 2/2] libgnttab: Add support for Linux dma-buf offset Oleksandr Andrushchenko
2020-06-30  9:42   ` Oleksandr Andrushchenko
2020-07-31 10:53   ` Oleksandr Andrushchenko [this message]
2020-09-28 15:20   ` Ian Jackson
2020-10-01  6:35     ` Oleksandr Andrushchenko
2021-06-08  7:54       ` Oleksandr Andrushchenko
2020-06-01 16:01 ` [PATCH 0/2] displif: Protocol version 2 Oleksandr Andrushchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ca641b0d-297d-1d1e-ecc7-0b35a2aa7c91@epam.com \
    --to=oleksandr_andrushchenko@epam.com \
    --cc=Artem_Mygaiev@epam.com \
    --cc=andr2000@gmail.com \
    --cc=ian.jackson@citrix.com \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).