lib/scatterlist: Fix offset type in sg_alloc_table_from_pages
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Mon, 31 Jul 2017 18:55:08 +0000 (19:55 +0100)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Thu, 7 Sep 2017 09:48:27 +0000 (10:48 +0100)
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)
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170731185512.20010-1-tvrtko.ursulin@linux.intel.com
drivers/media/v4l2-core/videobuf2-dma-contig.c
drivers/rapidio/devices/rio_mport_cdev.c
include/linux/scatterlist.h
lib/scatterlist.c

index 4f246d166111a3a17da4233eac6586b42ddaf057..2405077fdc716aadad9bebd238ad21c8cf178cfa 100644 (file)
@@ -479,7 +479,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;
@@ -507,7 +507,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);
index 5beb0c361076ba5869a259c8006c52367e41f748..5c1b6388122ad8502933ae9878f12f3419204be2 100644 (file)
@@ -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,
index 4b3286ac60c86e3185ced18b1c14452eb80f5679..205aefb4ed93990d7c8729da83461e8c0fdc95e2 100644 (file)
@@ -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,
index be7b4dd6b68d789d1301e061f124786a55952908..dee0c5004e2f209ddb720ffe84f24fb1c5f3002d 100644 (file)
@@ -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;