All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <56f2c2ed-8a58-cf9c-dd00-c0d0e274607a@suse.cz>

diff --git a/a/1.txt b/N1/1.txt
index 1f117be..8f128b5 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -14,194 +14,4 @@ I was thinking that this shouldn't be a problem on non-costly orders and default
 extfrag_threshold. But better be safe. Moreover I think the issue is much more
 dangerous for compact_zonelist_suitable() as explained below.
 
-----8<----
->From 0e6cb251aa6e3b1be7deff315c0238c4d478f22e Mon Sep 17 00:00:00 2001
-From: Vlastimil Babka <vbabka@suse.cz>
-Date: Thu, 22 Sep 2016 15:33:57 +0200
-Subject: [PATCH] mm, compaction: ignore fragindex on highest direct compaction
- priority
-
-Fragmentation index check in compaction_suitable() should be the last heuristic
-that we allow on the highest compaction priority. Since that's a potential
-premature OOM, disable it too. Even more problematic is its usage from
-compaction_zonelist_suitable() -> __compaction_suitable() where we check the
-order-0 watermark against free plus available-for-reclaim pages, but the
-fragindex considers only truly free pages. Thus we can get a result close to 0
-indicating failure do to lack of memory, and wrongly decide that compaction
-won't be suitable even after reclaim. The solution is to skip the fragindex
-check also in this context, regardless of priority.
-
-Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
----
- include/linux/compaction.h |  5 +++--
- mm/compaction.c            | 44 +++++++++++++++++++++++---------------------
- mm/internal.h              |  1 +
- mm/vmscan.c                |  6 ++++--
- 4 files changed, 31 insertions(+), 25 deletions(-)
-
-diff --git a/include/linux/compaction.h b/include/linux/compaction.h
-index 0d8415820fc3..3ccf13d57651 100644
---- a/include/linux/compaction.h
-+++ b/include/linux/compaction.h
-@@ -97,7 +97,8 @@ extern enum compact_result try_to_compact_pages(gfp_t gfp_mask,
- 		const struct alloc_context *ac, enum compact_priority prio);
- extern void reset_isolation_suitable(pg_data_t *pgdat);
- extern enum compact_result compaction_suitable(struct zone *zone, int order,
--		unsigned int alloc_flags, int classzone_idx);
-+		unsigned int alloc_flags, int classzone_idx,
-+		bool check_fragindex);
- 
- extern void defer_compaction(struct zone *zone, int order);
- extern bool compaction_deferred(struct zone *zone, int order);
-@@ -183,7 +184,7 @@ static inline void reset_isolation_suitable(pg_data_t *pgdat)
- }
- 
- static inline enum compact_result compaction_suitable(struct zone *zone, int order,
--					int alloc_flags, int classzone_idx)
-+		int alloc_flags, int classzone_idx, bool check_fragindex)
- {
- 	return COMPACT_SKIPPED;
- }
-diff --git a/mm/compaction.c b/mm/compaction.c
-index 86d4d0bbfc7c..ae6a115f37b2 100644
---- a/mm/compaction.c
-+++ b/mm/compaction.c
-@@ -1379,7 +1379,6 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
- 					int classzone_idx,
- 					unsigned long wmark_target)
- {
--	int fragindex;
- 	unsigned long watermark;
- 
- 	if (is_via_compact_memory(order))
-@@ -1415,6 +1414,18 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
- 						ALLOC_CMA, wmark_target))
- 		return COMPACT_SKIPPED;
- 
-+	return COMPACT_CONTINUE;
-+}
-+
-+enum compact_result compaction_suitable(struct zone *zone, int order,
-+					unsigned int alloc_flags,
-+					int classzone_idx, bool check_fragindex)
-+{
-+	enum compact_result ret;
-+	int fragindex;
-+
-+	ret = __compaction_suitable(zone, order, alloc_flags, classzone_idx,
-+			zone_page_state(zone, NR_FREE_PAGES));
- 	/*
- 	 * fragmentation index determines if allocation failures are due to
- 	 * low memory or external fragmentation
-@@ -1426,21 +1437,12 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
- 	 *
- 	 * Only compact if a failure would be due to fragmentation.
- 	 */
--	fragindex = fragmentation_index(zone, order);
--	if (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold)
--		return COMPACT_NOT_SUITABLE_ZONE;
--
--	return COMPACT_CONTINUE;
--}
--
--enum compact_result compaction_suitable(struct zone *zone, int order,
--					unsigned int alloc_flags,
--					int classzone_idx)
--{
--	enum compact_result ret;
-+	if (ret == COMPACT_CONTINUE && check_fragindex) {
-+		fragindex = fragmentation_index(zone, order);
-+		if (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold)
-+			ret = COMPACT_NOT_SUITABLE_ZONE;
-+	}
- 
--	ret = __compaction_suitable(zone, order, alloc_flags, classzone_idx,
--				    zone_page_state(zone, NR_FREE_PAGES));
- 	trace_mm_compaction_suitable(zone, order, ret);
- 	if (ret == COMPACT_NOT_SUITABLE_ZONE)
- 		ret = COMPACT_SKIPPED;
-@@ -1473,8 +1475,7 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order,
- 		available += zone_page_state_snapshot(zone, NR_FREE_PAGES);
- 		compact_result = __compaction_suitable(zone, order, alloc_flags,
- 				ac_classzone_idx(ac), available);
--		if (compact_result != COMPACT_SKIPPED &&
--				compact_result != COMPACT_NOT_SUITABLE_ZONE)
-+		if (compact_result != COMPACT_SKIPPED)
- 			return true;
- 	}
- 
-@@ -1490,7 +1491,7 @@ static enum compact_result compact_zone(struct zone *zone, struct compact_contro
- 	const bool sync = cc->mode != MIGRATE_ASYNC;
- 
- 	ret = compaction_suitable(zone, cc->order, cc->alloc_flags,
--							cc->classzone_idx);
-+				cc->classzone_idx, !cc->ignore_fragindex);
- 	/* Compaction is likely to fail */
- 	if (ret == COMPACT_SUCCESS || ret == COMPACT_SKIPPED)
- 		return ret;
-@@ -1661,7 +1662,8 @@ static enum compact_result compact_zone_order(struct zone *zone, int order,
- 		.direct_compaction = true,
- 		.whole_zone = (prio == MIN_COMPACT_PRIORITY),
- 		.ignore_skip_hint = (prio == MIN_COMPACT_PRIORITY),
--		.ignore_block_suitable = (prio == MIN_COMPACT_PRIORITY)
-+		.ignore_block_suitable = (prio == MIN_COMPACT_PRIORITY),
-+		.ignore_fragindex = (prio == MIN_COMPACT_PRIORITY)
- 	};
- 	INIT_LIST_HEAD(&cc.freepages);
- 	INIT_LIST_HEAD(&cc.migratepages);
-@@ -1869,7 +1871,7 @@ static bool kcompactd_node_suitable(pg_data_t *pgdat)
- 			continue;
- 
- 		if (compaction_suitable(zone, pgdat->kcompactd_max_order, 0,
--					classzone_idx) == COMPACT_CONTINUE)
-+				classzone_idx, true) == COMPACT_CONTINUE)
- 			return true;
- 	}
- 
-@@ -1905,7 +1907,7 @@ static void kcompactd_do_work(pg_data_t *pgdat)
- 		if (compaction_deferred(zone, cc.order))
- 			continue;
- 
--		if (compaction_suitable(zone, cc.order, 0, zoneid) !=
-+		if (compaction_suitable(zone, cc.order, 0, zoneid, true) !=
- 							COMPACT_CONTINUE)
- 			continue;
- 
-diff --git a/mm/internal.h b/mm/internal.h
-index 537ac9951f5f..f18adf559e28 100644
---- a/mm/internal.h
-+++ b/mm/internal.h
-@@ -179,6 +179,7 @@ struct compact_control {
- 	enum migrate_mode mode;		/* Async or sync migration mode */
- 	bool ignore_skip_hint;		/* Scan blocks even if marked skip */
- 	bool ignore_block_suitable;	/* Scan blocks considered unsuitable */
-+	bool ignore_fragindex;		/* Ignore fragmentation index */
- 	bool direct_compaction;		/* False from kcompactd or /proc/... */
- 	bool whole_zone;		/* Whole zone should/has been scanned */
- 	int order;			/* order a direct compactor needs */
-diff --git a/mm/vmscan.c b/mm/vmscan.c
-index 55943a284082..08f16893cb2b 100644
---- a/mm/vmscan.c
-+++ b/mm/vmscan.c
-@@ -2511,7 +2511,8 @@ static inline bool should_continue_reclaim(struct pglist_data *pgdat,
- 		if (!managed_zone(zone))
- 			continue;
- 
--		switch (compaction_suitable(zone, sc->order, 0, sc->reclaim_idx)) {
-+		switch (compaction_suitable(zone, sc->order, 0,
-+						sc->reclaim_idx, true)) {
- 		case COMPACT_SUCCESS:
- 		case COMPACT_CONTINUE:
- 			return false;
-@@ -2624,7 +2625,8 @@ static inline bool compaction_ready(struct zone *zone, struct scan_control *sc)
- 	unsigned long watermark;
- 	enum compact_result suitable;
- 
--	suitable = compaction_suitable(zone, sc->order, 0, sc->reclaim_idx);
-+	suitable = compaction_suitable(zone, sc->order, 0, sc->reclaim_idx,
-+									true);
- 	if (suitable == COMPACT_SUCCESS)
- 		/* Allocation should succeed already. Don't reclaim. */
- 		return true;
--- 
-2.10.0
\ No newline at end of file
+----8<----
\ No newline at end of file
diff --git a/a/content_digest b/N1/content_digest
index e3367a5..3aaa71c 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -52,197 +52,7 @@
   "extfrag_threshold. But better be safe. Moreover I think the issue is much more\n",
   "dangerous for compact_zonelist_suitable() as explained below.\n",
   "\n",
-  "----8<----\n",
-  ">From 0e6cb251aa6e3b1be7deff315c0238c4d478f22e Mon Sep 17 00:00:00 2001\n",
-  "From: Vlastimil Babka <vbabka\@suse.cz>\n",
-  "Date: Thu, 22 Sep 2016 15:33:57 +0200\n",
-  "Subject: [PATCH] mm, compaction: ignore fragindex on highest direct compaction\n",
-  " priority\n",
-  "\n",
-  "Fragmentation index check in compaction_suitable() should be the last heuristic\n",
-  "that we allow on the highest compaction priority. Since that's a potential\n",
-  "premature OOM, disable it too. Even more problematic is its usage from\n",
-  "compaction_zonelist_suitable() -> __compaction_suitable() where we check the\n",
-  "order-0 watermark against free plus available-for-reclaim pages, but the\n",
-  "fragindex considers only truly free pages. Thus we can get a result close to 0\n",
-  "indicating failure do to lack of memory, and wrongly decide that compaction\n",
-  "won't be suitable even after reclaim. The solution is to skip the fragindex\n",
-  "check also in this context, regardless of priority.\n",
-  "\n",
-  "Signed-off-by: Vlastimil Babka <vbabka\@suse.cz>\n",
-  "---\n",
-  " include/linux/compaction.h |  5 +++--\n",
-  " mm/compaction.c            | 44 +++++++++++++++++++++++---------------------\n",
-  " mm/internal.h              |  1 +\n",
-  " mm/vmscan.c                |  6 ++++--\n",
-  " 4 files changed, 31 insertions(+), 25 deletions(-)\n",
-  "\n",
-  "diff --git a/include/linux/compaction.h b/include/linux/compaction.h\n",
-  "index 0d8415820fc3..3ccf13d57651 100644\n",
-  "--- a/include/linux/compaction.h\n",
-  "+++ b/include/linux/compaction.h\n",
-  "\@\@ -97,7 +97,8 \@\@ extern enum compact_result try_to_compact_pages(gfp_t gfp_mask,\n",
-  " \t\tconst struct alloc_context *ac, enum compact_priority prio);\n",
-  " extern void reset_isolation_suitable(pg_data_t *pgdat);\n",
-  " extern enum compact_result compaction_suitable(struct zone *zone, int order,\n",
-  "-\t\tunsigned int alloc_flags, int classzone_idx);\n",
-  "+\t\tunsigned int alloc_flags, int classzone_idx,\n",
-  "+\t\tbool check_fragindex);\n",
-  " \n",
-  " extern void defer_compaction(struct zone *zone, int order);\n",
-  " extern bool compaction_deferred(struct zone *zone, int order);\n",
-  "\@\@ -183,7 +184,7 \@\@ static inline void reset_isolation_suitable(pg_data_t *pgdat)\n",
-  " }\n",
-  " \n",
-  " static inline enum compact_result compaction_suitable(struct zone *zone, int order,\n",
-  "-\t\t\t\t\tint alloc_flags, int classzone_idx)\n",
-  "+\t\tint alloc_flags, int classzone_idx, bool check_fragindex)\n",
-  " {\n",
-  " \treturn COMPACT_SKIPPED;\n",
-  " }\n",
-  "diff --git a/mm/compaction.c b/mm/compaction.c\n",
-  "index 86d4d0bbfc7c..ae6a115f37b2 100644\n",
-  "--- a/mm/compaction.c\n",
-  "+++ b/mm/compaction.c\n",
-  "\@\@ -1379,7 +1379,6 \@\@ static enum compact_result __compaction_suitable(struct zone *zone, int order,\n",
-  " \t\t\t\t\tint classzone_idx,\n",
-  " \t\t\t\t\tunsigned long wmark_target)\n",
-  " {\n",
-  "-\tint fragindex;\n",
-  " \tunsigned long watermark;\n",
-  " \n",
-  " \tif (is_via_compact_memory(order))\n",
-  "\@\@ -1415,6 +1414,18 \@\@ static enum compact_result __compaction_suitable(struct zone *zone, int order,\n",
-  " \t\t\t\t\t\tALLOC_CMA, wmark_target))\n",
-  " \t\treturn COMPACT_SKIPPED;\n",
-  " \n",
-  "+\treturn COMPACT_CONTINUE;\n",
-  "+}\n",
-  "+\n",
-  "+enum compact_result compaction_suitable(struct zone *zone, int order,\n",
-  "+\t\t\t\t\tunsigned int alloc_flags,\n",
-  "+\t\t\t\t\tint classzone_idx, bool check_fragindex)\n",
-  "+{\n",
-  "+\tenum compact_result ret;\n",
-  "+\tint fragindex;\n",
-  "+\n",
-  "+\tret = __compaction_suitable(zone, order, alloc_flags, classzone_idx,\n",
-  "+\t\t\tzone_page_state(zone, NR_FREE_PAGES));\n",
-  " \t/*\n",
-  " \t * fragmentation index determines if allocation failures are due to\n",
-  " \t * low memory or external fragmentation\n",
-  "\@\@ -1426,21 +1437,12 \@\@ static enum compact_result __compaction_suitable(struct zone *zone, int order,\n",
-  " \t *\n",
-  " \t * Only compact if a failure would be due to fragmentation.\n",
-  " \t */\n",
-  "-\tfragindex = fragmentation_index(zone, order);\n",
-  "-\tif (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold)\n",
-  "-\t\treturn COMPACT_NOT_SUITABLE_ZONE;\n",
-  "-\n",
-  "-\treturn COMPACT_CONTINUE;\n",
-  "-}\n",
-  "-\n",
-  "-enum compact_result compaction_suitable(struct zone *zone, int order,\n",
-  "-\t\t\t\t\tunsigned int alloc_flags,\n",
-  "-\t\t\t\t\tint classzone_idx)\n",
-  "-{\n",
-  "-\tenum compact_result ret;\n",
-  "+\tif (ret == COMPACT_CONTINUE && check_fragindex) {\n",
-  "+\t\tfragindex = fragmentation_index(zone, order);\n",
-  "+\t\tif (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold)\n",
-  "+\t\t\tret = COMPACT_NOT_SUITABLE_ZONE;\n",
-  "+\t}\n",
-  " \n",
-  "-\tret = __compaction_suitable(zone, order, alloc_flags, classzone_idx,\n",
-  "-\t\t\t\t    zone_page_state(zone, NR_FREE_PAGES));\n",
-  " \ttrace_mm_compaction_suitable(zone, order, ret);\n",
-  " \tif (ret == COMPACT_NOT_SUITABLE_ZONE)\n",
-  " \t\tret = COMPACT_SKIPPED;\n",
-  "\@\@ -1473,8 +1475,7 \@\@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order,\n",
-  " \t\tavailable += zone_page_state_snapshot(zone, NR_FREE_PAGES);\n",
-  " \t\tcompact_result = __compaction_suitable(zone, order, alloc_flags,\n",
-  " \t\t\t\tac_classzone_idx(ac), available);\n",
-  "-\t\tif (compact_result != COMPACT_SKIPPED &&\n",
-  "-\t\t\t\tcompact_result != COMPACT_NOT_SUITABLE_ZONE)\n",
-  "+\t\tif (compact_result != COMPACT_SKIPPED)\n",
-  " \t\t\treturn true;\n",
-  " \t}\n",
-  " \n",
-  "\@\@ -1490,7 +1491,7 \@\@ static enum compact_result compact_zone(struct zone *zone, struct compact_contro\n",
-  " \tconst bool sync = cc->mode != MIGRATE_ASYNC;\n",
-  " \n",
-  " \tret = compaction_suitable(zone, cc->order, cc->alloc_flags,\n",
-  "-\t\t\t\t\t\t\tcc->classzone_idx);\n",
-  "+\t\t\t\tcc->classzone_idx, !cc->ignore_fragindex);\n",
-  " \t/* Compaction is likely to fail */\n",
-  " \tif (ret == COMPACT_SUCCESS || ret == COMPACT_SKIPPED)\n",
-  " \t\treturn ret;\n",
-  "\@\@ -1661,7 +1662,8 \@\@ static enum compact_result compact_zone_order(struct zone *zone, int order,\n",
-  " \t\t.direct_compaction = true,\n",
-  " \t\t.whole_zone = (prio == MIN_COMPACT_PRIORITY),\n",
-  " \t\t.ignore_skip_hint = (prio == MIN_COMPACT_PRIORITY),\n",
-  "-\t\t.ignore_block_suitable = (prio == MIN_COMPACT_PRIORITY)\n",
-  "+\t\t.ignore_block_suitable = (prio == MIN_COMPACT_PRIORITY),\n",
-  "+\t\t.ignore_fragindex = (prio == MIN_COMPACT_PRIORITY)\n",
-  " \t};\n",
-  " \tINIT_LIST_HEAD(&cc.freepages);\n",
-  " \tINIT_LIST_HEAD(&cc.migratepages);\n",
-  "\@\@ -1869,7 +1871,7 \@\@ static bool kcompactd_node_suitable(pg_data_t *pgdat)\n",
-  " \t\t\tcontinue;\n",
-  " \n",
-  " \t\tif (compaction_suitable(zone, pgdat->kcompactd_max_order, 0,\n",
-  "-\t\t\t\t\tclasszone_idx) == COMPACT_CONTINUE)\n",
-  "+\t\t\t\tclasszone_idx, true) == COMPACT_CONTINUE)\n",
-  " \t\t\treturn true;\n",
-  " \t}\n",
-  " \n",
-  "\@\@ -1905,7 +1907,7 \@\@ static void kcompactd_do_work(pg_data_t *pgdat)\n",
-  " \t\tif (compaction_deferred(zone, cc.order))\n",
-  " \t\t\tcontinue;\n",
-  " \n",
-  "-\t\tif (compaction_suitable(zone, cc.order, 0, zoneid) !=\n",
-  "+\t\tif (compaction_suitable(zone, cc.order, 0, zoneid, true) !=\n",
-  " \t\t\t\t\t\t\tCOMPACT_CONTINUE)\n",
-  " \t\t\tcontinue;\n",
-  " \n",
-  "diff --git a/mm/internal.h b/mm/internal.h\n",
-  "index 537ac9951f5f..f18adf559e28 100644\n",
-  "--- a/mm/internal.h\n",
-  "+++ b/mm/internal.h\n",
-  "\@\@ -179,6 +179,7 \@\@ struct compact_control {\n",
-  " \tenum migrate_mode mode;\t\t/* Async or sync migration mode */\n",
-  " \tbool ignore_skip_hint;\t\t/* Scan blocks even if marked skip */\n",
-  " \tbool ignore_block_suitable;\t/* Scan blocks considered unsuitable */\n",
-  "+\tbool ignore_fragindex;\t\t/* Ignore fragmentation index */\n",
-  " \tbool direct_compaction;\t\t/* False from kcompactd or /proc/... */\n",
-  " \tbool whole_zone;\t\t/* Whole zone should/has been scanned */\n",
-  " \tint order;\t\t\t/* order a direct compactor needs */\n",
-  "diff --git a/mm/vmscan.c b/mm/vmscan.c\n",
-  "index 55943a284082..08f16893cb2b 100644\n",
-  "--- a/mm/vmscan.c\n",
-  "+++ b/mm/vmscan.c\n",
-  "\@\@ -2511,7 +2511,8 \@\@ static inline bool should_continue_reclaim(struct pglist_data *pgdat,\n",
-  " \t\tif (!managed_zone(zone))\n",
-  " \t\t\tcontinue;\n",
-  " \n",
-  "-\t\tswitch (compaction_suitable(zone, sc->order, 0, sc->reclaim_idx)) {\n",
-  "+\t\tswitch (compaction_suitable(zone, sc->order, 0,\n",
-  "+\t\t\t\t\t\tsc->reclaim_idx, true)) {\n",
-  " \t\tcase COMPACT_SUCCESS:\n",
-  " \t\tcase COMPACT_CONTINUE:\n",
-  " \t\t\treturn false;\n",
-  "\@\@ -2624,7 +2625,8 \@\@ static inline bool compaction_ready(struct zone *zone, struct scan_control *sc)\n",
-  " \tunsigned long watermark;\n",
-  " \tenum compact_result suitable;\n",
-  " \n",
-  "-\tsuitable = compaction_suitable(zone, sc->order, 0, sc->reclaim_idx);\n",
-  "+\tsuitable = compaction_suitable(zone, sc->order, 0, sc->reclaim_idx,\n",
-  "+\t\t\t\t\t\t\t\t\ttrue);\n",
-  " \tif (suitable == COMPACT_SUCCESS)\n",
-  " \t\t/* Allocation should succeed already. Don't reclaim. */\n",
-  " \t\treturn true;\n",
-  "-- \n",
-  "2.10.0"
+  "----8<----"
 ]
 
-8892764549581dad7dbb4c2a70b70715ec40cfb049b13ae32c6fbc553c12b5cd
+109ae9344a38abb47bada1965ea21bded37bb000237eb53fde66fcb7fe199f4e

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.