Message ID | 1478854220-3255-2-git-send-email-tvrtko.ursulin@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Nov 11, 2016 at 08:50:17AM +0000, Tvrtko Ursulin wrote: > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > Scatterlist entries have an unsigned int for the offset so > correct the sg_alloc_table_from_pages function accordingly. > > Since these are offsets withing a page, unsigned int is > wide enough. > > Also converts callers which were using unsigned long locally > with the lower_32_bits annotation to make it explicitly > clear what is happening. > > v2: Use offset_in_page. (Chris Wilson) > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > Cc: Masahiro Yamada <yamada.masahiro@socionext.com> > Cc: Pawel Osciak <pawel@osciak.com> > Cc: Marek Szyprowski <m.szyprowski@samsung.com> > Cc: Kyungmin Park <kyungmin.park@samsung.com> > Cc: Tomasz Stanislawski <t.stanislaws@samsung.com> > Cc: Matt Porter <mporter@kernel.crashing.org> > Cc: Alexandre Bounine <alexandre.bounine@idt.com> > Cc: linux-media@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Acked-by: Marek Szyprowski <m.szyprowski@samsung.com> (v1) If there were kerneldoc, it would nicely explain that having an offset larger then a page is silly when passing in array of pages. Changes elsewhere look ok (personally I'd be happy with just offset_in_page(), 4GiB superpages are somebody else's problem :) Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> -Chris
Em Mon, 14 Nov 2016 09:55:48 +0000 Chris Wilson <chris@chris-wilson.co.uk> escreveu: > On Fri, Nov 11, 2016 at 08:50:17AM +0000, Tvrtko Ursulin wrote: > > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > > > Scatterlist entries have an unsigned int for the offset so > > correct the sg_alloc_table_from_pages function accordingly. > > > > Since these are offsets withing a page, unsigned int is > > wide enough. > > > > Also converts callers which were using unsigned long locally > > with the lower_32_bits annotation to make it explicitly > > clear what is happening. > > > > v2: Use offset_in_page. (Chris Wilson) > > > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > Cc: Masahiro Yamada <yamada.masahiro@socionext.com> > > Cc: Pawel Osciak <pawel@osciak.com> > > Cc: Marek Szyprowski <m.szyprowski@samsung.com> > > Cc: Kyungmin Park <kyungmin.park@samsung.com> > > Cc: Tomasz Stanislawski <t.stanislaws@samsung.com> > > Cc: Matt Porter <mporter@kernel.crashing.org> > > Cc: Alexandre Bounine <alexandre.bounine@idt.com> > > Cc: linux-media@vger.kernel.org > > Cc: linux-kernel@vger.kernel.org > > Acked-by: Marek Szyprowski <m.szyprowski@samsung.com> (v1) > > If there were kerneldoc, it would nicely explain that having an offset > larger then a page is silly when passing in array of pages. > > Changes elsewhere look ok (personally I'd be happy with just > offset_in_page(), 4GiB superpages are somebody else's problem :) For the media changes, that looked OK. We don't have any needs to stream 4GB images nowadays :-) Reviewed-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> > -Chris > Thanks, Mauro -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c b/drivers/media/v4l2-core/videobuf2-dma-contig.c index fb6a177be461..51e8765bc3c6 100644 --- a/drivers/media/v4l2-core/videobuf2-dma-contig.c +++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c @@ -478,7 +478,7 @@ static void *vb2_dc_get_userptr(struct device *dev, unsigned long vaddr, { struct vb2_dc_buf *buf; struct frame_vector *vec; - unsigned long offset; + unsigned int offset; int n_pages, i; int ret = 0; struct sg_table *sgt; @@ -506,7 +506,7 @@ static void *vb2_dc_get_userptr(struct device *dev, unsigned long vaddr, buf->dev = dev; buf->dma_dir = dma_dir; - offset = vaddr & ~PAGE_MASK; + offset = lower_32_bits(offset_in_page(vaddr)); vec = vb2_create_framevec(vaddr, size, dma_dir == DMA_FROM_DEVICE); if (IS_ERR(vec)) { ret = PTR_ERR(vec); diff --git a/drivers/rapidio/devices/rio_mport_cdev.c b/drivers/rapidio/devices/rio_mport_cdev.c index 9013a585507e..0fae29ff47ba 100644 --- a/drivers/rapidio/devices/rio_mport_cdev.c +++ b/drivers/rapidio/devices/rio_mport_cdev.c @@ -876,10 +876,10 @@ rio_dma_transfer(struct file *filp, u32 transfer_mode, * offset within the internal buffer specified by handle parameter. */ if (xfer->loc_addr) { - unsigned long offset; + unsigned int offset; long pinned; - offset = (unsigned long)(uintptr_t)xfer->loc_addr & ~PAGE_MASK; + offset = lower_32_bits(offset_in_page(xfer->loc_addr)); nr_pages = PAGE_ALIGN(xfer->length + offset) >> PAGE_SHIFT; page_list = kmalloc_array(nr_pages, diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index cb3c8fe6acd7..c981bee1a3ae 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -263,7 +263,7 @@ int __sg_alloc_table(struct sg_table *, unsigned int, unsigned int, int sg_alloc_table(struct sg_table *, unsigned int, gfp_t); int sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages, unsigned int n_pages, - unsigned long offset, unsigned long size, + unsigned int offset, unsigned long size, gfp_t gfp_mask); size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, void *buf, diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 004fc70fc56a..e05e7fc98892 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -391,7 +391,7 @@ EXPORT_SYMBOL(sg_alloc_table); */ int sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pages, unsigned int n_pages, - unsigned long offset, unsigned long size, + unsigned int offset, unsigned long size, gfp_t gfp_mask) { unsigned int chunks;