Thread (34 messages) 34 messages, 6 authors, 2012-10-09

Re: CMA broken in next-20120926

From: Peter Ujfalusi <hidden>
Date: 2012-09-28 07:43:16
Also in: lkml

On 09/28/2012 08:43 AM, Minchan Kim wrote:
From 24a547855fa2bd4212a779cc73997837148310b3 Mon Sep 17 00:00:00 2001
From: Minchan Kim <minchan@kernel.org>
Date: Fri, 28 Sep 2012 14:28:32 +0900
Subject: [PATCH] revert mm: compaction: iron out isolate_freepages_block()
 and isolate_freepages_range()

[1] made bug on CMA.
The nr_scanned should be never equal to total_isolated for successful CMA.
This patch reverts part of the patch.

[1] mm: compaction: iron out isolate_freepages_block() and isolate_freepages_range()
With this patch applied on top of today's linux-next CMA enabled kernel works
fine on OMAP platforms (without the patch audio was not working because
dma_alloc_writecombine() was failing, probably other things were broken as well).
Thank you for the quick fix!

Tested-by: Peter Ujfalusi <redacted>
quoted hunk ↗ jump to hunk
Cc: Mel Gorman <mgorman@suse.de>
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
 mm/compaction.c |   29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/mm/compaction.c b/mm/compaction.c
index 5037399..7721197 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -269,13 +269,14 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
 		int isolated, i;
 		struct page *page = cursor;
 
-		nr_scanned++;
 		if (!pfn_valid_within(blockpfn))
-			continue;
+			goto strict_check;
+		nr_scanned++;
+
 		if (!valid_page)
 			valid_page = page;
 		if (!PageBuddy(page))
-			continue;
+			goto strict_check;
 
 		/*
 		 * The zone lock must be held to isolate freepages.
@@ -296,12 +297,12 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
 
 		/* Recheck this is a buddy page under lock */
 		if (!PageBuddy(page))
-			continue;
+			goto strict_check;
 
 		/* Found a free page, break it into order-0 pages */
 		isolated = split_free_page(page);
 		if (!isolated && strict)
-			break;
+			goto strict_check;
 		total_isolated += isolated;
 		for (i = 0; i < isolated; i++) {
 			list_add(&page->lru, freelist);
@@ -313,18 +314,20 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
 			blockpfn += isolated - 1;
 			cursor += isolated - 1;
 		}
+
+		continue;
+
+strict_check:
+		/* Abort isolation if the caller requested strict isolation */
+		if (strict) {
+			total_isolated = 0;
+			goto out;
+		}
 	}
 
 	trace_mm_compaction_isolate_freepages(nr_scanned, total_isolated);
 
-	/*
-	 * If strict isolation is requested by CMA then check that all the
-	 * pages scanned were isolated. If there were any failures, 0 is
-	 * returned and CMA will fail.
-	 */
-	if (strict && nr_scanned != total_isolated)
-		total_isolated = 0;
-
+out:
 	if (locked)
 		spin_unlock_irqrestore(&cc->zone->lock, flags);
 

-- 
Peter

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help