2005-10-27 23:52:27

by Mishael A Sibiryakov

[permalink] [raw]
Subject: Lock page with HIGHMEM


Hi.

I have "little" troubles with HIGHMEM.

The situation:
I have a some pages which allocated via kmalloc(), after this pages is
locked by get_page(). This pages is used in interrupt context, also in
#PF too. When this code working on kernel without HIGHMEM support, then
everything is fine. But when kernel with HIGHMEM then pages will be
unmapped from linear space (i think) and i have a triple exception and
you know that happens further :)
I've try lock pages via get_user_pages, w/wo vma, by set
SetPageReserved , Locked and etc. But nothing.

How i can avoid this problem ? E.g. how i can lock page in kernel and be
assured about that that it will not be unmapped, and can be accessed via
linear address every time ?



2005-10-28 01:43:18

by Fawad Lateef

[permalink] [raw]
Subject: Re: Lock page with HIGHMEM

On 10/28/05, Mishael A Sibiryakov <[email protected]> wrote:
>
> I have "little" troubles with HIGHMEM.
>
> The situation:
> I have a some pages which allocated via kmalloc(), after this pages is
> locked by get_page(). This pages is used in interrupt context, also in
> #PF too. When this code working on kernel without HIGHMEM support, then
> everything is fine. But when kernel with HIGHMEM then pages will be
> unmapped from linear space (i think) and i have a triple exception and
> you know that happens further :)
> I've try lock pages via get_user_pages, w/wo vma, by set
> SetPageReserved , Locked and etc. But nothing.
>

Here you mean that you allocated memory from kmalloc which corresponds
to some pages and then you are dealing with those pages ! right ? Then
you can use alloc_page/pages to get the page directly or there is some
reason for not to use them ?

AFAIK kernel keeps the seperate virtual addresses range for mapping
HIGHMEM to ZONE_NORMAL (PKMAP_BASE to PKMAP_BASE + LAST_PKMAP) which
is from the area called as VMALLOC_RESERVE used for holding temporary
mappings and kmalloc like rountines returned memory will never be
unmapped or at-least I havn't saw this behaviour.

> How i can avoid this problem ? E.g. how i can lock page in kernel and be
> assured about that that it will not be unmapped, and can be accessed via
> linear address every time ?
>

If you got page/memory from the kernel functions like
alloc_page/kmalloc then they are not unmapped and if they unmapped in
any case (which I think won't) then kernel is responsible to mapping
them back when ever you will be going to use it !

--
Fawad Lateef