On 09/28/2012 08:43 AM, Minchan Kim wrote:
> From 24a547855fa2bd4212a779cc73997837148310b3 Mon Sep 17 00:00:00 2001
> From: Minchan Kim <[email protected]>
> 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 <[email protected]>

> 
> Cc: Mel Gorman <[email protected]>
> Signed-off-by: Minchan Kim <[email protected]>
> ---
>  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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to