From: Michal Hocko <mhocko@kernel.org>
To: linux-mm@kvack.org
Cc: Johannes Weiner <hannes@cmpxchg.org>,
Mel Gorman <mgorman@suse.de>, Minchan Kim <minchan@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Michal Hocko <mhocko@suse.com>
Subject: [RFC PATCH 2/2] mm, vmscan: cleanup inactive_list_is_low
Date: Tue, 10 Jan 2017 13:55:52 +0100 [thread overview]
Message-ID: <20170110125552.4170-3-mhocko@kernel.org> (raw)
In-Reply-To: <20170110125552.4170-1-mhocko@kernel.org>
From: Michal Hocko <mhocko@suse.com>
inactive_list_is_low is duplicating logic implemented by
lruvec_lru_size_eligibe_zones. Let's use the dedicated function to get
the number of eligible pages on the lru list and ask use lruvec_lru_size
to get the total LRU lize only when the tracing is really requested. We
are still iterating over all LRUs two times in that case but a)
inactive_list_is_low is not a hot path and b) this can be addressed at
the tracing layer and only evaluate arguments only when the tracing is
enabled in future if that ever matters.
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
mm/vmscan.c | 38 ++++++++++----------------------------
1 file changed, 10 insertions(+), 28 deletions(-)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 137bc85067d3..a9c881f06c0e 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2054,11 +2054,10 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
struct scan_control *sc, bool trace)
{
unsigned long inactive_ratio;
- unsigned long total_inactive, inactive;
- unsigned long total_active, active;
+ unsigned long inactive, active;
+ enum lru_list inactive_lru = file * LRU_FILE;
+ enum lru_list active_lru = file * LRU_FILE + LRU_ACTIVE;
unsigned long gb;
- struct pglist_data *pgdat = lruvec_pgdat(lruvec);
- int zid;
/*
* If we don't have swap space, anonymous page deactivation
@@ -2067,27 +2066,8 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
if (!file && !total_swap_pages)
return false;
- total_inactive = inactive = lruvec_lru_size(lruvec, file * LRU_FILE);
- total_active = active = lruvec_lru_size(lruvec, file * LRU_FILE + LRU_ACTIVE);
-
- /*
- * For zone-constrained allocations, it is necessary to check if
- * deactivations are required for lowmem to be reclaimed. This
- * calculates the inactive/active pages available in eligible zones.
- */
- for (zid = sc->reclaim_idx + 1; zid < MAX_NR_ZONES; zid++) {
- struct zone *zone = &pgdat->node_zones[zid];
- unsigned long inactive_zone, active_zone;
-
- if (!managed_zone(zone))
- continue;
-
- inactive_zone = lruvec_zone_lru_size(lruvec, file * LRU_FILE, zid);
- active_zone = lruvec_zone_lru_size(lruvec, (file * LRU_FILE) + LRU_ACTIVE, zid);
-
- inactive -= min(inactive, inactive_zone);
- active -= min(active, active_zone);
- }
+ inactive = lruvec_lru_size_eligibe_zones(lruvec, inactive_lru, sc->reclaim_idx);
+ active = lruvec_lru_size_eligibe_zones(lruvec, active_lru, sc->reclaim_idx);
gb = (inactive + active) >> (30 - PAGE_SHIFT);
if (gb)
@@ -2096,10 +2076,12 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file,
inactive_ratio = 1;
if (trace)
- trace_mm_vmscan_inactive_list_is_low(pgdat->node_id,
+ trace_mm_vmscan_inactive_list_is_low(lruvec_pgdat(lruvec)->node_id,
sc->reclaim_idx,
- total_inactive, inactive,
- total_active, active, inactive_ratio, file);
+ lruvec_lru_size(lruvec, inactive_lru), inactive,
+ lruvec_lru_size(lruvec, active_lru), active,
+ inactive_ratio, file);
+
return inactive * inactive_ratio < active;
}
--
2.11.0
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-01-10 12:56 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-10 12:55 [RFC PATCH 0/2] follow up nodereclaim for 32b fix Michal Hocko
2017-01-10 12:55 ` [RFC PATCH 1/2] mm, vmscan: consider eligible zones in get_scan_count Michal Hocko
2017-01-11 6:18 ` Hillf Danton
2017-01-13 9:18 ` Michal Hocko
2017-01-17 6:47 ` Minchan Kim
2017-01-14 16:12 ` Johannes Weiner
2017-01-16 9:29 ` Michal Hocko
2017-01-16 16:01 ` Johannes Weiner
2017-01-16 19:33 ` [PATCH 1/3] mm, vmscan: cleanup lru size claculations Michal Hocko
2017-01-16 19:33 ` Michal Hocko
2017-01-16 19:33 ` [PATCH 2/3] mm, vmscan: consider eligible zones in get_scan_count Michal Hocko
2017-01-16 19:33 ` Michal Hocko
2017-01-17 3:42 ` Hillf Danton
2017-01-17 3:42 ` Hillf Danton
2017-01-16 19:33 ` [PATCH 3/3] Reverted "mm: bail out in shrink_inactive_list()" Michal Hocko
2017-01-16 19:33 ` Michal Hocko
2017-01-17 3:58 ` Hillf Danton
2017-01-17 3:58 ` Hillf Danton
2017-01-17 6:58 ` Minchan Kim
2017-01-17 6:58 ` Minchan Kim
2017-01-17 3:40 ` [PATCH 1/3] mm, vmscan: cleanup lru size claculations Hillf Danton
2017-01-17 3:40 ` Hillf Danton
2017-01-17 6:58 ` Minchan Kim
2017-01-17 6:58 ` Minchan Kim
2017-01-10 12:55 ` Michal Hocko [this message]
2017-01-10 23:56 ` [RFC PATCH 2/2] mm, vmscan: cleanup inactive_list_is_low Minchan Kim
2017-01-11 6:22 ` Hillf Danton
2017-01-14 16:16 ` Johannes Weiner
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=20170110125552.4170-3-mhocko@kernel.org \
--to=mhocko@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@suse.de \
--cc=mhocko@suse.com \
--cc=minchan@kernel.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 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.