Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752379AbbBKKnH (ORCPT ); Wed, 11 Feb 2015 05:43:07 -0500 Received: from mailout4.w1.samsung.com ([210.118.77.14]:10056 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751264AbbBKKnD (ORCPT ); Wed, 11 Feb 2015 05:43:03 -0500 X-AuditID: cbfec7f4-b7f126d000001e9a-36-54db31a3deb9 Message-id: <54DB3232.40000@samsung.com> Date: Wed, 11 Feb 2015 11:42:58 +0100 From: Marek Szyprowski User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-version: 1.0 To: Ricardo Ribalda Delgado , Pawel Osciak , Kyungmin Park , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Hans Verkuil Subject: Re: [PATCH v2 1/3] media/videobuf2-dma-sg: Fix handling of sg_table structure References: <1423650827-16232-1-git-send-email-ricardo.ribalda@gmail.com> In-reply-to: <1423650827-16232-1-git-send-email-ricardo.ribalda@gmail.com> Content-type: text/plain; charset=utf-8; format=flowed Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrGLMWRmVeSWpSXmKPExsVy+t/xK7qLDW+HGHxcz2ax5OcuJouzTW/Y LS7vmsNm0bNhK6vF6mcVFlPe/mS36Oqex+TA7jHl90ZWj52z7rJ7PP71ks1jSz+Q1bdlFaPH 501yAWxRXDYpqTmZZalF+nYJXBm3599mLjgnVzF5VzNzA+MOiS5GTg4JAROJ/t0fWSFsMYkL 99azdTFycQgJLGWU6Pi/hh3C+cQosfHbfiaQKl4BDYkviy6ydDFycLAIqEqc+F4DEmYTMJTo etvFBmKLCsRIvFvVxwxRLijxY/I9FpA5IgJzmCRann8ASwgLREisffGRHcQWEvCUuPzgIdh8 TgEvifPr/oDVMAuYSXx5eZgVwpaX2LzmLfMERv5ZSObOQlI2C0nZAkbmVYyiqaXJBcVJ6bmG esWJucWleel6yfm5mxghYf1lB+PiY1aHGAU4GJV4eAMm3AwRYk0sK67MPcQowcGsJMIbIXY7 RIg3JbGyKrUoP76oNCe1+BAjEwenVAOjXscOuwWlq9j/vXKV+WWZPlPq16ettvJCy1cKLI5r /tAcdGhC3vnKmPdRub+rjjGfi47K7clifdr79eWpH58j/Hd0KweKbqgKXL1Sj+fny3kvZ3rb H5zSnPLkg6GyjP3XDkaV68emtkQwHg6JnLGnRWm5coOG5vnAo3sUjsx8m7BER0K2ReK4Ektx RqKhFnNRcSIAsV3ojEkCAAA= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4060 Lines: 108 Hello, On 2015-02-11 11:33, Ricardo Ribalda Delgado wrote: > When sg_alloc_table_from_pages() does not fail it returns a sg_table > structure with nents and nents_orig initialized to the same value. > > dma_map_sg returns the number of areas mapped by the hardware, > which could be different than the areas given as an input. > The output must be saved to nent. > > The output of dma_map, should be used to transverse the scatter list. > > dma_unmap_sg needs the value passed to dma_map_sg (nents_orig). > > sg_free_tables uses also orig_nent. > > This patch fix the file to follow this paradigm. > > Signed-off-by: Ricardo Ribalda Delgado Reviewed-by: Marek Szyprowski I would also consider sending it to stable. > --- > drivers/media/v4l2-core/videobuf2-dma-sg.c | 22 +++++++++++++--------- > 1 file changed, 13 insertions(+), 9 deletions(-) > > diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c > index b1838ab..40c330f 100644 > --- a/drivers/media/v4l2-core/videobuf2-dma-sg.c > +++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c > @@ -147,8 +147,9 @@ static void *vb2_dma_sg_alloc(void *alloc_ctx, unsigned long size, > * No need to sync to the device, this will happen later when the > * prepare() memop is called. > */ > - if (dma_map_sg_attrs(buf->dev, sgt->sgl, sgt->nents, > - buf->dma_dir, &attrs) == 0) > + sgt->nents = dma_map_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents, > + buf->dma_dir, &attrs); > + if (!sgt->nents) > goto fail_map; > > buf->handler.refcount = &buf->refcount; > @@ -187,7 +188,7 @@ static void vb2_dma_sg_put(void *buf_priv) > dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs); > dprintk(1, "%s: Freeing buffer of %d pages\n", __func__, > buf->num_pages); > - dma_unmap_sg_attrs(buf->dev, sgt->sgl, sgt->nents, > + dma_unmap_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents, > buf->dma_dir, &attrs); > if (buf->vaddr) > vm_unmap_ram(buf->vaddr, buf->num_pages); > @@ -314,9 +315,11 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr, > * No need to sync to the device, this will happen later when the > * prepare() memop is called. > */ > - if (dma_map_sg_attrs(buf->dev, sgt->sgl, sgt->nents, > - buf->dma_dir, &attrs) == 0) > + sgt->nents = dma_map_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents, > + buf->dma_dir, &attrs); > + if (!sgt->nents) > goto userptr_fail_map; > + > return buf; > > userptr_fail_map: > @@ -351,7 +354,8 @@ static void vb2_dma_sg_put_userptr(void *buf_priv) > > dprintk(1, "%s: Releasing userspace buffer of %d pages\n", > __func__, buf->num_pages); > - dma_unmap_sg_attrs(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir, &attrs); > + dma_unmap_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents, buf->dma_dir, > + &attrs); > if (buf->vaddr) > vm_unmap_ram(buf->vaddr, buf->num_pages); > sg_free_table(buf->dma_sgt); > @@ -502,7 +506,6 @@ static struct sg_table *vb2_dma_sg_dmabuf_ops_map( > /* stealing dmabuf mutex to serialize map/unmap operations */ > struct mutex *lock = &db_attach->dmabuf->lock; > struct sg_table *sgt; > - int ret; > > mutex_lock(lock); > > @@ -521,8 +524,9 @@ static struct sg_table *vb2_dma_sg_dmabuf_ops_map( > } > > /* mapping to the client with new direction */ > - ret = dma_map_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, dma_dir); > - if (ret <= 0) { > + sgt->nents = dma_map_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, > + dma_dir); > + if (!sgt->nents) { > pr_err("failed to map scatterlist\n"); > mutex_unlock(lock); > return ERR_PTR(-EIO); Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/