Re: CMA broken in next-20120926
From: Peter Ujfalusi
Date: Fri Sep 28 2012 - 03:43:06 EST
On 09/28/2012 08:43 AM, Minchan Kim wrote:
> From 24a547855fa2bd4212a779cc73997837148310b3 Mon Sep 17 00:00:00 2001
> From: Minchan Kim <minchan@xxxxxxxxxx>
> 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 <peter.ujfalusi@xxxxxx>
>
> Cc: Mel Gorman <mgorman@xxxxxxx>
> Signed-off-by: Minchan Kim <minchan@xxxxxxxxxx>
> ---
> 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);
>
>
--
Péter
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/