mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
mm/rmap: use rmap_walk() in try_to_munlock()
Now, we have an infrastructure in rmap_walk() to handle difference from variants of rmap traversing functions. So, just use it in try_to_munlock(). In this patch, I change following things. 1. remove some variants of rmap traversing functions. cf> try_to_unmap_ksm, try_to_unmap_anon, try_to_unmap_file 2. mechanical change to use rmap_walk() in try_to_munlock(). 3. copy and paste comments. Signed-off-by: Joonsoo Kim <[email protected]> Reviewed-by: Naoya Horiguchi <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Hugh Dickins <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Hillf Danton <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
5262950642
commit
e8351ac9bf
3 changed files with 42 additions and 168 deletions
50
mm/ksm.c
50
mm/ksm.c
|
|
@ -1946,56 +1946,6 @@ out:
|
|||
return referenced;
|
||||
}
|
||||
|
||||
int try_to_unmap_ksm(struct page *page, enum ttu_flags flags)
|
||||
{
|
||||
struct stable_node *stable_node;
|
||||
struct rmap_item *rmap_item;
|
||||
int ret = SWAP_AGAIN;
|
||||
int search_new_forks = 0;
|
||||
|
||||
VM_BUG_ON(!PageKsm(page));
|
||||
VM_BUG_ON(!PageLocked(page));
|
||||
|
||||
stable_node = page_stable_node(page);
|
||||
if (!stable_node)
|
||||
return SWAP_FAIL;
|
||||
again:
|
||||
hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist) {
|
||||
struct anon_vma *anon_vma = rmap_item->anon_vma;
|
||||
struct anon_vma_chain *vmac;
|
||||
struct vm_area_struct *vma;
|
||||
|
||||
anon_vma_lock_read(anon_vma);
|
||||
anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root,
|
||||
0, ULONG_MAX) {
|
||||
vma = vmac->vma;
|
||||
if (rmap_item->address < vma->vm_start ||
|
||||
rmap_item->address >= vma->vm_end)
|
||||
continue;
|
||||
/*
|
||||
* Initially we examine only the vma which covers this
|
||||
* rmap_item; but later, if there is still work to do,
|
||||
* we examine covering vmas in other mms: in case they
|
||||
* were forked from the original since ksmd passed.
|
||||
*/
|
||||
if ((rmap_item->mm == vma->vm_mm) == search_new_forks)
|
||||
continue;
|
||||
|
||||
ret = try_to_unmap_one(page, vma,
|
||||
rmap_item->address, (void *)flags);
|
||||
if (ret != SWAP_AGAIN || !page_mapped(page)) {
|
||||
anon_vma_unlock_read(anon_vma);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
anon_vma_unlock_read(anon_vma);
|
||||
}
|
||||
if (!search_new_forks++)
|
||||
goto again;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc)
|
||||
{
|
||||
struct stable_node *stable_node;
|
||||
|
|
|
|||
Loading…
Reference in a new issue