All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomasz Stanislawski <t.stanislaws@samsung.com>
Cc: ben@bwidawsk.net, daniel.vetter@ffwll.ch,
	dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
	kyungmin.park@samsung.com, sakari.ailus@iki.fi,
	airlied@redhat.com, m.szyprowski@samsung.com
Subject: Re: [RFCv2 PATCH 7/9] v4l: vb2-dma-contig: change map/unmap behaviour
Date: Thu, 22 Mar 2012 13:15:57 +0100	[thread overview]
Message-ID: <3831740.PZSgqxDSC2@avalon> (raw)
In-Reply-To: <1331633827-503-8-git-send-email-t.stanislaws@samsung.com>

Hi Tomasz,

Thanks for the patch.

On Tuesday 13 March 2012 11:17:05 Tomasz Stanislawski wrote:
> The DMABUF documentation says that the map_dma_buf callback should return
> scatterlist that is mapped into a caller's address space. In practice,
> almost none of existing implementations of DMABUF exporter does it.  This
> patch breaks the DMABUF specification in order to allow exchange DMABUF
> buffers between other APIs like DRM.

Then it's time to fix the spec, and squash 6/9 and 7/9 together (I started 
reviewing 6/9 and the implementation puzzled me until I saw the "fixes" in 
7/9).

We need to agree on a behaviour for the mapping API. I've thought from the 
beginning that mapping the buffer to the importer's device address space 
should be the responsibility of the importer, not the exporter. If we move to 
that approach, we should probably rename the map and unmap functions as they 
won't deal with mappings anymore. I recall that pin/unpin were proposed at 
some point (possible during a meeting at the ELC).

One possible issue with handling mappings in the importer is that the exporter 
won't be able to implement any mapping/unmapping hack that might be needed. As 
the DMA SG API doesn't seem to support VM_PFNMAP memory (see the explanation 
in my reply to 2/9), we will be left without a solution if an exporter uses 
memory not backed with struct page.

