From: Arjan van de Ven After William did the remap_pfn_range change, a very common pattern became: page = page_to_pfn(vmalloc_to_page((void *)pos)); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { the patch below adds a very simple helper, vmalloc_to_pfn() to simplify this a bit. Signed-off-by: Andrew Morton --- 25-akpm/drivers/media/video/cpia.c | 2 +- 25-akpm/drivers/media/video/meye.c | 2 +- 25-akpm/drivers/usb/media/ov511.c | 2 +- 25-akpm/drivers/usb/media/se401.c | 2 +- 25-akpm/drivers/usb/media/sn9c102_core.c | 2 +- 25-akpm/drivers/usb/media/stv680.c | 2 +- 25-akpm/drivers/usb/media/usbvideo.c | 2 +- 25-akpm/drivers/usb/media/vicam.c | 2 +- 25-akpm/drivers/usb/media/w9968cf.c | 2 +- 25-akpm/include/linux/mm.h | 1 + 25-akpm/mm/memory.c | 10 ++++++++++ 25-akpm/mm/nommu.c | 6 ++++++ 12 files changed, 26 insertions(+), 9 deletions(-) diff -puN drivers/media/video/cpia.c~vmalloc_to_page-helper drivers/media/video/cpia.c --- 25/drivers/media/video/cpia.c~vmalloc_to_page-helper 2004-10-26 01:25:03.068676176 -0700 +++ 25-akpm/drivers/media/video/cpia.c 2004-10-26 01:25:03.092672528 -0700 @@ -3781,7 +3781,7 @@ static int cpia_mmap(struct file *file, pos = (unsigned long)(cam->frame_buf); while (size > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { up(&cam->busy_lock); return -EAGAIN; diff -puN drivers/media/video/meye.c~vmalloc_to_page-helper drivers/media/video/meye.c --- 25/drivers/media/video/meye.c~vmalloc_to_page-helper 2004-10-26 01:25:03.069676024 -0700 +++ 25-akpm/drivers/media/video/meye.c 2004-10-26 01:25:03.093672376 -0700 @@ -1188,7 +1188,7 @@ static int meye_mmap(struct file *file, pos = (unsigned long)meye.grab_fbuffer; while (size > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { up(&meye.lock); return -EAGAIN; diff -puN drivers/usb/media/ov511.c~vmalloc_to_page-helper drivers/usb/media/ov511.c --- 25/drivers/usb/media/ov511.c~vmalloc_to_page-helper 2004-10-26 01:25:03.071675720 -0700 +++ 25-akpm/drivers/usb/media/ov511.c 2004-10-26 01:25:03.097671768 -0700 @@ -4756,7 +4756,7 @@ ov51x_v4l1_mmap(struct file *file, struc pos = (unsigned long)ov->fbuf; while (size > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { up(&ov->lock); return -EAGAIN; diff -puN drivers/usb/media/se401.c~vmalloc_to_page-helper drivers/usb/media/se401.c --- 25/drivers/usb/media/se401.c~vmalloc_to_page-helper 2004-10-26 01:25:03.073675416 -0700 +++ 25-akpm/drivers/usb/media/se401.c 2004-10-26 01:25:03.098671616 -0700 @@ -1168,7 +1168,7 @@ static int se401_mmap(struct file *file, } pos = (unsigned long)se401->fbuf; while (size > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { up(&se401->lock); return -EAGAIN; diff -puN drivers/usb/media/sn9c102_core.c~vmalloc_to_page-helper drivers/usb/media/sn9c102_core.c --- 25/drivers/usb/media/sn9c102_core.c~vmalloc_to_page-helper 2004-10-26 01:25:03.074675264 -0700 +++ 25-akpm/drivers/usb/media/sn9c102_core.c 2004-10-26 01:25:03.100671312 -0700 @@ -1555,7 +1555,7 @@ static int sn9c102_mmap(struct file* fil pos = (unsigned long)cam->frame[i].bufmem; while (size > 0) { /* size is page-aligned */ - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, vma->vm_page_prot)) { up(&cam->fileop_sem); diff -puN drivers/usb/media/stv680.c~vmalloc_to_page-helper drivers/usb/media/stv680.c --- 25/drivers/usb/media/stv680.c~vmalloc_to_page-helper 2004-10-26 01:25:03.076674960 -0700 +++ 25-akpm/drivers/usb/media/stv680.c 2004-10-26 01:25:03.101671160 -0700 @@ -1277,7 +1277,7 @@ static int stv680_mmap (struct file *fil } pos = (unsigned long) stv680->fbuf; while (size > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { up (&stv680->lock); return -EAGAIN; diff -puN drivers/usb/media/usbvideo.c~vmalloc_to_page-helper drivers/usb/media/usbvideo.c --- 25/drivers/usb/media/usbvideo.c~vmalloc_to_page-helper 2004-10-26 01:25:03.077674808 -0700 +++ 25-akpm/drivers/usb/media/usbvideo.c 2004-10-26 01:25:03.103670856 -0700 @@ -1153,7 +1153,7 @@ static int usbvideo_v4l_mmap(struct file pos = (unsigned long) uvd->fbuf; while (size > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) return -EAGAIN; diff -puN drivers/usb/media/vicam.c~vmalloc_to_page-helper drivers/usb/media/vicam.c --- 25/drivers/usb/media/vicam.c~vmalloc_to_page-helper 2004-10-26 01:25:03.079674504 -0700 +++ 25-akpm/drivers/usb/media/vicam.c 2004-10-26 01:25:03.104670704 -0700 @@ -1045,7 +1045,7 @@ vicam_mmap(struct file *file, struct vm_ pos = (unsigned long)cam->framebuf; while (size > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) return -EAGAIN; diff -puN drivers/usb/media/w9968cf.c~vmalloc_to_page-helper drivers/usb/media/w9968cf.c --- 25/drivers/usb/media/w9968cf.c~vmalloc_to_page-helper 2004-10-26 01:25:03.081674200 -0700 +++ 25-akpm/drivers/usb/media/w9968cf.c 2004-10-26 01:25:03.107670248 -0700 @@ -2904,7 +2904,7 @@ static int w9968cf_mmap(struct file* fil return -EINVAL; while (vsize > 0) { - page = page_to_pfn(vmalloc_to_page((void *)pos)); + page = vmalloc_to_pfn((void *)pos); if (remap_pfn_range(vma, start, page + vma->vm_pgoff, PAGE_SIZE, vma->vm_page_prot)) return -EAGAIN; diff -puN include/linux/mm.h~vmalloc_to_page-helper include/linux/mm.h --- 25/include/linux/mm.h~vmalloc_to_page-helper 2004-10-26 01:25:03.082674048 -0700 +++ 25-akpm/include/linux/mm.h 2004-10-26 01:25:03.108670096 -0700 @@ -769,6 +769,7 @@ static inline unsigned long vma_pages(st extern struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr); extern struct page * vmalloc_to_page(void *addr); +extern unsigned long vmalloc_to_pfn(void *addr); extern struct page * follow_page(struct mm_struct *mm, unsigned long address, int write); int remap_pfn_range(struct vm_area_struct *, unsigned long, diff -puN mm/memory.c~vmalloc_to_page-helper mm/memory.c --- 25/mm/memory.c~vmalloc_to_page-helper 2004-10-26 01:25:03.084673744 -0700 +++ 25-akpm/mm/memory.c 2004-10-26 01:25:03.110669792 -0700 @@ -1997,6 +1997,16 @@ struct page * vmalloc_to_page(void * vma EXPORT_SYMBOL(vmalloc_to_page); +/* + * Map a vmalloc()-space virtual address to the physical page frame number. + */ +unsigned long vmalloc_to_pfn(void * vmalloc_addr) +{ + return page_to_pfn(vmalloc_to_page(vmalloc_addr)); +} + +EXPORT_SYMBOL(vmalloc_to_pfn); + #if !defined(CONFIG_ARCH_GATE_AREA) #if defined(AT_SYSINFO_EHDR) diff -puN mm/nommu.c~vmalloc_to_page-helper mm/nommu.c --- 25/mm/nommu.c~vmalloc_to_page-helper 2004-10-26 01:25:03.086673440 -0700 +++ 25-akpm/mm/nommu.c 2004-10-26 01:25:03.110669792 -0700 @@ -141,6 +141,12 @@ struct page * vmalloc_to_page(void *addr return virt_to_page(addr); } +unsigned long vmalloc_to_pfn(void *addr) +{ + return page_to_pfn(virt_to_page(addr)); +} + + long vread(char *buf, char *addr, unsigned long count) { memcpy(buf, addr, count); _