All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20140528134905.GF2878@cmpxchg.org>

diff --git a/a/1.txt b/N1/1.txt
index 3798475..d3add88 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -45,3 +45,166 @@ here.
 Patch applies on top of mmots.
 
 ---
+>From ced6ac70bb274cdaa4c5d78b53420d84fb803dd7 Mon Sep 17 00:00:00 2001
+From: Johannes Weiner <hannes@cmpxchg.org>
+Date: Wed, 28 May 2014 09:37:05 -0400
+Subject: [patch] mm: vmscan: treat memcg low limit as hard guarantee
+
+Don't hide low limit configuration problems behind weak semantics and
+quietly breach the set-up guarantees.
+
+Make it simple: memcg guarantees are equivalent to mlocked memory,
+anonymous memory without swap, kernel memory, pinned memory etc. -
+unreclaimable.  If no memory can be reclaimed without otherwise
+breaching guarantees, it's a real problem, so let the machine OOM and
+dump the memory state in that situation.
+
+Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
+---
+ include/linux/memcontrol.h |  5 -----
+ mm/memcontrol.c            | 15 ---------------
+ mm/vmscan.c                | 41 +++++------------------------------------
+ 3 files changed, 5 insertions(+), 56 deletions(-)
+
+diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
+index a5cf853129ec..c3a53cbb88eb 100644
+--- a/include/linux/memcontrol.h
++++ b/include/linux/memcontrol.h
+@@ -94,7 +94,6 @@ bool task_in_mem_cgroup(struct task_struct *task,
+ 
+ extern bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,
+ 		struct mem_cgroup *root);
+-extern bool mem_cgroup_all_within_guarantee(struct mem_cgroup *root);
+ 
+ extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);
+ extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
+@@ -297,10 +296,6 @@ static inline bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,
+ {
+ 	return false;
+ }
+-static inline bool mem_cgroup_all_within_guarantee(struct mem_cgroup *root)
+-{
+-	return false;
+-}
+ 
+ static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
+ {
+diff --git a/mm/memcontrol.c b/mm/memcontrol.c
+index 4df733e13727..85fdef53fcf1 100644
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -2788,7 +2788,6 @@ static struct mem_cgroup *mem_cgroup_lookup(unsigned short id)
+  *
+  * The given group is within its reclaim gurantee if it is below its low limit
+  * or the same applies for any parent up the hierarchy until root (including).
+- * Such a group might be excluded from the reclaim.
+  */
+ bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,
+ 		struct mem_cgroup *root)
+@@ -2801,25 +2800,11 @@ bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,
+ 			return true;
+ 		if (memcg == root)
+ 			break;
+-
+ 	} while ((memcg = parent_mem_cgroup(memcg)));
+ 
+ 	return false;
+ }
+ 
+-bool mem_cgroup_all_within_guarantee(struct mem_cgroup *root)
+-{
+-	struct mem_cgroup *iter;
+-
+-	for_each_mem_cgroup_tree(iter, root)
+-		if (!mem_cgroup_within_guarantee(iter, root)) {
+-			mem_cgroup_iter_break(root, iter);
+-			return false;
+-		}
+-
+-	return true;
+-}
+-
+ struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
+ {
+ 	struct mem_cgroup *memcg = NULL;
+diff --git a/mm/vmscan.c b/mm/vmscan.c
+index a8ffe4e616fe..c72493e8fb53 100644
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -2244,20 +2244,14 @@ static inline bool should_continue_reclaim(struct zone *zone,
+ }
+ 
+ /**
+- * __shrink_zone - shrinks a given zone
++ * shrink_zone - shrinks a given zone
+  *
+  * @zone: zone to shrink
+  * @sc: scan control with additional reclaim parameters
+- * @honor_memcg_guarantee: do not reclaim memcgs which are within their memory
+- * guarantee
+- *
+- * Returns the number of reclaimed memcgs.
+  */
+-static unsigned __shrink_zone(struct zone *zone, struct scan_control *sc,
+-		bool honor_memcg_guarantee)
++static void shrink_zone(struct zone *zone, struct scan_control *sc)
+ {
+ 	unsigned long nr_reclaimed, nr_scanned;
+-	unsigned nr_scanned_groups = 0;
+ 
+ 	do {
+ 		struct mem_cgroup *root = sc->target_mem_cgroup;
+@@ -2274,20 +2268,16 @@ static unsigned __shrink_zone(struct zone *zone, struct scan_control *sc,
+ 		do {
+ 			struct lruvec *lruvec;
+ 
+-			/* Memcg might be protected from the reclaim */
+-			if (honor_memcg_guarantee &&
+-					mem_cgroup_within_guarantee(memcg, root)) {
++			/* Don't reclaim guaranteed memory */
++			if (mem_cgroup_within_guarantee(memcg, root)) {
+ 				/*
+-				 * It would be more optimal to skip the memcg
+-				 * subtree now but we do not have a memcg iter
+-				 * helper for that. Anyone?
++				 * XXX: skip the entire subtree here
+ 				 */
+ 				memcg = mem_cgroup_iter(root, memcg, &reclaim);
+ 				continue;
+ 			}
+ 
+ 			lruvec = mem_cgroup_zone_lruvec(zone, memcg);
+-			nr_scanned_groups++;
+ 
+ 			sc->swappiness = mem_cgroup_swappiness(memcg);
+ 			shrink_lruvec(lruvec, sc);
+@@ -2316,27 +2306,6 @@ static unsigned __shrink_zone(struct zone *zone, struct scan_control *sc,
+ 
+ 	} while (should_continue_reclaim(zone, sc->nr_reclaimed - nr_reclaimed,
+ 					 sc->nr_scanned - nr_scanned, sc));
+-
+-	return nr_scanned_groups;
+-}
+-
+-static void shrink_zone(struct zone *zone, struct scan_control *sc)
+-{
+-	bool honor_guarantee = true;
+-
+-	while (!__shrink_zone(zone, sc, honor_guarantee)) {
+-		/*
+-		 * The previous round of reclaim didn't find anything to scan
+-		 * because
+-		 * a) the whole reclaimed hierarchy is within guarantee so
+-		 *    we fallback to ignore the guarantee because other option
+-		 *    would be the OOM
+-		 * b) multiple reclaimers are racing and so the first round
+-		 *    should be retried
+-		 */
+-		if (mem_cgroup_all_within_guarantee(sc->target_mem_cgroup))
+-			honor_guarantee = false;
+-	}
+ }
+ 
+ /* Returns true if compaction should go ahead for a high-order request */
+-- 
+1.9.3
diff --git a/a/content_digest b/N1/content_digest
index 5f77190..b3d3a5e 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -63,6 +63,169 @@
  "\n"
  "Patch applies on top of mmots.\n"
  "\n"
- ---
+ "---\n"
+ ">From ced6ac70bb274cdaa4c5d78b53420d84fb803dd7 Mon Sep 17 00:00:00 2001\n"
+ "From: Johannes Weiner <hannes@cmpxchg.org>\n"
+ "Date: Wed, 28 May 2014 09:37:05 -0400\n"
+ "Subject: [patch] mm: vmscan: treat memcg low limit as hard guarantee\n"
+ "\n"
+ "Don't hide low limit configuration problems behind weak semantics and\n"
+ "quietly breach the set-up guarantees.\n"
+ "\n"
+ "Make it simple: memcg guarantees are equivalent to mlocked memory,\n"
+ "anonymous memory without swap, kernel memory, pinned memory etc. -\n"
+ "unreclaimable.  If no memory can be reclaimed without otherwise\n"
+ "breaching guarantees, it's a real problem, so let the machine OOM and\n"
+ "dump the memory state in that situation.\n"
+ "\n"
+ "Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>\n"
+ "---\n"
+ " include/linux/memcontrol.h |  5 -----\n"
+ " mm/memcontrol.c            | 15 ---------------\n"
+ " mm/vmscan.c                | 41 +++++------------------------------------\n"
+ " 3 files changed, 5 insertions(+), 56 deletions(-)\n"
+ "\n"
+ "diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h\n"
+ "index a5cf853129ec..c3a53cbb88eb 100644\n"
+ "--- a/include/linux/memcontrol.h\n"
+ "+++ b/include/linux/memcontrol.h\n"
+ "@@ -94,7 +94,6 @@ bool task_in_mem_cgroup(struct task_struct *task,\n"
+ " \n"
+ " extern bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,\n"
+ " \t\tstruct mem_cgroup *root);\n"
+ "-extern bool mem_cgroup_all_within_guarantee(struct mem_cgroup *root);\n"
+ " \n"
+ " extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);\n"
+ " extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);\n"
+ "@@ -297,10 +296,6 @@ static inline bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,\n"
+ " {\n"
+ " \treturn false;\n"
+ " }\n"
+ "-static inline bool mem_cgroup_all_within_guarantee(struct mem_cgroup *root)\n"
+ "-{\n"
+ "-\treturn false;\n"
+ "-}\n"
+ " \n"
+ " static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)\n"
+ " {\n"
+ "diff --git a/mm/memcontrol.c b/mm/memcontrol.c\n"
+ "index 4df733e13727..85fdef53fcf1 100644\n"
+ "--- a/mm/memcontrol.c\n"
+ "+++ b/mm/memcontrol.c\n"
+ "@@ -2788,7 +2788,6 @@ static struct mem_cgroup *mem_cgroup_lookup(unsigned short id)\n"
+ "  *\n"
+ "  * The given group is within its reclaim gurantee if it is below its low limit\n"
+ "  * or the same applies for any parent up the hierarchy until root (including).\n"
+ "- * Such a group might be excluded from the reclaim.\n"
+ "  */\n"
+ " bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,\n"
+ " \t\tstruct mem_cgroup *root)\n"
+ "@@ -2801,25 +2800,11 @@ bool mem_cgroup_within_guarantee(struct mem_cgroup *memcg,\n"
+ " \t\t\treturn true;\n"
+ " \t\tif (memcg == root)\n"
+ " \t\t\tbreak;\n"
+ "-\n"
+ " \t} while ((memcg = parent_mem_cgroup(memcg)));\n"
+ " \n"
+ " \treturn false;\n"
+ " }\n"
+ " \n"
+ "-bool mem_cgroup_all_within_guarantee(struct mem_cgroup *root)\n"
+ "-{\n"
+ "-\tstruct mem_cgroup *iter;\n"
+ "-\n"
+ "-\tfor_each_mem_cgroup_tree(iter, root)\n"
+ "-\t\tif (!mem_cgroup_within_guarantee(iter, root)) {\n"
+ "-\t\t\tmem_cgroup_iter_break(root, iter);\n"
+ "-\t\t\treturn false;\n"
+ "-\t\t}\n"
+ "-\n"
+ "-\treturn true;\n"
+ "-}\n"
+ "-\n"
+ " struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)\n"
+ " {\n"
+ " \tstruct mem_cgroup *memcg = NULL;\n"
+ "diff --git a/mm/vmscan.c b/mm/vmscan.c\n"
+ "index a8ffe4e616fe..c72493e8fb53 100644\n"
+ "--- a/mm/vmscan.c\n"
+ "+++ b/mm/vmscan.c\n"
+ "@@ -2244,20 +2244,14 @@ static inline bool should_continue_reclaim(struct zone *zone,\n"
+ " }\n"
+ " \n"
+ " /**\n"
+ "- * __shrink_zone - shrinks a given zone\n"
+ "+ * shrink_zone - shrinks a given zone\n"
+ "  *\n"
+ "  * @zone: zone to shrink\n"
+ "  * @sc: scan control with additional reclaim parameters\n"
+ "- * @honor_memcg_guarantee: do not reclaim memcgs which are within their memory\n"
+ "- * guarantee\n"
+ "- *\n"
+ "- * Returns the number of reclaimed memcgs.\n"
+ "  */\n"
+ "-static unsigned __shrink_zone(struct zone *zone, struct scan_control *sc,\n"
+ "-\t\tbool honor_memcg_guarantee)\n"
+ "+static void shrink_zone(struct zone *zone, struct scan_control *sc)\n"
+ " {\n"
+ " \tunsigned long nr_reclaimed, nr_scanned;\n"
+ "-\tunsigned nr_scanned_groups = 0;\n"
+ " \n"
+ " \tdo {\n"
+ " \t\tstruct mem_cgroup *root = sc->target_mem_cgroup;\n"
+ "@@ -2274,20 +2268,16 @@ static unsigned __shrink_zone(struct zone *zone, struct scan_control *sc,\n"
+ " \t\tdo {\n"
+ " \t\t\tstruct lruvec *lruvec;\n"
+ " \n"
+ "-\t\t\t/* Memcg might be protected from the reclaim */\n"
+ "-\t\t\tif (honor_memcg_guarantee &&\n"
+ "-\t\t\t\t\tmem_cgroup_within_guarantee(memcg, root)) {\n"
+ "+\t\t\t/* Don't reclaim guaranteed memory */\n"
+ "+\t\t\tif (mem_cgroup_within_guarantee(memcg, root)) {\n"
+ " \t\t\t\t/*\n"
+ "-\t\t\t\t * It would be more optimal to skip the memcg\n"
+ "-\t\t\t\t * subtree now but we do not have a memcg iter\n"
+ "-\t\t\t\t * helper for that. Anyone?\n"
+ "+\t\t\t\t * XXX: skip the entire subtree here\n"
+ " \t\t\t\t */\n"
+ " \t\t\t\tmemcg = mem_cgroup_iter(root, memcg, &reclaim);\n"
+ " \t\t\t\tcontinue;\n"
+ " \t\t\t}\n"
+ " \n"
+ " \t\t\tlruvec = mem_cgroup_zone_lruvec(zone, memcg);\n"
+ "-\t\t\tnr_scanned_groups++;\n"
+ " \n"
+ " \t\t\tsc->swappiness = mem_cgroup_swappiness(memcg);\n"
+ " \t\t\tshrink_lruvec(lruvec, sc);\n"
+ "@@ -2316,27 +2306,6 @@ static unsigned __shrink_zone(struct zone *zone, struct scan_control *sc,\n"
+ " \n"
+ " \t} while (should_continue_reclaim(zone, sc->nr_reclaimed - nr_reclaimed,\n"
+ " \t\t\t\t\t sc->nr_scanned - nr_scanned, sc));\n"
+ "-\n"
+ "-\treturn nr_scanned_groups;\n"
+ "-}\n"
+ "-\n"
+ "-static void shrink_zone(struct zone *zone, struct scan_control *sc)\n"
+ "-{\n"
+ "-\tbool honor_guarantee = true;\n"
+ "-\n"
+ "-\twhile (!__shrink_zone(zone, sc, honor_guarantee)) {\n"
+ "-\t\t/*\n"
+ "-\t\t * The previous round of reclaim didn't find anything to scan\n"
+ "-\t\t * because\n"
+ "-\t\t * a) the whole reclaimed hierarchy is within guarantee so\n"
+ "-\t\t *    we fallback to ignore the guarantee because other option\n"
+ "-\t\t *    would be the OOM\n"
+ "-\t\t * b) multiple reclaimers are racing and so the first round\n"
+ "-\t\t *    should be retried\n"
+ "-\t\t */\n"
+ "-\t\tif (mem_cgroup_all_within_guarantee(sc->target_mem_cgroup))\n"
+ "-\t\t\thonor_guarantee = false;\n"
+ "-\t}\n"
+ " }\n"
+ " \n"
+ " /* Returns true if compaction should go ahead for a high-order request */\n"
+ "-- \n"
+ 1.9.3
 
-3c47a1f5c58557e986580531fc90d6c37dd141ef29024ea9ef95673597211c18
+049bb8ce885731cf0a805ceff33e4ddcb28ea349f9e8cbae8f3d6783876f61d7

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.