diff --git a/arch/x86/mm/csv.c b/arch/x86/mm/csv.c index 7b735ea58622ab463d0576b3c3c68918df90a9a9..7615d5b9ed08db19743daced1c8b7e91fb3378e7 100644 --- a/arch/x86/mm/csv.c +++ b/arch/x86/mm/csv.c @@ -178,7 +178,6 @@ void __init csv_cma_reserve_mem(void) 1 << CSV_CMA_SHIFT, node); break; } - cma_enable_concurrency(csv_cma->cma); if (start > cma_get_base(csv_cma->cma) || !start) start = cma_get_base(csv_cma->cma); diff --git a/include/linux/cma.h b/include/linux/cma.h index 5a8a8ea0f70cb0e57fa235a97470c1c0eb13aeec..2af4ade5e0ce48ceaaf8bda8d9042896333a9204 100644 --- a/include/linux/cma.h +++ b/include/linux/cma.h @@ -50,5 +50,4 @@ extern bool cma_release(struct cma *cma, const struct page *pages, unsigned int extern int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data); extern int __init cma_alloc_areas(unsigned int max_cma_size); -extern void cma_enable_concurrency(struct cma *cma); #endif diff --git a/mm/cma.c b/mm/cma.c index 4956bf727ab897317c3bca0099cc38770cc19dd2..a5b4db2b69aa621eec67d45e07f8751686da1b5e 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -40,7 +40,6 @@ static unsigned int cma_areas_size = MAX_CMA_AREAS; struct cma *cma_areas = cma_areas_data; unsigned cma_area_count; -static DEFINE_MUTEX(cma_mutex); phys_addr_t cma_get_base(const struct cma *cma) { @@ -129,6 +128,8 @@ static void __init cma_activate_area(struct cma *cma) spin_lock_init(&cma->lock); + mutex_init(&cma->alloc_mutex); + #ifdef CONFIG_CMA_DEBUGFS INIT_HLIST_HEAD(&cma->mem_head); spin_lock_init(&cma->mem_head_lock); @@ -476,12 +477,10 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, spin_unlock_irq(&cma->lock); pfn = cma->base_pfn + (bitmap_no << cma->order_per_bit); - if (!cma->no_mutex) - mutex_lock(&cma_mutex); + mutex_lock(&cma->alloc_mutex); ret = alloc_contig_range(pfn, pfn + count, MIGRATE_CMA, GFP_KERNEL | (no_warn ? __GFP_NOWARN : 0)); - if (!cma->no_mutex) - mutex_unlock(&cma_mutex); + mutex_unlock(&cma->alloc_mutex); if (ret == 0) { page = pfn_to_page(pfn); break; @@ -565,11 +564,3 @@ int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data) return 0; } - -void cma_enable_concurrency(struct cma *cma) -{ - if (!cma) - return; - - cma->no_mutex = true; -} diff --git a/mm/cma.h b/mm/cma.h index 2b1a52d9716425091e8cee071ded52844c73653c..0e0f8daa479207f52dd4468d826b8be69d2efe90 100644 --- a/mm/cma.h +++ b/mm/cma.h @@ -10,7 +10,7 @@ struct cma { unsigned long *bitmap; unsigned int order_per_bit; /* Order of pages represented by one bit */ spinlock_t lock; - bool no_mutex; + struct mutex alloc_mutex; #ifdef CONFIG_CMA_DEBUGFS struct hlist_head mem_head; spinlock_t mem_head_lock;