From: Huang Shijie <shijie8@gmail.com>
To: Minchan Kim <minchan.kim@gmail.com>
Cc: linux-mm@kvack.org
Subject: Re: Does get_user_pages_fast lock the user pages in memory in my case?
Date: Mon, 20 Apr 2009 11:57:50 +0800 [thread overview]
Message-ID: <49EBF2BE.2030908@gmail.com> (raw)
In-Reply-To: <20090420114236.dda3de34.minchan.kim@barrios-desktop>
Minchan Kim a??e??:
> On Mon, 20 Apr 2009 10:15:55 +0800
> Huang Shijie <shijie8@gmail.com> wrote:
>
>
>> Minchan Kim a??e??:
>>
>>> On Fri, 17 Apr 2009 15:01:01 +0800
>>> Huang Shijie <shijie8@gmail.com> wrote:
>>>
>>>
>>>
>>>> I'm writting a driver for a video card with the V4L2 interface .
>>>> V4L2 interface supports the USER-POINTER method for the video frame
>>>> handling.
>>>>
>>>> VLC player supports the USER-POINTER method,while MPALYER does not.
>>>>
>>>> In the USER-POINTER method, VLC will call the posix_memalign() to
>>>> allocate
>>>> 203 pages in certain PAL mode (that is 720*576*2) for a single frame.
>>>> In my driver , I call the get_user_pages_fast() to obtain the pages
>>>> array,and then call
>>>> the vmap() to map the pages to VMALLOC space for the memcpy().The code
>>>> shows below:
>>>> ....................
>>>> get_user_pages_fast();
>>>> ...
>>>> f->data = vmap();
>>>> .......................
>>>>
>>>>
>>> What I understand is that you get the pages of posix_memalign by get_user_pages_fast
>>> and then that pages are mapped at kernel vmalloc space by vmap.
>>>
>>> Is it for removing copy overhead from kernel to user ?
>>>
>>>
>>>
>> I need a large range of virtual contigous memory to store my video
>> frame(about 203 pages). When I received a full frame ,I will queue the
>> buffer in
>> a VIDIOC queue,which will be remove by the VIDIOC_DQBUF.'
>>
>
> I can't understand your point.
> Sorry for that.
>
> Could you explain more detail relation (user buffer which is allocated by posix_memalign) and (kernel buffer which is mapped by vmap) ?
>
>
[1] fork() will copy the range of 768-1024 index of swapper_pg_dir to
mm->pgd.
[2] vmap setup mapping in the swapper_pg_dir.
[3] my driver will use the mm->pgd in the ioctl context.for the reason
of [1],driver could see
the address setup by vmap.
>>>> In comments, it said :
>>>> "
>>>> +/**
>>>> + * get_user_pages_fast() - pin user pages in memory
>>>> + * @start: starting user address
>>>> + * @nr_pages: number of pages from start to pin
>>>> + * @write: whether pages will be written to
>>>> + * @pages: array that receives pointers to the pages pinned.
>>>> + * Should be at least nr_pages long.
>>>> "
>>>>
>>>> But after I digged the code of kswap and the get_user_pages(called by
>>>> get_user_pages_fast),
>>>> I did not find how the pages pinned in memory.I really need the pages
>>>> pinned in memory.
>>>>
>>>> Assume page A is one of the pages obtained by get_user_pages_fast()
>>>> during page-fault.
>>>>
>>>> [1] page A will on the LRU_ACTIVE_ANON list;
>>>> the _count of page A increment by one;
>>>> PTE for page A will be set ACCESSED.
>>>>
>>>> [2] kswapd will scan the lru list,and move page A from LRU_ACTIVE_ANON
>>>> to LRU_INACTIVE_ANON.
>>>> In the shrink_page_list(), there is nothing can stop page A been
>>>> swapped out.
>>>> I don't think the page_reference() can move page A back to
>>>> LRU_ACTIVE_ANON.In my driver,
>>>> I am not sure if the VLC can access the page A.
>>>>
>>>> Is this a bug? or I miss something?
>>>> Thanks .
>>>>
>>>>
>>> If above my assumption is right, It's not a BUG.
>>> You get the application's pages by get_user_pages_fast.
>>> 'Page pinning' means it shouldn't be freed.
>>> Application's pages always can be swapped out.
>>> If you don't want to swap out the page, you should use mlock.
>>> If you use mlock, kernel won't insert the page to lru [in]active list.
>>> So the page never can be swapped out.
>>>
>>>
>>>
>> Yes, it not a bug .
>>
>> I read the kernel code again. In my case ,the kernel will pin the pages
>> in memory.
>> I missed function is_page_cache_freeable() in the pageout().
>>
>> In my case, is_page_cache_freeable()will return false ,for
>> page_count(page) is 3 now:
>> <1> one is from alloc_page_* in page fault.
>> <2> one is from get_usr_pages()
>> <3> one is from add_to_swap() in shrink_page_list()
>>
>
> One more, try_to_unmap will call page_cache_release.
> So, count is 2.
>
>
>> So ,there is no need to use the mlock, it will mess my driver.
>> is_page_cache_freeable()will return PAGE_KEEP, and page is locked in
>> swap cache.
>>
>>
>
> I can't understand your point exactly yet.
> But what I mean is following as in user mode
>
> posix_memalignq(&buffer);
> mlock(buffer, buffer_len);
>
> I will not dirty your driver.
> Do I miss something ?
>
>
>> Unfortunately, the page is unmaped, and the PTE of the page has been
>> replaced by a swp_entry_t .
>> When the process read the page ,it will raise a page fault again, the
>> kernel will find the page in the
>> swap cache, and requeue the page in LRU_ACTIVE_ANON, ---I think it is a
>> vicious circle for the kernel.
>>
>> I think there two places to put back the gup() pages.
>> <1> isolate_page_glable()
>> <2> in the shrink_page_list(), before called the try_to_unmap().
>> KOSAKI Motohiro 's patch takes effect in the second place.
>> I think the first place is better.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>
>
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2009-04-20 3:58 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-17 7:01 Does get_user_pages_fast lock the user pages in memory in my case? Huang Shijie
2009-04-18 6:18 ` KOSAKI Motohiro
2009-04-20 2:22 ` Huang Shijie
2009-04-19 23:45 ` Minchan Kim
2009-04-20 2:15 ` Huang Shijie
2009-04-20 2:42 ` Minchan Kim
2009-04-20 3:28 ` Huang Shijie
2009-04-20 3:42 ` KOSAKI Motohiro
2009-04-20 4:53 ` Minchan Kim
2009-04-20 5:05 ` KOSAKI Motohiro
2009-04-20 5:05 ` Huang Shijie
2009-04-20 5:19 ` KOSAKI Motohiro
2009-04-20 5:37 ` Huang Shijie
2009-04-20 7:59 ` KOSAKI Motohiro
2009-04-20 8:23 ` Huang Shijie
2009-04-20 9:24 ` KOSAKI Motohiro
2009-04-20 9:47 ` Huang Shijie
2009-04-21 1:43 ` KOSAKI Motohiro
2009-04-21 19:47 ` Christoph Lameter
2009-04-20 5:24 ` Minchan Kim
2009-04-20 5:42 ` Huang Shijie
2009-04-20 3:57 ` Huang Shijie [this message]
2009-04-22 6:08 ` Huang Shijie
2009-04-22 9:46 ` Minchan Kim
2009-04-20 3:18 ` KOSAKI Motohiro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49EBF2BE.2030908@gmail.com \
--to=shijie8@gmail.com \
--cc=linux-mm@kvack.org \
--cc=minchan.kim@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.