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.