media: vb2: Fix videobuf2 to map correct area
PATCH v2 1/1 media: vb2: Fix videobuf2 to map correct area
Fixes vb2_vmalloc_get_userptr() to ioremap correct area. Since the current code does ioremap the page address, if the offset > 0, it does not do ioremap the last page and results in kernel panic.
This fixes to pass the size + offset to ioremap so that ioremap can map correct area. Also, this uses __pfn_to_phys() to get the physical address of given PFN.
---
Chanegs in v2:
- Fix to pass size + offset instead of changing address.
--- drivers/media/v4l2-core/videobuf2-vmalloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/v4l2-core/videobuf2-vmalloc.c +1 -1
@@ -106,7 +106,7 @@ static void *vb2_vmalloc_get_userptr(struct device *dev, unsigned long vaddr,if (nums[i-1 ] +1 != nums[i]) goto fail_map; buf->vaddr = (__force void *) -ioremap_nocache (nums[0 ] <<PAGE_SHIFT , size); +ioremap_nocache (__pfn_to_phys (nums[0 ]), size + offset); }else { buf->vaddr =vm_map_ram (frame_vector_pages (vec), n_pages,-1 ,PAGE_KERNEL );
Hi Masami,
Quoted 11 lines · Masami Hiramatsu
Fixes
vb2_vmalloc_get_userptr()to ioremap correct area. Since the current code does ioremap the page address, if the offset > 0, it does not do ioremap the last page and results in kernel panic.This fixes to pass the size + offset to ioremap so that ioremap can map correct area. Also, this uses
__pfn_to_phys()to get the physical address of given PFN.Signed-off-by Masami Hiramatsu <[email protected]>Reported-by Takao Orito <[email protected]>Reported-by Fumihiro ATSUMI <[email protected]>
Quoted 16 lines
---
Chanegs in v2:
- Fix to pass size + offset instead of changing address.--- drivers/media/v4l2-core/videobuf2-vmalloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/media/v4l2-core/videobuf2-vmalloc.c +0
-0
drivers/media/v4l2-core/videobuf2-vmalloc.c static void *vb2_vmalloc_get_userptr(struct device *dev, unsigned long vaddr, · line 112
Quoted 8 lines
drivers/media/v4l2-core/videobuf2-vmalloc.c +1
-1@@ -106,7 +106,7 @@ static void *vb2_vmalloc_get_userptr(struct device *dev, unsigned long vaddr,if (nums[i-1 ] +1 != nums[i]) goto fail_map; buf->vaddr = (__force void *) -ioremap_nocache (nums[0 ] <<PAGE_SHIFT , size); +ioremap_nocache (__pfn_to_phys (nums[0 ]), size + offset); }else { buf->vaddr =vm_map_ram (frame_vector_pages (vec), n_pages,-1 ,PAGE_KERNEL );
Best regards
Signature · 2 lines
Marek Szyprowski, PhD Samsung R&D Institute Poland