mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
mm: free swap cache aggressively if memcg swap is full
Swap cache pages are freed aggressively if swap is nearly full (>50% currently), because otherwise we are likely to stop scanning anonymous when we near the swap limit even if there is plenty of freeable swap cache pages. We should follow the same trend in case of memory cgroup, which has its own swap limit. Signed-off-by: Vladimir Davydov <[email protected]> Acked-by: Johannes Weiner <[email protected]> Cc: Michal Hocko <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
d8b38438a0
commit
5ccc5abaaf
5 changed files with 32 additions and 3 deletions
|
|
@ -5761,6 +5761,28 @@ long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg)
|
|||
return nr_swap_pages;
|
||||
}
|
||||
|
||||
bool mem_cgroup_swap_full(struct page *page)
|
||||
{
|
||||
struct mem_cgroup *memcg;
|
||||
|
||||
VM_BUG_ON_PAGE(!PageLocked(page), page);
|
||||
|
||||
if (vm_swap_full())
|
||||
return true;
|
||||
if (!do_swap_account || !cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
||||
return false;
|
||||
|
||||
memcg = page->mem_cgroup;
|
||||
if (!memcg)
|
||||
return false;
|
||||
|
||||
for (; memcg != root_mem_cgroup; memcg = parent_mem_cgroup(memcg))
|
||||
if (page_counter_read(&memcg->swap) * 2 >= memcg->swap.limit)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* for remember boot option*/
|
||||
#ifdef CONFIG_MEMCG_SWAP_ENABLED
|
||||
static int really_do_swap_account __initdata = 1;
|
||||
|
|
|
|||
|
|
@ -2582,7 +2582,8 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
}
|
||||
|
||||
swap_free(entry);
|
||||
if (vm_swap_full() || (vma->vm_flags & VM_LOCKED) || PageMlocked(page))
|
||||
if (mem_cgroup_swap_full(page) ||
|
||||
(vma->vm_flags & VM_LOCKED) || PageMlocked(page))
|
||||
try_to_free_swap(page);
|
||||
unlock_page(page);
|
||||
if (page != swapcache) {
|
||||
|
|
|
|||
|
|
@ -1006,7 +1006,7 @@ int free_swap_and_cache(swp_entry_t entry)
|
|||
* Also recheck PageSwapCache now page is locked (above).
|
||||
*/
|
||||
if (PageSwapCache(page) && !PageWriteback(page) &&
|
||||
(!page_mapped(page) || vm_swap_full())) {
|
||||
(!page_mapped(page) || mem_cgroup_swap_full(page))) {
|
||||
delete_from_swap_cache(page);
|
||||
SetPageDirty(page);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1214,7 +1214,7 @@ cull_mlocked:
|
|||
|
||||
activate_locked:
|
||||
/* Not a candidate for swapping, so reclaim swap space. */
|
||||
if (PageSwapCache(page) && vm_swap_full())
|
||||
if (PageSwapCache(page) && mem_cgroup_swap_full(page))
|
||||
try_to_free_swap(page);
|
||||
VM_BUG_ON_PAGE(PageActive(page), page);
|
||||
SetPageActive(page);
|
||||
|
|
|
|||
Loading…
Reference in a new issue