You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
mm/rmap: extend rmap_walk_xxx() to cope with different cases
There are a lot of common parts in traversing functions, but there are also a little of uncommon parts in it. By assigning proper function pointer on each rmap_walker_control, we can handle these difference correctly. Following are differences we should handle. 1. difference of lock function in anon mapping case 2. nonlinear handling in file mapping case 3. prechecked condition: checking memcg in page_referenced(), checking VM_SHARE in page_mkclean() checking temporary vma in try_to_unmap() 4. exit condition: checking page_mapped() in try_to_unmap() So, in this patch, I introduce 4 function pointers to handle above differences. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Hugh Dickins <hughd@google.com> Cc: Rik van Riel <riel@redhat.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Hillf Danton <dhillf@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
051ac83adf
commit
0dd1c7bbce
@@ -2032,12 +2032,19 @@ again:
|
||||
if ((rmap_item->mm == vma->vm_mm) == search_new_forks)
|
||||
continue;
|
||||
|
||||
if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg))
|
||||
continue;
|
||||
|
||||
ret = rwc->rmap_one(page, vma,
|
||||
rmap_item->address, rwc->arg);
|
||||
if (ret != SWAP_AGAIN) {
|
||||
anon_vma_unlock_read(anon_vma);
|
||||
goto out;
|
||||
}
|
||||
if (rwc->done && rwc->done(page)) {
|
||||
anon_vma_unlock_read(anon_vma);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
anon_vma_unlock_read(anon_vma);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user