> Signed-off-by: Tomasz Stanislawski <t.stanislaws@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> ---
>  drivers/media/video/videobuf2-dma-contig.c |   64
> ++++++++++++---------------- 1 files changed, 27 insertions(+), 37
> deletions(-)
> 
> diff --git a/drivers/media/video/videobuf2-dma-contig.c
> b/drivers/media/video/videobuf2-dma-contig.c index d95b23a..32bb16b 100644
> --- a/drivers/media/video/videobuf2-dma-contig.c
> +++ b/drivers/media/video/videobuf2-dma-contig.c
> @@ -315,11 +315,6 @@ static int vb2_dc_mmap(void *buf_priv, struct
> vm_area_struct *vma) /*         DMABUF ops for exporters          */
>  /*********************************************/
> 
> -struct vb2_dc_attachment {
> -	struct sg_table sgt;
> -	enum dma_data_direction dir;
> -};
> -
>  static int vb2_dc_dmabuf_ops_attach(struct dma_buf *dbuf, struct device
> *dev, struct dma_buf_attachment *dbuf_attach)
>  {
> @@ -330,17 +325,13 @@ static int vb2_dc_dmabuf_ops_attach(struct dma_buf
> *dbuf, struct device *dev, static void vb2_dc_dmabuf_ops_detach(struct
> dma_buf *dbuf,
>  	struct dma_buf_attachment *db_attach)
>  {
> -	struct vb2_dc_attachment *attach = db_attach->priv;
> -	struct sg_table *sgt;
> +	struct sg_table *sgt = db_attach->priv;
> 
> -	if (!attach)
> +	if (!sgt)
>  		return;
> 
> -	sgt = &attach->sgt;
> -
> -	dma_unmap_sg(db_attach->dev, sgt->sgl, sgt->nents, attach->dir);
>  	sg_free_table(sgt);
> -	kfree(attach);
> +	kfree(sgt);
>  	db_attach->priv = NULL;
>  }
> 
> @@ -349,26 +340,22 @@ static struct sg_table *vb2_dc_dmabuf_ops_map(
>  {
>  	struct dma_buf *dbuf = db_attach->dmabuf;
>  	struct vb2_dc_buf *buf = dbuf->priv;
> -	struct vb2_dc_attachment *attach = db_attach->priv;
> -	struct sg_table *sgt;
> +	struct sg_table *sgt = db_attach->priv;
>  	struct scatterlist *rd, *wr;
>  	int i, ret;
> 
>  	/* return previously mapped sg table */
> -	if (attach)
> -		return &attach->sgt;
> +	if (sgt)
> +		return sgt;
> 
> -	attach = kzalloc(sizeof *attach, GFP_KERNEL);
> -	if (!attach)
> +	sgt = kzalloc(sizeof *sgt, GFP_KERNEL);
> +	if (!sgt)
>  		return ERR_PTR(-ENOMEM);
> 
> -	sgt = &attach->sgt;
> -	attach->dir = dir;
> -
>  	/* copying the buf->base_sgt to attachment */
>  	ret = sg_alloc_table(sgt, buf->sgt_base->orig_nents, GFP_KERNEL);
>  	if (ret) {
> -		kfree(attach);
> +		kfree(sgt);
>  		return ERR_PTR(-ENOMEM);
>  	}
> 
> @@ -380,16 +367,7 @@ static struct sg_table *vb2_dc_dmabuf_ops_map(
>  		wr = sg_next(wr);
>  	}
> 
> -	/* mapping new sglist to the client */
> -	ret = dma_map_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, dir);
> -	if (ret <= 0) {
> -		printk(KERN_ERR "failed to map scatterlist\n");
> -		sg_free_table(sgt);
> -		kfree(attach);
> -		return ERR_PTR(-EIO);
> -	}
> -
> -	db_attach->priv = attach;
> +	db_attach->priv = sgt;
> 
>  	return sgt;
>  }
> @@ -623,7 +601,7 @@ static int vb2_dc_map_dmabuf(void *mem_priv)
>  	struct vb2_dc_buf *buf = mem_priv;
>  	struct sg_table *sgt;
>  	unsigned long contig_size;
> -	int ret = 0;
> +	int ret = -EFAULT;
> 
>  	if (WARN_ON(!buf->db_attach)) {
>  		printk(KERN_ERR "trying to pin a non attached buffer\n");
> @@ -642,12 +620,20 @@ static int vb2_dc_map_dmabuf(void *mem_priv)
>  		return -EINVAL;
>  	}
> 
> +	/* mapping new sglist to the client */
> +	sgt->nents = dma_map_sg(buf->dev, sgt->sgl, sgt->orig_nents,
> +		buf->dma_dir);
> +	if (sgt->nents <= 0) {
> +		printk(KERN_ERR "failed to map scatterlist\n");
> +		goto fail_map_attachment;
> +	}
> +
>  	/* checking if dmabuf is big enough to store contiguous chunk */
>  	contig_size = vb2_dc_get_contiguous_size(sgt);
>  	if (contig_size < buf->size) {
> -		printk(KERN_ERR "contiguous chunk of dmabuf is too small\n");
> -		ret = -EFAULT;
> -		goto fail_map;
> +		printk(KERN_ERR "contiguous chunk of dmabuf is too small "
> +			"%lu/%lu bytes\n", contig_size, buf->size);
> +		goto fail_map_sg;
>  	}
> 
>  	buf->dma_addr = sg_dma_address(sgt->sgl);
> @@ -655,7 +641,10 @@ static int vb2_dc_map_dmabuf(void *mem_priv)
> 
>  	return 0;
> 
> -fail_map:
> +fail_map_sg:
> +	dma_unmap_sg(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir);
> +
> +fail_map_attachment:
>  	dma_buf_unmap_attachment(buf->db_attach, sgt);
> 
>  	return ret;
> @@ -676,6 +665,7 @@ static void vb2_dc_unmap_dmabuf(void *mem_priv)
>  		return;
>  	}
> 
> +	dma_unmap_sg(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir);
>  	dma_buf_unmap_attachment(buf->db_attach, sgt);
> 
>  	buf->dma_addr = 0;

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2012-03-22 12:15 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-13 10:16 [RFCv2 PATCH 0/9] Integration of videobuf2 with dmabuf Tomasz Stanislawski
2012-03-13 10:16 ` [RFCv2 PATCH 1/9] v4l: vb2: fixes for DMABUF support Tomasz Stanislawski
2012-03-22  7:56   ` Laurent Pinchart
2012-03-13 10:17 ` [RFCv2 PATCH 2/9] v4l: vb2-dma-contig: update and code refactoring Tomasz Stanislawski
2012-03-22  9:27   ` Laurent Pinchart
2012-03-22 10:02     ` [RFCv2 PATCH 2/9 - 1/4] v4l: vb2-dma-contig: Shorten vb2_dma_contig prefix to vb2_dc Laurent Pinchart
2012-03-22 10:02     ` [RFCv2 PATCH 2/9 - 2/4] v4l: vb2-dma-contig: Reorder functions Laurent Pinchart
2012-03-22 10:02     ` [RFCv2 PATCH 2/9 - 3/4] v4l: vb2-dma-contig: Remove unneeded allocation context structure Laurent Pinchart
2012-03-22 10:02     ` [RFCv2 PATCH 2/9 - 4/4] v4l: vb2-dma-contig: update and code refactoring Laurent Pinchart
2012-03-22 10:50       ` [Linaro-mm-sig] " Laurent Pinchart
2012-03-22 13:36         ` Tomasz Stanislawski
2012-03-22 14:42           ` Laurent Pinchart
2012-03-22 14:52             ` Subash Patel
2012-03-22 16:18               ` Tomasz Stanislawski
2012-03-22 15:58             ` Tomasz Stanislawski
2012-03-27 15:01               ` Laurent Pinchart
2012-03-27 16:45                 ` Jerome Glisse
2012-03-27 16:58                   ` Laurent Pinchart
2012-03-22 13:42   ` [Linaro-mm-sig] [RFCv2 PATCH 2/9] " Subash Patel
2012-03-13 10:17 ` [RFCv2 PATCH 3/9] v4l: vb2: Add dma-contig allocator as dma_buf user Tomasz Stanislawski
2012-03-22 11:04   ` Laurent Pinchart
2012-03-26 15:53     ` Tomasz Stanislawski
2012-03-28 15:50       ` Laurent Pinchart
2012-03-13 10:17 ` [RFCv2 PATCH 4/9] v4l: add buffer exporting via dmabuf Tomasz Stanislawski
2012-03-18 21:47   ` Daniel Vetter
2012-03-22 11:16   ` Laurent Pinchart
2012-03-22 13:57     ` [Linaro-mm-sig] " Subash Patel
2012-03-22 14:07       ` Laurent Pinchart
2012-03-22 14:26         ` Daniel Vetter
2012-03-22 14:43           ` Laurent Pinchart
2012-03-22 14:59         ` Subash Patel
2012-03-22 15:09           ` Laurent Pinchart
2012-03-23 11:33     ` Tomasz Stanislawski
2012-03-27 10:21       ` Laurent Pinchart
2012-03-13 10:17 ` [RFCv2 PATCH 5/9] v4l: vb2: " Tomasz Stanislawski
2012-03-22 11:24   ` Laurent Pinchart
2012-03-23 11:50     ` Tomasz Stanislawski
2012-03-13 10:17 ` [RFCv2 PATCH 6/9] v4l: vb2-dma-contig: add support for DMABUF exporting Tomasz Stanislawski
2012-03-13 10:17 ` [RFCv2 PATCH 7/9] v4l: vb2-dma-contig: change map/unmap behaviour Tomasz Stanislawski
2012-03-22 12:15   ` Laurent Pinchart [this message]
2012-03-22 12:25     ` Daniel Vetter
2012-03-27 10:31       ` Laurent Pinchart
2012-03-13 10:17 ` [RFCv2 PATCH 8/9] v4l: fimc: integrate capture i-face with dmabuf Tomasz Stanislawski
2012-03-13 10:17 ` [RFCv2 PATCH 9/9] v4l: s5p-tv: mixer: integrate " Tomasz Stanislawski
  -- strict thread matches above, loose matches on Subject: below --
2012-03-06 11:38 [RFCv2 PATCH 0/9] Integration of videobuf2 " Tomasz Stanislawski
2012-03-06 11:38 ` [RFCv2 PATCH 7/9] v4l: vb2-dma-contig: change map/unmap behaviour Tomasz Stanislawski

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=3831740.PZSgqxDSC2@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=airlied@redhat.com \
    --cc=ben@bwidawsk.net \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=kyungmin.park@samsung.com \
    --cc=linaro-mm-sig@lists.linaro.org \
    --cc=m.szyprowski@samsung.com \
    --cc=sakari.ailus@iki.fi \
    --cc=t.stanislaws@samsung.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.