diff for duplicates of <20161227155532.GI1308@dhcp22.suse.cz>
diff --git a/a/1.txt b/N1/1.txt
index 0ab28e4..f18a474 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -12,96 +12,4 @@ yet sure whether we need the same thing for anon/file balancing in
get_scan_count. I suspect we need but need to think more about that.
Thanks a lot again!
----
->From b51f50340fe9e40b68be198b012f8ab9869c1850 Mon Sep 17 00:00:00 2001
-From: Michal Hocko <mhocko@suse.com>
-Date: Tue, 27 Dec 2016 16:28:44 +0100
-Subject: [PATCH] mm, vmscan: consider eligible zones in get_scan_count
-
-get_scan_count considers the whole node LRU size when
-- doing SCAN_FILE due to many page cache inactive pages
-- calculating the number of pages to scan
-
-in both cases this might lead to unexpected behavior especially on 32b
-systems where we can expect lowmem memory pressure very often.
-
-A large highmem zone can easily distort SCAN_FILE heuristic because
-there might be only few file pages from the eligible zones on the node
-lru and we would still enforce file lru scanning which can lead to
-trashing while we could still scan anonymous pages.
-
-The later use of lruvec_lru_size can be problematic as well. Especially
-when there are not many pages from the eligible zones. We would have to
-skip over many pages to find anything to reclaim but shrink_node_memcg
-would only reduce the remaining number to scan by SWAP_CLUSTER_MAX
-at maximum. Therefore we can end up going over a large LRU many times
-without actually having chance to reclaim much if anything at all. The
-closer we are out of memory on lowmem zone the worse the problem will
-be.
-
-Signed-off-by: Michal Hocko <mhocko@suse.com>
----
- mm/vmscan.c | 30 ++++++++++++++++++++++++++++--
- 1 file changed, 28 insertions(+), 2 deletions(-)
-
-diff --git a/mm/vmscan.c b/mm/vmscan.c
-index c98b1a585992..785b4d7fb8a0 100644
---- a/mm/vmscan.c
-+++ b/mm/vmscan.c
-@@ -252,6 +252,32 @@ unsigned long lruvec_zone_lru_size(struct lruvec *lruvec, enum lru_list lru, int
- }
-
- /*
-+ * Return the number of pages on the given lru which are eligibne for the
-+ * given zone_idx
-+ */
-+static unsigned long lruvec_lru_size_zone_idx(struct lruvec *lruvec,
-+ enum lru_list lru, int zone_idx)
-+{
-+ struct pglist_data *pgdat = lruvec_pgdat(lruvec);
-+ unsigned long lru_size;
-+ int zid;
-+
-+ lru_size = lruvec_lru_size(lruvec, lru);
-+ for (zid = zone_idx + 1; zid < MAX_NR_ZONES; zid++) {
-+ struct zone *zone = &pgdat->node_zones[zid];
-+ unsigned long size;
-+
-+ if (!managed_zone(zone))
-+ continue;
-+
-+ size = lruvec_zone_lru_size(lruvec, lru, zid);
-+ lru_size -= min(size, lru_size);
-+ }
-+
-+ return lru_size;
-+}
-+
-+/*
- * Add a shrinker callback to be called from the vm.
- */
- int register_shrinker(struct shrinker *shrinker)
-@@ -2207,7 +2233,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
- * system is under heavy pressure.
- */
- if (!inactive_list_is_low(lruvec, true, sc) &&
-- lruvec_lru_size(lruvec, LRU_INACTIVE_FILE) >> sc->priority) {
-+ lruvec_lru_size_zone_idx(lruvec, LRU_INACTIVE_FILE, sc->reclaim_idx) >> sc->priority) {
- scan_balance = SCAN_FILE;
- goto out;
- }
-@@ -2274,7 +2300,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
- unsigned long size;
- unsigned long scan;
-
-- size = lruvec_lru_size(lruvec, lru);
-+ size = lruvec_lru_size_zone_idx(lruvec, lru, sc->reclaim_idx);
- scan = size >> sc->priority;
-
- if (!scan && pass && force_scan)
---
-2.10.2
-
---
-Michal Hocko
-SUSE Labs
\ No newline at end of file
+---
\ No newline at end of file
diff --git a/a/content_digest b/N1/content_digest
index d666a08..4f03e70 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -72,99 +72,7 @@
"get_scan_count. I suspect we need but need to think more about that.\n",
"\n",
"Thanks a lot again!\n",
- "---\n",
- ">From b51f50340fe9e40b68be198b012f8ab9869c1850 Mon Sep 17 00:00:00 2001\n",
- "From: Michal Hocko <mhocko\@suse.com>\n",
- "Date: Tue, 27 Dec 2016 16:28:44 +0100\n",
- "Subject: [PATCH] mm, vmscan: consider eligible zones in get_scan_count\n",
- "\n",
- "get_scan_count considers the whole node LRU size when\n",
- "- doing SCAN_FILE due to many page cache inactive pages\n",
- "- calculating the number of pages to scan\n",
- "\n",
- "in both cases this might lead to unexpected behavior especially on 32b\n",
- "systems where we can expect lowmem memory pressure very often.\n",
- "\n",
- "A large highmem zone can easily distort SCAN_FILE heuristic because\n",
- "there might be only few file pages from the eligible zones on the node\n",
- "lru and we would still enforce file lru scanning which can lead to\n",
- "trashing while we could still scan anonymous pages.\n",
- "\n",
- "The later use of lruvec_lru_size can be problematic as well. Especially\n",
- "when there are not many pages from the eligible zones. We would have to\n",
- "skip over many pages to find anything to reclaim but shrink_node_memcg\n",
- "would only reduce the remaining number to scan by SWAP_CLUSTER_MAX\n",
- "at maximum. Therefore we can end up going over a large LRU many times\n",
- "without actually having chance to reclaim much if anything at all. The\n",
- "closer we are out of memory on lowmem zone the worse the problem will\n",
- "be.\n",
- "\n",
- "Signed-off-by: Michal Hocko <mhocko\@suse.com>\n",
- "---\n",
- " mm/vmscan.c | 30 ++++++++++++++++++++++++++++--\n",
- " 1 file changed, 28 insertions(+), 2 deletions(-)\n",
- "\n",
- "diff --git a/mm/vmscan.c b/mm/vmscan.c\n",
- "index c98b1a585992..785b4d7fb8a0 100644\n",
- "--- a/mm/vmscan.c\n",
- "+++ b/mm/vmscan.c\n",
- "\@\@ -252,6 +252,32 \@\@ unsigned long lruvec_zone_lru_size(struct lruvec *lruvec, enum lru_list lru, int\n",
- " }\n",
- " \n",
- " /*\n",
- "+ * Return the number of pages on the given lru which are eligibne for the\n",
- "+ * given zone_idx\n",
- "+ */\n",
- "+static unsigned long lruvec_lru_size_zone_idx(struct lruvec *lruvec,\n",
- "+\t\tenum lru_list lru, int zone_idx)\n",
- "+{\n",
- "+\tstruct pglist_data *pgdat = lruvec_pgdat(lruvec);\n",
- "+\tunsigned long lru_size;\n",
- "+\tint zid;\n",
- "+\n",
- "+\tlru_size = lruvec_lru_size(lruvec, lru);\n",
- "+\tfor (zid = zone_idx + 1; zid < MAX_NR_ZONES; zid++) {\n",
- "+\t\tstruct zone *zone = &pgdat->node_zones[zid];\n",
- "+\t\tunsigned long size;\n",
- "+\n",
- "+\t\tif (!managed_zone(zone))\n",
- "+\t\t\tcontinue;\n",
- "+\n",
- "+\t\tsize = lruvec_zone_lru_size(lruvec, lru, zid);\n",
- "+\t\tlru_size -= min(size, lru_size);\n",
- "+\t}\n",
- "+\n",
- "+\treturn lru_size;\n",
- "+}\n",
- "+\n",
- "+/*\n",
- " * Add a shrinker callback to be called from the vm.\n",
- " */\n",
- " int register_shrinker(struct shrinker *shrinker)\n",
- "\@\@ -2207,7 +2233,7 \@\@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,\n",
- " \t * system is under heavy pressure.\n",
- " \t */\n",
- " \tif (!inactive_list_is_low(lruvec, true, sc) &&\n",
- "-\t lruvec_lru_size(lruvec, LRU_INACTIVE_FILE) >> sc->priority) {\n",
- "+\t lruvec_lru_size_zone_idx(lruvec, LRU_INACTIVE_FILE, sc->reclaim_idx) >> sc->priority) {\n",
- " \t\tscan_balance = SCAN_FILE;\n",
- " \t\tgoto out;\n",
- " \t}\n",
- "\@\@ -2274,7 +2300,7 \@\@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,\n",
- " \t\t\tunsigned long size;\n",
- " \t\t\tunsigned long scan;\n",
- " \n",
- "-\t\t\tsize = lruvec_lru_size(lruvec, lru);\n",
- "+\t\t\tsize = lruvec_lru_size_zone_idx(lruvec, lru, sc->reclaim_idx);\n",
- " \t\t\tscan = size >> sc->priority;\n",
- " \n",
- " \t\t\tif (!scan && pass && force_scan)\n",
- "-- \n",
- "2.10.2\n",
- "\n",
- "-- \n",
- "Michal Hocko\n",
- "SUSE Labs"
+ "---"
]
-2da98d36c85deb407d3f333ef913221e1bddc251fc6a10866596fd44b599be8a
+ff15302606fb28c372f8fc0a7b01381b4029fb249b8be6debf7e62958d6f9c1c
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.