Skip to contentSkip to conversation

kernel vaddr -> struct page

DISCUSSION Eric Barton 3 participants 4 messages Oct 17, 2002

lore
Share & tools
lore
#0 lore raw

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]|
----------------------------------------------------
#1 lore raw
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

#2 lore raw

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.

#3 lore raw
In reply to Eric Barton

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.