mirror of https://gitee.com/openkylin/linux.git
lib/scatterlist: Fix offset type in sg_alloc_table_from_pages
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
This commit is contained in:
parent
df0700e530
commit
c4860ad605
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue