diff --git a/drivers/dma-buf/heaps/page_pool.c b/drivers/dma-buf/heaps/page_pool.c index b79e737bac95..93d2463f079e 100644 --- a/drivers/dma-buf/heaps/page_pool.c +++ b/drivers/dma-buf/heaps/page_pool.c @@ -41,28 +41,30 @@ static void dmabuf_page_pool_add(struct dmabuf_page_pool *pool, struct page *pag else index = POOL_LOWPAGE; - mutex_lock(&pool->mutex); + spin_lock(&pool->lock); list_add_tail(&page->lru, &pool->items[index]); pool->count[index]++; + spin_unlock(&pool->lock); mod_node_page_state(page_pgdat(page), NR_KERNEL_MISC_RECLAIMABLE, 1 << pool->order); - mutex_unlock(&pool->mutex); } static struct page *dmabuf_page_pool_remove(struct dmabuf_page_pool *pool, int index) { struct page *page; - mutex_lock(&pool->mutex); + spin_lock(&pool->lock); page = list_first_entry_or_null(&pool->items[index], struct page, lru); if (page) { pool->count[index]--; list_del(&page->lru); + spin_unlock(&pool->lock); mod_node_page_state(page_pgdat(page), NR_KERNEL_MISC_RECLAIMABLE, -(1 << pool->order)); + goto out; } - mutex_unlock(&pool->mutex); - + spin_unlock(&pool->lock); +out: return page; } @@ -125,7 +127,7 @@ struct dmabuf_page_pool *dmabuf_page_pool_create(gfp_t gfp_mask, unsigned int or } pool->gfp_mask = gfp_mask | __GFP_COMP; pool->order = order; - mutex_init(&pool->mutex); + spin_lock_init(&pool->lock); mutex_lock(&pool_list_lock); list_add(&pool->list, &pool_list); diff --git a/drivers/dma-buf/heaps/page_pool.h b/drivers/dma-buf/heaps/page_pool.h index 6b083b04f195..bfdb78bd3363 100644 --- a/drivers/dma-buf/heaps/page_pool.h +++ b/drivers/dma-buf/heaps/page_pool.h @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include @@ -40,7 +40,7 @@ enum { struct dmabuf_page_pool { int count[POOL_TYPE_SIZE]; struct list_head items[POOL_TYPE_SIZE]; - struct mutex mutex; + struct spinlock lock; gfp_t gfp_mask; unsigned int order; struct list_head list;