Re: CMA broken in next-20120926

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]