Messages in this thread | | | From | Nikolaus Rath <> | Subject | Re: virt_to_page for userspace pointers | Date | Mon, 14 Feb 2011 17:46:30 -0500 |
| |
Nikolaus Rath <Nikolaus@rath.org> writes: > On 02/05/2011 04:36 PM, Brice Goglin wrote: >>> Is there an equivalent function to virt_to_page (and virt_to_phys) that >>> works with userspace pointers? Or do I have to manually walk through the >>> page tables? In the later case, are there any examples of this kind of >>> search that I could use as a basis? >>> >> >> You probably want get_user_pages() (or get_user_pages_fast()). > > Thanks for the pointer, that already helped a lot! > > I would, however, prefer a more primitive function that just gives me > the struct page without locking it. And if the page is swapped out, I'd > rather get a NULL pointer than having a page frame allocated. Is there > anything like that?
After studying the source for get_user_pages(), I believe the following should do what I want:
vma = find_extend_vma(current->mm, (unsigned long) data.vi_buf); if(vma == NULL) { err("find_extend_vma failed for VI."); } acq_dev->vi_pg = follow_page(vma, (unsigned long) data.vi_buf, 0); if(acq_dev->vi_pg == NULL) { err("follow_page failed for VI."); }
Unfortunately, I'm getting into trouble at link time when using these functions:
MODPOST 1 modules WARNING: "follow_page" [/home/nikratio/control/acq196_hostdrv/acq200_hostdrv.ko] undefined! WARNING: "find_extend_vma" [/home/nikratio/control/acq196_hostdrv/acq200_hostdrv.ko] undefined!
Can they only be used in the kernel itself, but not in kernel modules?
Thanks,
-Nikolaus
-- »Time flies like an arrow, fruit flies like a Banana.«
PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C
-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |