kernel vaddr -> struct page
Hi,
I'm trying to turn a kernel virtual address into a struct page that I can then pass to tcp_sendpage().
The kernel virtual address could be {kmalloc(),vmalloc(),kmap()}-ed memory, and I guarantee that this memory will not be {kfree(),vfree(),kunmap()}-ed until the socket has done with the page (i.e. all the data has been acked).
I'd have thought that vmalloc_to_page(kvaddr) should give me a page I could use, since it is walking the page tables to find the pte for 'kvaddr', and checking that the physical page is present.
However I find I'm sending garbage when I use this method.
Can anyone help me understand?
Signature · 10 lines
Cheers,
Eric
----------------------------------------------------
|Eric Barton Barton Software |
|9 York Gardens Tel: +44 (117) 330 1575 |
|Clifton Mobile: +44 (7909) 680 356 |
|Bristol BS8 4LL Fax: call first |
|United Kingdom E-Mail: [email protected]|
----------------------------------------------------Quoted 9 lines · Eric Barton
Hi,
I'm trying to turn a kernel virtual address into a struct page that I can then pass to
tcp_sendpage().The kernel virtual address could be {kmalloc(),vmalloc(),kmap()}-ed memory, and I guarantee that this memory will not be {kfree(),vfree(),kunmap()}-ed until the socket has done with the page (i.e. all the data has been acked).
Quoted 8 lines
I'd have thought that
vmalloc_to_page(kvaddr)should give me a page I could use, since it is walking the page tables to find the pte for 'kvaddr', and checking that the physical page is present.However I find I'm sending garbage when I use this method.
Can anyone help me understand?
virt_to_page()
--
Brian Gerst
From: Brian Gerst <[email protected]>
Date: Thu, 17 Oct 2002 15:24:49 -0400
virt_to_page()
Doesn't work on vmalloc() data, he said that was a possibility for his case.
vmalloc_to_page() does not work on kmalloc/kmap'd memory.
On many system kmalloc memory is not even represented in the page tables because the mapping goes through a direct bypass window.
You need to know where the object came from to convert it into a page properly. You should be allocating and passing around pages internally anyways.