libgnttab: Add support for Linux dma-buf
PATCH v2 1/1 libgnttab: Add support for Linux dma-buf
From: Oleksandr Andrushchenko <[email protected]>
Add support for Linux grant device driver extension which allows converting existing dma-buf's into an array of grant references and vise versa. This is only implemented for Linux as other OSes have no Linux dma-buf support.
Bump gnttab library minor version to 3.
--- tools/include/xen-sys/Linux/gntdev.h | 106 +++++++++++++++++++++++ tools/libs/gnttab/Makefile | 2 +- tools/libs/gnttab/gnttab_core.c | 26 ++++++ tools/libs/gnttab/gnttab_unimp.c | 26 ++++++ tools/libs/gnttab/include/xengnttab.h | 61 ++++++++++++++ tools/libs/gnttab/libxengnttab.map | 8 ++ tools/libs/gnttab/linux.c | 117 ++++++++++++++++++++++++++ tools/libs/gnttab/minios.c | 26 ++++++ tools/libs/gnttab/private.h | 13 +++ 9 files changed, 384 insertions(+), 1 deletion(-)
tools/include/xen-sys/Linux/gntdev.h +106 -0
@@ -4,6 +4,7 @@* Interface to /dev/xen/gntdev. * * Copyright (c) 2007, D G Murray +* Copyright (c) 2018, Oleksandr Andrushchenko, EPAM Systems Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2
@@ -168,4 +169,109 @@ struct ioctl_gntdev_grant_copy { struct ioctl_gntdev_grant_copy_segment *segments; }; +/* +* Flags to be used while requesting memory mapping's backing storage +* to be allocated with DMA API. +*/ + +/* +* The buffer is backed with memory allocated with dma_alloc_wc. +*/ +#define GNTDEV_DMA_FLAG_WC (1 << 0) + +/* +* The buffer is backed with memory allocated with dma_alloc_coherent. +*/ +#define GNTDEV_DMA_FLAG_COHERENT (1 << 1) + +/* +* Create a dma-buf [1] from grant references @refs of count @count provided +* by the foreign domain @domid with flags @flags. +* +* By default dma-buf is backed by system memory pages, but by providing +* one of the GNTDEV_DMA_FLAG_XXX flags it can also be created as +* a DMA write-combine or coherent buffer, e.g. allocated with dma_alloc_wc/ +* dma_alloc_coherent. +* +* Returns 0 if dma-buf was successfully created and the corresponding +* dma-buf's file descriptor is returned in @fd. +* +* [1] https://elixir.bootlin.com/linux/latest/source/Documentation/driver-api/dma-buf.rst +*/ + +#define IOCTL_GNTDEV_DMABUF_EXP_FROM_REFS \ + _IOC(_IOC_NONE, 'G', 9, \ + sizeof(struct ioctl_gntdev_dmabuf_exp_from_refs)) +struct ioctl_gntdev_dmabuf_exp_from_refs { +/* IN parameters. */ +/* Specific options for this dma-buf: see GNTDEV_DMABUF_FLAG_XXX. */ +uint32_t flags; +/* Number of grant references in @refs array. */ +uint32_t count; +/* 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 ]; +}; + +/* +* This will block until the dma-buf with the file descriptor @fd is +* released. This is only valid for buffers created with +* IOCTL_GNTDEV_DMABUF_EXP_FROM_REFS. +* +* If withing @wait_to_ms milliseconds the buffer is not released +* then -ETIMEDOUT error is returned. +* If the buffer with file descriptor @fd does not exist or has already +* been released, then -ENOENT is returned. For valid file descriptors +* this must not be treated as error. +*/ +#define IOCTL_GNTDEV_DMABUF_EXP_WAIT_RELEASED \ + _IOC(_IOC_NONE, 'G', 10, \ + sizeof(struct ioctl_gntdev_dmabuf_exp_wait_released)) +struct ioctl_gntdev_dmabuf_exp_wait_released { +/* IN parameters */ +uint32_t fd; +uint32_t wait_to_ms; +}; + +/* +* 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. +*/ +#define IOCTL_GNTDEV_DMABUF_IMP_TO_REFS \ + _IOC(_IOC_NONE, 'G', 11, \ + sizeof(struct ioctl_gntdev_dmabuf_imp_to_refs)) +struct ioctl_gntdev_dmabuf_imp_to_refs { +/* 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. */ +/* Array of grant references of size @count. */ +uint32_t refs[1 ]; +}; + +/* +* 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 +* IOCTL_GNTDEV_DMABUF_IMP_TO_REFS. +*/ +#define IOCTL_GNTDEV_DMABUF_IMP_RELEASE \ + _IOC(_IOC_NONE, 'G', 12, \ + sizeof(struct ioctl_gntdev_dmabuf_imp_release)) +struct ioctl_gntdev_dmabuf_imp_release { +/* IN parameters */ +uint32_t fd; +uint32_t reserved; +}; +#endif /* __LINUX_PUBLIC_GNTDEV_H__ */
tools/libs/gnttab/Makefile +1 -1
@@ -2,7 +2,7 @@ XEN_ROOT = $(CURDIR)/../../.. include $(XEN_ROOT)/tools/Rules.mk MAJOR = 1 -MINOR = 2 +MINOR = 3 SHLIB_LDFLAGS += -Wl,--version-script=libxengnttab.map CFLAGS += -Werror -Wmissing-prototypes
tools/libs/gnttab/gnttab_core.c +26 -0
@@ -1,6 +1,7 @@/****************************************************************************** * * Copyright (c) 2007-2008, D G Murray <[email protected]> +* Copyright (c) 2018, Oleksandr Andrushchenko, EPAM Systems Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public
@@ -134,6 +135,31 @@ int xengnttab_grant_copy(xengnttab_handle *xgt, {return osdep_gnttab_grant_copy (xgt, count, segs); } + +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) +{ +return osdep_gnttab_dmabuf_exp_from_refs (xgt, domid, flags, count, + refs, fd); +} + +int xengnttab_dmabuf_exp_wait_released (xengnttab_handle *xgt,uint32_t fd, +uint32_t wait_to_ms) +{ +return osdep_gnttab_dmabuf_exp_wait_released (xgt, fd, wait_to_ms); +} + +int xengnttab_dmabuf_imp_to_refs (xengnttab_handle *xgt,uint32_t domid, +uint32_t fd,uint32_t count,uint32_t *refs) +{ +return osdep_gnttab_dmabuf_imp_to_refs (xgt, domid, fd, count, refs); +} + +int xengnttab_dmabuf_imp_release (xengnttab_handle *xgt,uint32_t fd) +{ +return osdep_gnttab_dmabuf_imp_release (xgt, fd); +}/* * Local variables: * mode: C
tools/libs/gnttab/gnttab_unimp.c +26 -0
@@ -1,6 +1,7 @@/****************************************************************************** * * Copyright (c) 2007-2008, D G Murray <[email protected]> +* Copyright (c) 2018, Oleksandr Andrushchenko, EPAM Systems Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public
@@ -84,6 +85,31 @@ int xengnttab_grant_copy(xengnttab_handle *xgt, {abort (); } + +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) +{ +abort (); +} + +int xengnttab_dmabuf_exp_wait_released (xengnttab_handle *xgt,uint32_t fd, +uint32_t wait_to_ms) +{ +abort (); +} + +int xengnttab_dmabuf_imp_to_refs (xengnttab_handle *xgt,uint32_t domid, +uint32_t fd,uint32_t count,uint32_t *refs) +{ +abort (); +} + +int xengnttab_dmabuf_imp_release (xengnttab_handle *xgt,uint32_t fd) +{ +abort (); +} +/* * Local variables: * mode: C
tools/libs/gnttab/include/xengnttab.h +61 -0
73 lines not on this page · raw message
tools/libs/gnttab/libxengnttab.map +8 -0
@@ -32,3 +32,11 @@ VERS_1.2 { xengnttab_fd; xengntshr_fd; } VERS_1.1; + +VERS_1.3 { + global: + xengnttab_dmabuf_exp_from_refs; + xengnttab_dmabuf_exp_wait_released; + xengnttab_dmabuf_imp_to_refs; + xengnttab_dmabuf_imp_release; +} VERS_1.2;
tools/libs/gnttab/linux.c +117 -0
128 lines not on this page · raw message
tools/libs/gnttab/minios.c +26 -0
@@ -112,6 +112,32 @@ int osdep_gnttab_grant_copy(xengnttab_handle *xgt, {return -1 ; } + +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) +{ +return -1 ; +} + +int osdep_gnttab_dmabuf_exp_wait_released (xengnttab_handle *xgt, +uint32_t fd,uint32_t wait_to_ms) +{ +return -1 ; +} + +int osdep_gnttab_dmabuf_imp_to_refs (xengnttab_handle *xgt,uint32_t domid, +uint32_t fd,uint32_t count, +uint32_t *refs) +{ +return -1 ; +} + +int osdep_gnttab_dmabuf_imp_release (xengnttab_handle *xgt,uint32_t fd) +{ +return -1 ; +} +/* * Local variables: * mode: C
tools/libs/gnttab/private.h +13 -0
@@ -35,6 +35,19 @@ int osdep_gnttab_grant_copy(xengnttab_handle *xgt,uint32_t count, xengnttab_grant_copy_segment_t *segs); +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_wait_released (xengnttab_handle *xgt, +uint32_t fd,uint32_t wait_to_ms); + +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_release (xengnttab_handle *xgt,uint32_t fd); +int osdep_gntshr_open (xengntshr_handle *xgs);int osdep_gntshr_close (xengntshr_handle *xgs);
Signature · 7 lines
2.18.0 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
Quoted 10 lines · Oleksandr Andrushchenko
From: Oleksandr Andrushchenko <[email protected]>
Add support for Linux grant device driver extension which allows converting existing dma-buf's into an array of grant references and vise versa. This is only implemented for Linux as other OSes have no Linux dma-buf support.
Bump gnttab library minor version to 3.
Signed-off-by Oleksandr Andrushchenko <[email protected]>
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel