lkml.org 
[lkml]   [2009]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC][PATCH v2 7/8] Try to mark PG_mlocked if wipe_page_reference find VM_LOCKED vma
    Date
    Both try_to_unmap() and wipe_page_reference() walk each ptes, but
    latter doesn't mark PG_mlocked altough find VM_LOCKED vma.

    This patch does it.

    Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Reviewed-by: Rik van Riel <riel@redhat.com>
    ---
    mm/rmap.c | 14 ++++++++++++++
    mm/vmscan.c | 2 ++
    2 files changed, 16 insertions(+), 0 deletions(-)

    diff --git a/mm/rmap.c b/mm/rmap.c
    index 5ae7c81..cfda0a0 100644
    --- a/mm/rmap.c
    +++ b/mm/rmap.c
    @@ -376,6 +376,7 @@ int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma)
    *
    * SWAP_SUCCESS - success
    * SWAP_AGAIN - give up to take lock, try later again
    + * SWAP_MLOCK - the page is mlocked
    */
    int wipe_page_reference_one(struct page *page,
    struct page_reference_context *refctx,
    @@ -401,6 +402,7 @@ int wipe_page_reference_one(struct page *page,
    if (IS_ERR(pte)) {
    if (PTR_ERR(pte) == -EAGAIN) {
    ret = SWAP_AGAIN;
    + goto out_mlock;
    }
    goto out;
    }
    @@ -430,6 +432,17 @@ int wipe_page_reference_one(struct page *page,

    out:
    return ret;
    +
    +out_mlock:
    + if (refctx->is_page_locked &&
    + down_read_trylock(&vma->vm_mm->mmap_sem)) {
    + if (vma->vm_flags & VM_LOCKED) {
    + mlock_vma_page(page);
    + ret = SWAP_MLOCK;
    + }
    + up_read(&vma->vm_mm->mmap_sem);
    + }
    + return ret;
    }

    static int wipe_page_reference_anon(struct page *page,
    @@ -550,6 +563,7 @@ static int wipe_page_reference_file(struct page *page,
    *
    * SWAP_SUCCESS - success to wipe all ptes
    * SWAP_AGAIN - temporary busy, try again later
    + * SWAP_MLOCK - the page is mlocked
    */
    int wipe_page_reference(struct page *page,
    struct mem_cgroup *memcg,
    diff --git a/mm/vmscan.c b/mm/vmscan.c
    index c235059..4738a12 100644
    --- a/mm/vmscan.c
    +++ b/mm/vmscan.c
    @@ -625,6 +625,8 @@ static unsigned long shrink_page_list(struct list_head *page_list,
    ret = wipe_page_reference(page, sc->mem_cgroup, &refctx);
    if (ret == SWAP_AGAIN)
    goto keep_locked;
    + else if (ret == SWAP_MLOCK)
    + goto cull_mlocked;
    VM_BUG_ON(ret != SWAP_SUCCESS);

    /*
    --
    1.6.5.2




    \
     
     \ /
      Last update: 2009-12-10 08:37    [W:0.033 / U:59.588 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site