diff options
| -rw-r--r-- | drivers/base/dma-contiguous.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/base/dma-contiguous.c b/drivers/base/dma-contiguous.c index 83969f8c5727..6467c919c509 100644 --- a/drivers/base/dma-contiguous.c +++ b/drivers/base/dma-contiguous.c | |||
| @@ -176,14 +176,24 @@ static int __init cma_activate_area(struct cma *cma) | |||
| 176 | base_pfn = pfn; | 176 | base_pfn = pfn; |
| 177 | for (j = pageblock_nr_pages; j; --j, pfn++) { | 177 | for (j = pageblock_nr_pages; j; --j, pfn++) { |
| 178 | WARN_ON_ONCE(!pfn_valid(pfn)); | 178 | WARN_ON_ONCE(!pfn_valid(pfn)); |
| 179 | /* | ||
| 180 | * alloc_contig_range requires the pfn range | ||
| 181 | * specified to be in the same zone. Make this | ||
| 182 | * simple by forcing the entire CMA resv range | ||
| 183 | * to be in the same zone. | ||
| 184 | */ | ||
| 179 | if (page_zone(pfn_to_page(pfn)) != zone) | 185 | if (page_zone(pfn_to_page(pfn)) != zone) |
| 180 | return -EINVAL; | 186 | goto err; |
| 181 | } | 187 | } |
| 182 | init_cma_reserved_pageblock(pfn_to_page(base_pfn)); | 188 | init_cma_reserved_pageblock(pfn_to_page(base_pfn)); |
| 183 | } while (--i); | 189 | } while (--i); |
| 184 | 190 | ||
| 185 | mutex_init(&cma->lock); | 191 | mutex_init(&cma->lock); |
| 186 | return 0; | 192 | return 0; |
| 193 | |||
| 194 | err: | ||
| 195 | kfree(cma->bitmap); | ||
| 196 | return -EINVAL; | ||
| 187 | } | 197 | } |
| 188 | 198 | ||
| 189 | static struct cma cma_areas[MAX_CMA_AREAS]; | 199 | static struct cma cma_areas[MAX_CMA_AREAS]; |
