dmaengine: Convert ID allocation to an IDA
PATCH 1/1 dmaengine: Convert ID allocation to an IDA
From: Matthew Wilcox <[email protected]>
dmaengine currently uses an IDR to allocate DMA IDs, but it only needs to know whether IDs are in use or not; the ID to pointer functionality of the IDR is unused. That means it can use the more space-efficient IDA.
Signed-off-by Matthew Wilcox <[email protected]>
--- drivers/dma/dmaengine.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
drivers/dma/dmaengine.c +11 -10
@@ -65,7 +65,7 @@#include <linux/mempool.h> static DEFINE_MUTEX (dma_list_mutex); -static DEFINE_IDR (dma_idr); +static DEFINE_IDA (dma_ida);static LIST_HEAD (dma_device_list);static long dmaengine_ref_count;
@@ -162,7 +162,7 @@ static void chan_dev_release(struct device *dev) chan_dev =container_of (dev,typeof (*chan_dev), device);if (atomic_dec_and_test (chan_dev->idr_ref)) {mutex_lock (&dma_list_mutex); -idr_remove (&dma_idr, chan_dev->dev_id); +ida_remove (&dma_ida, chan_dev->dev_id);mutex_unlock (&dma_list_mutex);kfree (chan_dev->idr_ref); }
@@ -898,14 +898,15 @@ static int get_dma_id(struct dma_device *device) {int rc; -mutex_lock (&dma_list_mutex); - - rc =idr_alloc (&dma_idr,NULL ,0 ,0 ,GFP_KERNEL ); -if (rc >=0 ) - device->dev_id = rc; +do { +if (!ida_pre_get (&dma_ida,GFP_KERNEL )) +return -ENOMEM ; +mutex_lock (&dma_list_mutex); + rc =ida_get_new (&dma_ida, &device->dev_id); +mutex_unlock (&dma_list_mutex); + }while (rc == -EAGAIN ); -mutex_unlock (&dma_list_mutex); -return rc <0 ? rc :0 ; +return rc; }/**
@@ -1035,7 +1036,7 @@ int dma_async_device_register(struct dma_device *device)/* if we never registered a channel just release the idr */ if (atomic_read (idr_ref) ==0 ) {mutex_lock (&dma_list_mutex); -idr_remove (&dma_idr, device->dev_id); +ida_remove (&dma_ida, device->dev_id);mutex_unlock (&dma_list_mutex);kfree (idr_ref);return rc;
Signature · 1 line
2.10.2
Vinod Koul
AppliedQuoted 5 lines · Matthew Wilcox
From: Matthew Wilcox <[email protected]>
dmaengine currently uses an IDR to allocate DMA IDs, but it only needs to know whether IDs are in use or not; the ID to pointer functionality of the IDR is unused. That means it can use the more space-efficient IDA.
Applied, thanks
Signature · 1 line
~Vinod