
From: Arjan van de Ven <arjanv@infradead.org>

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 <akpm@osdl.org>
---

 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);
_
