I'm tempted to call this new api ion_share_dma_buf and rename the old one to ion_share_dma_buf_fd while the number of users is still small. I think it's clearer. Otherwise this patch looks good.
Hi Rebecca,
Is this patch accepted for ion mainline or do you have more comments/questions?
/Johan Mossberg
On 12/13/2012 10:24 AM, Johan Mossberg wrote:
> ion_share_dma_buf_kernel enables you to share ion buffers via dma buf
> for kernel only use cases. Useful for example when a GPU driver using
> ion wants to share its output buffers with a 3d party display
> controller driver supporting dma buf.
>
> Signed-off-by: Johan Mossberg <johan.mossberg@stericsson.com>
> ---
> drivers/gpu/ion/ion.c | 22 ++++++++++++++++++----
> include/linux/ion.h | 8 ++++++++
> 2 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/ion/ion.c b/drivers/gpu/ion/ion.c
> index 3872095..e7b0d0b 100644
> --- a/drivers/gpu/ion/ion.c
> +++ b/drivers/gpu/ion/ion.c
> @@ -955,19 +955,19 @@ struct dma_buf_ops dma_buf_ops = {
> .kunmap = ion_dma_buf_kunmap,
> };
>
> -int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
> +struct dma_buf *ion_share_dma_buf_kernel(struct ion_client *client,
> + struct ion_handle *handle)
> {
> struct ion_buffer *buffer;
> struct dma_buf *dmabuf;
> bool valid_handle;
> - int fd;
>
> mutex_lock(&client->lock);
> valid_handle = ion_handle_validate(client, handle);
> mutex_unlock(&client->lock);
> if (!valid_handle) {
> WARN(1, "%s: invalid handle passed to share.\n", __func__);
> - return -EINVAL;
> + return ERR_PTR(-EINVAL);
> }
>
> buffer = handle->buffer;
> @@ -975,8 +975,22 @@ int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
> dmabuf = dma_buf_export(buffer, &dma_buf_ops, buffer->size, O_RDWR);
> if (IS_ERR(dmabuf)) {
> ion_buffer_put(buffer);
> - return PTR_ERR(dmabuf);
> + return dmabuf;
> }
> +
> + return dmabuf;
> +}
> +EXPORT_SYMBOL(ion_share_dma_buf_kernel);
> +
> +int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
> +{
> + struct dma_buf *dmabuf;
> + int fd;
> +
> + dmabuf = ion_share_dma_buf_kernel(client, handle);
> + if (IS_ERR(dmabuf))
> + return PTR_ERR(dmabuf);
> +
> fd = dma_buf_fd(dmabuf, O_CLOEXEC);
> if (fd < 0)
> dma_buf_put(dmabuf);
> diff --git a/include/linux/ion.h b/include/linux/ion.h
> index a7d399c..8720e9b 100644
> --- a/include/linux/ion.h
> +++ b/include/linux/ion.h
> @@ -205,6 +205,14 @@ void *ion_map_kernel(struct ion_client *client, struct ion_handle *handle);
> void ion_unmap_kernel(struct ion_client *client, struct ion_handle *handle);
>
> /**
> + * ion_share_dma_buf_kernel() - share buffer as dma-buf
> + * @client: the client
> + * @handle: the handle
> + */
> +struct dma_buf *ion_share_dma_buf_kernel(struct ion_client *client,
> + struct ion_handle *buf);
> +
> +/**
> * ion_share_dma_buf() - given an ion client, create a dma-buf fd
> * @client: the client
> * @handle: the handle
> --
> 1.8.0
>
>
> _______________________________________________
> Linaro-mm-sig mailing list
> Linaro-mm-sig@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/linaro-mm-sig
>
>