From: Rik van Riel <riel@redhat.com>
To: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Elladan <elladan@eskimo.com>,
linux-kernel@vger.kernel.org, tytso@mit.edu, linux-mm@kvack.org
Subject: [PATCH] vmscan: evict use-once pages first (v3)
Date: Wed, 29 Apr 2009 13:14:36 -0400 [thread overview]
Message-ID: <20090429131436.640f09ab@cuia.bos.redhat.com> (raw)
In-Reply-To: <2f11576a0904290907g48e94e74ye97aae593f6ac519@mail.gmail.com>
When the file LRU lists are dominated by streaming IO pages,
evict those pages first, before considering evicting other
pages.
This should be safe from deadlocks or performance problems
because only three things can happen to an inactive file page:
1) referenced twice and promoted to the active list
2) evicted by the pageout code
3) under IO, after which it will get evicted or promoted
The pages freed in this way can either be reused for streaming
IO, or allocated for something else. If the pages are used for
streaming IO, this pageout pattern continues. Otherwise, we will
fall back to the normal pageout pattern.
Signed-off-by: Rik van Riel <riel@redhat.com>
---
On Thu, 30 Apr 2009 01:07:51 +0900
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> wrote:
> we handle active_anon vs inactive_anon ratio by shrink_list().
> Why do you insert this logic insert shrink_zone() ?
Kosaki, this implementation mirrors the anon side of things precisely.
Does this look good?
Elladan, this patch should work just like the second version. Please
let me know how it works for you.
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index a9e3b76..dbfe7ba 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -94,6 +94,7 @@ extern void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem,
extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem,
int priority);
int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg);
+int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg);
unsigned long mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg,
struct zone *zone,
enum lru_list lru);
@@ -239,6 +240,12 @@ mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg)
return 1;
}
+static inline int
+mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg)
+{
+ return 1;
+}
+
static inline unsigned long
mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg, struct zone *zone,
enum lru_list lru)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index e44fb0f..026cb5a 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -578,6 +578,17 @@ int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg)
return 0;
}
+int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg)
+{
+ unsigned long active;
+ unsigned long inactive;
+
+ inactive = mem_cgroup_get_local_zonestat(memcg, LRU_INACTIVE_FILE);
+ active = mem_cgroup_get_local_zonestat(memcg, LRU_ACTIVE_FILE);
+
+ return (active > inactive);
+}
+
unsigned long mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg,
struct zone *zone,
enum lru_list lru)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index eac9577..a73f675 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1348,12 +1348,48 @@ static int inactive_anon_is_low(struct zone *zone, struct scan_control *sc)
return low;
}
+static int inactive_file_is_low_global(struct zone *zone)
+{
+ unsigned long active, inactive;
+
+ active = zone_page_state(zone, NR_ACTIVE_FILE);
+ inactive = zone_page_state(zone, NR_INACTIVE_FILE);
+
+ return (active > inactive);
+}
+
+/**
+ * inactive_file_is_low - check if file pages need to be deactivated
+ * @zone: zone to check
+ * @sc: scan control of this context
+ *
+ * When the system is doing streaming IO, memory pressure here
+ * ensures that active file pages get deactivated, until more
+ * than half of the file pages are on the inactive list.
+ *
+ * Once we get to that situation, protect the system's working
+ * set from being evicted by disabling active file page aging.
+ *
+ * This uses a different ratio than the anonymous pages, because
+ * the page cache uses a use-once replacement algorithm.
+ */
+static int inactive_file_is_low(struct zone *zone, struct scan_control *sc)
+{
+ int low;
+
+ if (scanning_global_lru(sc))
+ low = inactive_file_is_low_global(zone);
+ else
+ low = mem_cgroup_inactive_file_is_low(sc->mem_cgroup);
+ return low;
+}
+
static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
struct zone *zone, struct scan_control *sc, int priority)
{
int file = is_file_lru(lru);
- if (lru == LRU_ACTIVE_FILE) {
+ if (lru == LRU_ACTIVE_FILE && inactive_file_is_low(zone, sc)) {
shrink_active_list(nr_to_scan, zone, sc, priority, file);
return 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:[~2009-04-29 17:14 UTC|newest]
Thread overview: 168+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090428044426.GA5035@eskimo.com>
2009-04-28 5:35 ` Swappiness vs. mmap() and interactive response KOSAKI Motohiro
2009-04-28 6:36 ` Elladan
2009-04-28 6:52 ` KOSAKI Motohiro
2009-04-28 7:26 ` Elladan
2009-04-28 7:44 ` KOSAKI Motohiro
2009-04-28 7:48 ` Peter Zijlstra
2009-04-28 7:58 ` Balbir Singh
2009-04-28 8:11 ` Peter Zijlstra
2009-04-28 8:23 ` KAMEZAWA Hiroyuki
2009-04-28 8:25 ` Balbir Singh
2009-04-28 8:03 ` KOSAKI Motohiro
2009-04-28 9:09 ` Wu Fengguang
2009-04-28 9:26 ` Wu Fengguang
2009-04-28 12:08 ` Theodore Tso
2009-04-29 5:51 ` KOSAKI Motohiro
2009-04-29 6:34 ` Andrew Morton
2009-04-29 7:47 ` KOSAKI Motohiro
2009-04-30 4:14 ` Elladan
2009-04-30 4:43 ` Andrew Morton
2009-04-30 4:55 ` KOSAKI Motohiro
2009-04-30 4:55 ` Elladan
2009-04-29 7:48 ` KOSAKI Motohiro
2009-04-30 11:59 ` KOSAKI Motohiro
2009-04-30 13:46 ` Elladan
2009-05-06 11:04 ` KOSAKI Motohiro
2009-04-28 15:28 ` Rik van Riel
2009-04-28 23:29 ` [PATCH] vmscan: evict use-once pages first Rik van Riel
2009-04-29 3:36 ` Elladan
2009-04-29 17:06 ` Christoph Hellwig
2009-04-29 6:42 ` Peter Zijlstra
2009-04-29 13:30 ` Rik van Riel
2009-04-29 15:47 ` [PATCH] vmscan: evict use-once pages first (v2) Rik van Riel
2009-04-29 16:07 ` KOSAKI Motohiro
2009-04-29 16:18 ` Rik van Riel
2009-04-29 17:14 ` Rik van Riel [this message]
2009-04-30 0:39 ` [PATCH] vmscan: evict use-once pages first (v3) KOSAKI Motohiro
2009-04-30 8:10 ` Johannes Weiner
2009-05-01 22:32 ` Andrew Morton
2009-05-01 23:05 ` Rik van Riel
2009-05-01 23:25 ` Andrew Morton
2009-05-03 1:28 ` Wu Fengguang
2009-05-03 1:15 ` Wu Fengguang
2009-05-03 1:33 ` Rik van Riel
2009-05-03 1:46 ` Wu Fengguang
2009-04-29 16:10 ` [PATCH] vmscan: evict use-once pages first (v2) Peter Zijlstra
2009-04-30 7:20 ` Elladan
2009-04-30 13:08 ` Rik van Riel
2009-04-30 14:00 ` Elladan
2009-05-01 0:45 ` Andrew Morton
2009-05-01 0:59 ` Rik van Riel
2009-05-01 1:13 ` Andrew Morton
2009-05-01 1:50 ` Rik van Riel
2009-05-01 2:54 ` Andrew Morton
2009-05-01 14:05 ` Rik van Riel
2009-05-01 18:04 ` Ray Lee
2009-05-01 19:34 ` Rik van Riel
2009-05-01 19:44 ` Ray Lee
2009-05-01 20:08 ` Rik van Riel
2009-05-01 20:17 ` Elladan
2009-05-01 19:35 ` Andrew Morton
2009-05-01 20:05 ` Rik van Riel
2009-05-01 20:45 ` Andrew Morton
2009-05-01 21:46 ` Rik van Riel
2009-05-03 3:15 ` Wu Fengguang
2009-05-03 3:24 ` Rik van Riel
2009-05-03 3:43 ` Wu Fengguang
2009-05-04 10:23 ` Peter Zijlstra
2009-05-07 12:11 ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Wu Fengguang
2009-05-07 13:39 ` Christoph Lameter
2009-05-07 14:15 ` Peter Zijlstra
2009-05-07 14:18 ` Christoph Lameter
2009-05-07 14:38 ` Peter Zijlstra
2009-05-07 15:36 ` Christoph Lameter
2009-05-07 15:59 ` Rik van Riel
2009-05-07 15:06 ` Rik van Riel
2009-05-07 16:00 ` Lee Schermerhorn
2009-05-07 16:32 ` Christoph Lameter
2009-05-07 17:11 ` Rik van Riel
2009-05-08 3:40 ` Elladan
2009-05-08 16:04 ` Rik van Riel
2009-05-09 4:04 ` Elladan
2009-05-08 17:18 ` Christoph Lameter
2009-05-09 10:20 ` KOSAKI Motohiro
2009-05-08 17:37 ` Alan Cox
2009-05-07 15:10 ` Johannes Weiner
2009-05-07 15:17 ` Peter Zijlstra
2009-05-07 15:21 ` Rik van Riel
2009-05-08 3:30 ` Wu Fengguang
2009-05-08 4:17 ` [RFC][PATCH] vmscan: report vm_flags in page_referenced() Wu Fengguang
2009-05-08 12:09 ` Minchan Kim
2009-05-08 12:15 ` Wu Fengguang
2009-05-08 14:01 ` Minchan Kim
2009-05-09 6:56 ` Wu Fengguang
2009-05-10 23:45 ` Minchan Kim
2009-05-17 11:25 ` Wu Fengguang
2009-05-07 20:44 ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Andrew Morton
2009-05-08 8:16 ` Wu Fengguang
2009-05-08 8:28 ` Wu Fengguang
2009-05-08 19:58 ` Andrew Morton
2009-05-08 22:00 ` Alan Cox
2009-05-08 22:15 ` Andrew Morton
2009-05-08 22:53 ` Elladan
2009-05-08 22:20 ` Rik van Riel
2009-05-10 8:59 ` KOSAKI Motohiro
2009-05-10 9:07 ` Peter Zijlstra
2009-05-10 9:35 ` Wu Fengguang
2009-05-10 10:06 ` KOSAKI Motohiro
2009-05-10 9:36 ` KOSAKI Motohiro
2009-05-10 13:45 ` Alan Cox
2009-05-10 13:56 ` KOSAKI Motohiro
2009-05-10 14:51 ` Rik van Riel
2009-05-10 14:59 ` KOSAKI Motohiro
2009-05-10 20:13 ` Alan Cox
2009-05-10 20:37 ` Rik van Riel
2009-05-10 21:23 ` Arjan van de Ven
2009-05-11 10:03 ` Johannes Weiner
2009-05-10 21:29 ` Alan Cox
2009-05-10 9:20 ` Wu Fengguang
2009-05-10 9:29 ` KOSAKI Motohiro
2009-05-10 10:03 ` Wu Fengguang
2009-05-10 10:15 ` KOSAKI Motohiro
2009-05-10 11:21 ` Wu Fengguang
2009-05-10 11:39 ` KOSAKI Motohiro
2009-05-10 11:44 ` Wu Fengguang
2009-05-10 12:19 ` Peter Zijlstra
2009-05-10 12:39 ` KOSAKI Motohiro
2009-05-10 13:17 ` Peter Zijlstra
2009-05-12 2:50 ` Wu Fengguang
2009-05-12 4:35 ` Wu Fengguang
2009-05-12 13:20 ` Rik van Riel
2009-05-16 9:26 ` Wu Fengguang
2009-05-12 2:51 ` [PATCH -mm] vmscan: report vm_flags in page_referenced() Wu Fengguang
2009-05-12 6:23 ` Peter Zijlstra
2009-05-12 6:44 ` Minchan Kim
2009-05-12 11:44 ` Wu Fengguang
2009-05-12 2:52 ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Wu Fengguang
2009-05-12 3:00 ` KOSAKI Motohiro
2009-05-12 20:54 ` [PATCH -mm] vmscan: protect a fraction of file backed mapped pages from reclaim Christoph Lameter
2009-05-12 17:06 ` Rik van Riel
2009-05-12 21:20 ` Christoph Lameter
2009-05-12 17:39 ` Rik van Riel
2009-05-12 22:02 ` Christoph Lameter
2009-05-12 20:17 ` Rik van Riel
2009-05-12 20:26 ` Christoph Lameter
2009-05-13 0:45 ` KOSAKI Motohiro
2009-05-14 20:14 ` Christoph Lameter
2009-05-14 23:28 ` KOSAKI Motohiro
2009-05-14 23:42 ` Rik van Riel
2009-05-15 18:09 ` Christoph Lameter
2009-05-16 8:54 ` Wu Fengguang
2009-05-12 8:17 ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Minchan Kim
2009-05-12 2:53 ` [PATCH -mm] vmscan: merge duplicate code in shrink_active_list() Wu Fengguang
2009-05-12 2:58 ` KOSAKI Motohiro
2009-05-12 3:03 ` Wu Fengguang
2009-05-12 7:26 ` Minchan Kim
2009-05-12 11:48 ` Wu Fengguang
2009-05-12 11:57 ` Minchan Kim
2009-05-12 13:32 ` Rik van Riel
2009-05-16 9:30 ` Wu Fengguang
2009-05-08 3:02 ` [PATCH -mm] vmscan: make mapped executable pages the first class citizen Wu Fengguang
2009-05-08 7:30 ` Minchan Kim
2009-05-08 8:09 ` Wu Fengguang
2009-05-08 9:34 ` Minchan Kim
2009-05-08 14:25 ` Christoph Lameter
2009-05-08 14:34 ` Rik van Riel
2009-05-08 17:41 ` KOSAKI Motohiro
2009-05-04 8:04 ` [PATCH] vmscan: evict use-once pages first (v2) Peter Zijlstra
2009-05-01 3:09 ` Elladan
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=20090429131436.640f09ab@cuia.bos.redhat.com \
--to=riel@redhat.com \
--cc=elladan@eskimo.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=peterz@infradead.org \
--cc=tytso@mit.edu \
/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;
as well as URLs for NNTP newsgroup(s).