diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memcontrol.c | 13 | ||||
-rw-r--r-- | mm/vmscan.c | 2 |
2 files changed, 14 insertions, 1 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 1ff552e3722b..bcb38718e174 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -5748,6 +5748,19 @@ void mem_cgroup_uncharge_swap(swp_entry_t entry) | |||
5748 | rcu_read_unlock(); | 5748 | rcu_read_unlock(); |
5749 | } | 5749 | } |
5750 | 5750 | ||
5751 | long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg) | ||
5752 | { | ||
5753 | long nr_swap_pages = get_nr_swap_pages(); | ||
5754 | |||
5755 | if (!do_swap_account || !cgroup_subsys_on_dfl(memory_cgrp_subsys)) | ||
5756 | return nr_swap_pages; | ||
5757 | for (; memcg != root_mem_cgroup; memcg = parent_mem_cgroup(memcg)) | ||
5758 | nr_swap_pages = min_t(long, nr_swap_pages, | ||
5759 | READ_ONCE(memcg->swap.limit) - | ||
5760 | page_counter_read(&memcg->swap)); | ||
5761 | return nr_swap_pages; | ||
5762 | } | ||
5763 | |||
5751 | /* for remember boot option*/ | 5764 | /* for remember boot option*/ |
5752 | #ifdef CONFIG_MEMCG_SWAP_ENABLED | 5765 | #ifdef CONFIG_MEMCG_SWAP_ENABLED |
5753 | static int really_do_swap_account __initdata = 1; | 5766 | static int really_do_swap_account __initdata = 1; |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 9a8556e49cd9..3be5f9db6c42 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -2004,7 +2004,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg, | |||
2004 | force_scan = true; | 2004 | force_scan = true; |
2005 | 2005 | ||
2006 | /* If we have no swap space, do not bother scanning anon pages. */ | 2006 | /* If we have no swap space, do not bother scanning anon pages. */ |
2007 | if (!sc->may_swap || (get_nr_swap_pages() <= 0)) { | 2007 | if (!sc->may_swap || mem_cgroup_get_nr_swap_pages(memcg) <= 0) { |
2008 | scan_balance = SCAN_FILE; | 2008 | scan_balance = SCAN_FILE; |
2009 | goto out; | 2009 | goto out; |
2010 | } | 2010 | } |