From: Dave Hansen <dave.hansen@linux.intel.com>
To: linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org,dan.j.williams@intel.com,Dave Hansen
<dave.hansen@linux.intel.com>,keith.busch@intel.com
Subject: [PATCH 4/4] mm/vmscan: Consider anonymous pages without swap
Date: Wed, 16 Oct 2019 15:11:54 -0700 [thread overview]
Message-ID: <20191016221154.CDD7064D@viggo.jf.intel.com> (raw)
In-Reply-To: <20191016221148.F9CCD155@viggo.jf.intel.com>
From: Keith Busch <keith.busch@intel.com>
Age and reclaim anonymous pages if a migration path is available. The
node has other recourses for inactive anonymous pages beyond swap,
Signed-off-by: Keith Busch <keith.busch@intel.com>
Co-developed-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
---
b/include/linux/swap.h | 20 ++++++++++++++++++++
b/mm/vmscan.c | 10 +++++-----
2 files changed, 25 insertions(+), 5 deletions(-)
diff -puN include/linux/swap.h~0006-mm-vmscan-Consider-anonymous-pages-without-swap include/linux/swap.h
--- a/include/linux/swap.h~0006-mm-vmscan-Consider-anonymous-pages-without-swap 2019-10-16 15:06:59.474952590 -0700
+++ b/include/linux/swap.h 2019-10-16 15:06:59.481952590 -0700
@@ -680,5 +680,25 @@ static inline bool mem_cgroup_swap_full(
}
#endif
+static inline bool reclaim_anon_pages(struct mem_cgroup *memcg,
+ int node_id)
+{
+ /* Always age anon pages when we have swap */
+ if (memcg == NULL) {
+ if (get_nr_swap_pages() > 0)
+ return true;
+ } else {
+ if (mem_cgroup_get_nr_swap_pages(memcg) > 0)
+ return true;
+ }
+
+ /* Also age anon pages if we can auto-migrate them */
+ if (next_migration_node(node_id) >= 0)
+ return true;
+
+ /* No way to reclaim anon pages */
+ return false;
+}
+
#endif /* __KERNEL__*/
#endif /* _LINUX_SWAP_H */
diff -puN mm/vmscan.c~0006-mm-vmscan-Consider-anonymous-pages-without-swap mm/vmscan.c
--- a/mm/vmscan.c~0006-mm-vmscan-Consider-anonymous-pages-without-swap 2019-10-16 15:06:59.477952590 -0700
+++ b/mm/vmscan.c 2019-10-16 15:06:59.482952590 -0700
@@ -327,7 +327,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 (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);
@@ -2166,7 +2166,7 @@ static bool inactive_list_is_low(struct
* If we don't have swap space, anonymous page deactivation
* is pointless.
*/
- if (!file && !total_swap_pages)
+ if (!file && !reclaim_anon_pages(NULL, pgdat->node_id))
return false;
inactive = lruvec_lru_size(lruvec, inactive_lru, sc->reclaim_idx);
@@ -2241,7 +2241,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 || !reclaim_anon_pages(memcg, pgdat->node_id)) {
scan_balance = SCAN_FILE;
goto out;
}
@@ -2604,7 +2604,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 (!reclaim_anon_pages(NULL, pgdat->node_id))
inactive_lru_pages += node_page_state(pgdat, NR_INACTIVE_ANON);
if (sc->nr_reclaimed < pages_for_compaction &&
inactive_lru_pages > pages_for_compaction)
@@ -3289,7 +3289,7 @@ static void age_active_anon(struct pglis
{
struct mem_cgroup *memcg;
- if (!total_swap_pages)
+ if (!reclaim_anon_pages(NULL, pgdat->node_id))
return;
memcg = mem_cgroup_iter(NULL, NULL, NULL);
_
next prev parent reply other threads:[~2019-10-16 22:14 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-16 22:11 [PATCH 0/4] [RFC] Migrate Pages in lieu of discard Dave Hansen
2019-10-16 22:11 ` [PATCH 1/4] node: Define and export memory migration path Dave Hansen
2019-10-17 11:12 ` Kirill A. Shutemov
2019-10-17 11:44 ` Kirill A. Shutemov
2019-10-16 22:11 ` [PATCH 2/4] mm/migrate: Defer allocating new page until needed Dave Hansen
2019-10-17 11:27 ` Kirill A. Shutemov
2019-10-16 22:11 ` [PATCH 3/4] mm/vmscan: Attempt to migrate page in lieu of discard Dave Hansen
2019-10-17 17:30 ` Yang Shi
2019-10-18 18:15 ` Dave Hansen
2019-10-18 21:02 ` Yang Shi
2019-10-16 22:11 ` Dave Hansen [this message]
2019-10-17 3:45 ` [PATCH 0/4] [RFC] Migrate Pages " Shakeel Butt
2019-10-17 14:26 ` Dave Hansen
2019-10-17 16:58 ` Shakeel Butt
2019-10-17 20:51 ` Dave Hansen
2019-10-17 17:20 ` Yang Shi
2019-10-17 21:05 ` Dave Hansen
2019-10-17 22:58 ` Shakeel Butt
2019-10-18 21:44 ` Yang Shi
2019-10-17 16:01 ` Suleiman Souhlal
2019-10-17 16:32 ` Dave Hansen
2019-10-17 16:39 ` Shakeel Butt
2019-10-18 8:11 ` Suleiman Souhlal
2019-10-18 15:10 ` Dave Hansen
2019-10-18 15:39 ` Suleiman Souhlal
2019-10-18 7:44 ` Michal Hocko
2019-10-18 14:54 ` Dave Hansen
2019-10-18 21:39 ` Yang Shi
2019-10-18 21:55 ` Dan Williams
2019-10-22 13:49 ` Michal Hocko
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=20191016221154.CDD7064D@viggo.jf.intel.com \
--to=dave.hansen@linux.intel.com \
--cc=dan.j.williams@intel.com \
--cc=keith.busch@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox