From: Dave Hansen <dave.hansen@linux.intel.com> To: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org, Dave Hansen <dave.hansen@linux.intel.com>, kbusch@kernel.org, vishal.l.verma@intel.com, yang.shi@linux.alibaba.com, rientjes@google.com, ying.huang@intel.com, dan.j.williams@intel.com, david@redhat.com, osalvador@suse.de Subject: [RFC][PATCH 11/13] mm/vmscan: Consider anonymous pages without swap Date: Mon, 25 Jan 2021 16:34:32 -0800 [thread overview] Message-ID: <20210126003432.6E88B570@viggo.jf.intel.com> (raw) In-Reply-To: <20210126003411.2AC51464@viggo.jf.intel.com> From: Keith Busch <kbusch@kernel.org> Reclaim anonymous pages if a migration path is available now that demotion provides a non-swap recourse for reclaiming anon pages. Note that this check is subtly different from the anon_should_be_aged() checks. This mechanism checks whether a specific page in a specific context *can* actually be reclaimed, given current swap space and cgroup limits anon_should_be_aged() is a much simpler and more prelimiary check which just says whether there is a possibility of future reclaim. #Signed-off-by: Keith Busch <keith.busch@intel.com> Cc: Keith Busch <kbusch@kernel.org> [vishal: fixup the migration->demotion rename] Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Yang Shi <yang.shi@linux.alibaba.com> Cc: David Rientjes <rientjes@google.com> Cc: Huang Ying <ying.huang@intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: osalvador <osalvador@suse.de> -- Changes from Dave 10/2020: * remove 'total_swap_pages' modification Changes from Dave 06/2020: * rename reclaim_anon_pages()->can_reclaim_anon_pages() Note: Keith's Intel SoB is commented out because he is no longer at Intel and his @intel.com mail will bouncee --- b/mm/vmscan.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff -puN mm/vmscan.c~0009-mm-vmscan-Consider-anonymous-pages-without-swap mm/vmscan.c --- a/mm/vmscan.c~0009-mm-vmscan-Consider-anonymous-pages-without-swap 2021-01-25 16:23:18.106866688 -0800 +++ b/mm/vmscan.c 2021-01-25 16:23:18.111866688 -0800 @@ -289,6 +289,34 @@ static bool writeback_throttling_sane(st } #endif +static inline bool can_reclaim_anon_pages(struct mem_cgroup *memcg, + int node_id) +{ + if (memcg == NULL) { + /* + * For non-memcg reclaim, is there + * space in any swap device? + */ + if (get_nr_swap_pages() > 0) + return true; + } else { + /* Is the memcg below its swap limit? */ + if (mem_cgroup_get_nr_swap_pages(memcg) > 0) + return true; + } + + /* + * The page can not be swapped. + * + * Can it be reclaimed from this node via demotion? + */ + if (next_demotion_node(node_id) >= 0) + return true; + + /* No way to reclaim anon pages */ + return false; +} + /* * This misses isolated pages which are not accounted for to save counters. * As the data only determines if reclaim or compaction continues, it is @@ -300,7 +328,7 @@ unsigned long zone_reclaimable_pages(str nr = zone_page_state_snapshot(zone, NR_ZONE_INACTIVE_FILE) + zone_page_state_snapshot(zone, NR_ZONE_ACTIVE_FILE); - if (get_nr_swap_pages() > 0) + if (can_reclaim_anon_pages(NULL, zone_to_nid(zone))) nr += zone_page_state_snapshot(zone, NR_ZONE_INACTIVE_ANON) + zone_page_state_snapshot(zone, NR_ZONE_ACTIVE_ANON); @@ -2323,6 +2351,7 @@ enum scan_balance { static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, unsigned long *nr) { + struct pglist_data *pgdat = lruvec_pgdat(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec); unsigned long anon_cost, file_cost, total_cost; int swappiness = mem_cgroup_swappiness(memcg); @@ -2333,7 +2362,7 @@ static void get_scan_count(struct lruvec enum lru_list lru; /* If we have no swap space, do not bother scanning anon pages. */ - if (!sc->may_swap || mem_cgroup_get_nr_swap_pages(memcg) <= 0) { + if (!sc->may_swap || !can_reclaim_anon_pages(memcg, pgdat->node_id)) { scan_balance = SCAN_FILE; goto out; } @@ -2708,7 +2737,7 @@ static inline bool should_continue_recla */ pages_for_compaction = compact_gap(sc->order); inactive_lru_pages = node_page_state(pgdat, NR_INACTIVE_FILE); - if (get_nr_swap_pages() > 0) + if (can_reclaim_anon_pages(NULL, pgdat->node_id)) inactive_lru_pages += node_page_state(pgdat, NR_INACTIVE_ANON); return inactive_lru_pages > pages_for_compaction; _
WARNING: multiple messages have this Message-ID (diff)
From: Dave Hansen <dave.hansen@linux.intel.com> To: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org,Dave Hansen <dave.hansen@linux.intel.com>,kbusch@kernel.org,vishal.l.verma@intel.com,yang.shi@linux.alibaba.com,rientjes@google.com,ying.huang@intel.com,dan.j.williams@intel.com,david@redhat.com,osalvador@suse.de Subject: [RFC][PATCH 11/13] mm/vmscan: Consider anonymous pages without swap Date: Mon, 25 Jan 2021 16:34:32 -0800 [thread overview] Message-ID: <20210126003432.6E88B570@viggo.jf.intel.com> (raw) In-Reply-To: <20210126003411.2AC51464@viggo.jf.intel.com> From: Keith Busch <kbusch@kernel.org> Reclaim anonymous pages if a migration path is available now that demotion provides a non-swap recourse for reclaiming anon pages. Note that this check is subtly different from the anon_should_be_aged() checks. This mechanism checks whether a specific page in a specific context *can* actually be reclaimed, given current swap space and cgroup limits anon_should_be_aged() is a much simpler and more prelimiary check which just says whether there is a possibility of future reclaim. #Signed-off-by: Keith Busch <keith.busch@intel.com> Cc: Keith Busch <kbusch@kernel.org> [vishal: fixup the migration->demotion rename] Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Yang Shi <yang.shi@linux.alibaba.com> Cc: David Rientjes <rientjes@google.com> Cc: Huang Ying <ying.huang@intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: osalvador <osalvador@suse.de> -- Changes from Dave 10/2020: * remove 'total_swap_pages' modification Changes from Dave 06/2020: * rename reclaim_anon_pages()->can_reclaim_anon_pages() Note: Keith's Intel SoB is commented out because he is no longer at Intel and his @intel.com mail will bouncee --- b/mm/vmscan.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff -puN mm/vmscan.c~0009-mm-vmscan-Consider-anonymous-pages-without-swap mm/vmscan.c --- a/mm/vmscan.c~0009-mm-vmscan-Consider-anonymous-pages-without-swap 2021-01-25 16:23:18.106866688 -0800 +++ b/mm/vmscan.c 2021-01-25 16:23:18.111866688 -0800 @@ -289,6 +289,34 @@ static bool writeback_throttling_sane(st } #endif +static inline bool can_reclaim_anon_pages(struct mem_cgroup *memcg, + int node_id) +{ + if (memcg == NULL) { + /* + * For non-memcg reclaim, is there + * space in any swap device? + */ + if (get_nr_swap_pages() > 0) + return true; + } else { + /* Is the memcg below its swap limit? */ + if (mem_cgroup_get_nr_swap_pages(memcg) > 0) + return true; + } + + /* + * The page can not be swapped. + * + * Can it be reclaimed from this node via demotion? + */ + if (next_demotion_node(node_id) >= 0) + return true; + + /* No way to reclaim anon pages */ + return false; +} + /* * This misses isolated pages which are not accounted for to save counters. * As the data only determines if reclaim or compaction continues, it is @@ -300,7 +328,7 @@ unsigned long zone_reclaimable_pages(str nr = zone_page_state_snapshot(zone, NR_ZONE_INACTIVE_FILE) + zone_page_state_snapshot(zone, NR_ZONE_ACTIVE_FILE); - if (get_nr_swap_pages() > 0) + if (can_reclaim_anon_pages(NULL, zone_to_nid(zone))) nr += zone_page_state_snapshot(zone, NR_ZONE_INACTIVE_ANON) + zone_page_state_snapshot(zone, NR_ZONE_ACTIVE_ANON); @@ -2323,6 +2351,7 @@ enum scan_balance { static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, unsigned long *nr) { + struct pglist_data *pgdat = lruvec_pgdat(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec); unsigned long anon_cost, file_cost, total_cost; int swappiness = mem_cgroup_swappiness(memcg); @@ -2333,7 +2362,7 @@ static void get_scan_count(struct lruvec enum lru_list lru; /* If we have no swap space, do not bother scanning anon pages. */ - if (!sc->may_swap || mem_cgroup_get_nr_swap_pages(memcg) <= 0) { + if (!sc->may_swap || !can_reclaim_anon_pages(memcg, pgdat->node_id)) { scan_balance = SCAN_FILE; goto out; } @@ -2708,7 +2737,7 @@ static inline bool should_continue_recla */ pages_for_compaction = compact_gap(sc->order); inactive_lru_pages = node_page_state(pgdat, NR_INACTIVE_FILE); - if (get_nr_swap_pages() > 0) + if (can_reclaim_anon_pages(NULL, pgdat->node_id)) inactive_lru_pages += node_page_state(pgdat, NR_INACTIVE_ANON); return inactive_lru_pages > pages_for_compaction; _
next prev parent reply other threads:[~2021-01-26 10:20 UTC|newest] Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-01-26 0:34 [RFC][PATCH 00/13] [v5] Migrate Pages in lieu of discard Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-26 0:34 ` [RFC][PATCH 01/13] mm/vmscan: restore zone_reclaim_mode ABI Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-02-10 9:42 ` Oscar Salvador 2021-01-26 0:34 ` [RFC][PATCH 02/13] mm/vmscan: move RECLAIM* bits to uapi header Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-02-10 9:44 ` Oscar Salvador 2021-01-26 0:34 ` [RFC][PATCH 03/13] mm/vmscan: replace implicit RECLAIM_ZONE checks with explicit checks Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-31 1:10 ` David Rientjes 2021-01-31 1:10 ` David Rientjes 2021-02-10 9:54 ` Oscar Salvador 2021-01-26 0:34 ` [RFC][PATCH 04/13] mm/numa: node demotion data structure and lookup Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-31 1:19 ` David Rientjes 2021-01-31 1:19 ` David Rientjes 2021-02-01 17:49 ` Dave Hansen 2021-01-26 0:34 ` [RFC][PATCH 05/13] mm/numa: automatically generate node migration order Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-29 20:46 ` Yang Shi 2021-01-29 20:46 ` Yang Shi 2021-02-01 19:13 ` Dave Hansen 2021-02-02 11:43 ` Oscar Salvador 2021-02-02 17:46 ` Yang Shi 2021-02-02 17:46 ` Yang Shi 2021-02-03 0:43 ` Dave Hansen 2021-02-04 0:26 ` Yang Shi 2021-02-04 0:26 ` Yang Shi 2021-01-26 0:34 ` [RFC][PATCH 06/13] mm/migrate: update migration order during on hotplug events Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-29 20:59 ` Yang Shi 2021-01-29 20:59 ` Yang Shi 2021-02-02 11:42 ` Oscar Salvador 2021-02-09 23:45 ` Dave Hansen 2021-02-10 8:55 ` Oscar Salvador 2021-01-26 0:34 ` [RFC][PATCH 07/13] mm/migrate: make migrate_pages() return nr_succeeded Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-29 21:04 ` Yang Shi 2021-01-29 21:04 ` Yang Shi 2021-02-09 23:41 ` Dave Hansen 2021-01-26 0:34 ` [RFC][PATCH 08/13] mm/migrate: demote pages during reclaim Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-02-02 11:55 ` Oscar Salvador 2021-02-02 22:45 ` Yang Shi 2021-02-02 22:45 ` Yang Shi 2021-02-02 22:56 ` Dave Hansen 2021-02-02 18:22 ` Yang Shi 2021-02-02 18:22 ` Yang Shi 2021-02-02 18:34 ` Dave Hansen 2021-01-26 0:34 ` [RFC][PATCH 09/13] mm/vmscan: add page demotion counter Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-26 0:34 ` [RFC][PATCH 10/13] mm/vmscan: add helper for querying ability to age anonymous pages Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-26 0:34 ` Dave Hansen [this message] 2021-01-26 0:34 ` [RFC][PATCH 11/13] mm/vmscan: Consider anonymous pages without swap Dave Hansen 2021-02-02 18:56 ` Yang Shi 2021-02-02 18:56 ` Yang Shi 2021-02-02 21:35 ` Dave Hansen 2021-02-02 22:35 ` Yang Shi 2021-02-02 22:35 ` Yang Shi 2021-01-26 0:34 ` [RFC][PATCH 12/13] mm/vmscan: never demote for memcg reclaim Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-26 0:34 ` [RFC][PATCH 13/13] mm/migrate: new zone_reclaim_mode to enable reclaim migration Dave Hansen 2021-01-26 0:34 ` Dave Hansen 2021-01-31 1:13 ` [RFC][PATCH 00/13] [v5] Migrate Pages in lieu of discard David Rientjes 2021-01-31 1:13 ` David Rientjes
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210126003432.6E88B570@viggo.jf.intel.com \ --to=dave.hansen@linux.intel.com \ --cc=dan.j.williams@intel.com \ --cc=david@redhat.com \ --cc=kbusch@kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=osalvador@suse.de \ --cc=rientjes@google.com \ --cc=vishal.l.verma@intel.com \ --cc=yang.shi@linux.alibaba.com \ --cc=ying.huang@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.