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>