[PATCH] mm/compaction: do not break pages whose order is larger than target order

Wenchao Hao
2025-04-24T15:38:48Z

When scanning free pages for memory compaction, if the compaction target
order is explicitly specified, do not split pages in buddy whose order
are larger than compaction target order.

Signed-off-by: Wenchao Hao <haowenchao22@gmail.com>
---
mm/compaction.c | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/mm/compaction.c b/mm/compaction.c
index 3925cb61dbb8..b0ed0831c400 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -656,6 +656,17 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,

/* Found a free page, will break it into order-0 pages */
order = buddy_order(page);
+
+ /*
+ * Do not break free pages whose order is larger than
+ * compact's desired order
+ */
+ if (cc->order != -1 && order >= cc->order) {
+ blockpfn += (1 << order) - 1;
+ page += (1 << order) - 1;
+ goto isolate_fail;
+ }
+
isolated = __isolate_free_page(page, order);
if (!isolated)
break;
--
2.34.1