qcacmn: Add lock to protect rx_desc_pool

Create a lock for protecting rx descriptor
pool allocation during initialization and destroy it
during unloading the driver.

Change-Id: Icd489e400dab9bb648709134dcaa24c4d7724aa6
CRs-Fixed: 2215430
This commit is contained in:
Venkata Sharath Chandra Manchala
2018-03-28 23:42:39 -07:00
committed by nshrivas
parent 12b2b2c897
commit bcfa6d8683
3 changed files with 15 additions and 14 deletions

View File

@@ -1650,7 +1650,6 @@ dp_rx_pdev_detach(struct dp_pdev *pdev)
if (rx_desc_pool->pool_size != 0) { if (rx_desc_pool->pool_size != 0) {
dp_rx_desc_pool_free(soc, pdev_id, rx_desc_pool); dp_rx_desc_pool_free(soc, pdev_id, rx_desc_pool);
qdf_spinlock_destroy(&soc->rx_desc_mutex[pdev_id]);
} }
return; return;
@@ -1685,7 +1684,6 @@ dp_rx_pdev_attach(struct dp_pdev *pdev)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]);
pdev = soc->pdev_list[pdev_id]; pdev = soc->pdev_list[pdev_id];
rxdma_srng = pdev->rx_refill_buf_ring; rxdma_srng = pdev->rx_refill_buf_ring;
soc->process_rx_status = CONFIG_PROCESS_RX_STATUS; soc->process_rx_status = CONFIG_PROCESS_RX_STATUS;

View File

@@ -46,7 +46,10 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id,
return QDF_STATUS_E_NOMEM; return QDF_STATUS_E_NOMEM;
} }
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); /* Initialize the lock */
qdf_spinlock_create(&rx_desc_pool->lock);
qdf_spin_lock_bh(&rx_desc_pool->lock);
rx_desc_pool->pool_size = pool_size; rx_desc_pool->pool_size = pool_size;
/* link SW rx descs into a freelist */ /* link SW rx descs into a freelist */
@@ -61,7 +64,7 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id,
rx_desc_pool->array[i].next = NULL; rx_desc_pool->array[i].next = NULL;
rx_desc_pool->array[i].rx_desc.cookie = i | (pool_id << 18); rx_desc_pool->array[i].rx_desc.cookie = i | (pool_id << 18);
rx_desc_pool->array[i].rx_desc.pool_id = pool_id; rx_desc_pool->array[i].rx_desc.pool_id = pool_id;
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_unlock_bh(&rx_desc_pool->lock);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -78,7 +81,7 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id,
{ {
int i; int i;
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_lock_bh(&rx_desc_pool->lock);
for (i = 0; i < rx_desc_pool->pool_size; i++) { for (i = 0; i < rx_desc_pool->pool_size; i++) {
if (rx_desc_pool->array[i].rx_desc.in_use) { if (rx_desc_pool->array[i].rx_desc.in_use) {
if (!(rx_desc_pool->array[i].rx_desc.unmapped)) if (!(rx_desc_pool->array[i].rx_desc.unmapped))
@@ -89,7 +92,8 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id,
} }
} }
qdf_mem_free(rx_desc_pool->array); qdf_mem_free(rx_desc_pool->array);
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_unlock_bh(&rx_desc_pool->lock);
qdf_spinlock_destroy(&rx_desc_pool->lock);
} }
/* /*
@@ -113,21 +117,21 @@ uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id,
{ {
uint16_t count; uint16_t count;
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_lock_bh(&rx_desc_pool->lock);
*desc_list = *tail = rx_desc_pool->freelist; *desc_list = *tail = rx_desc_pool->freelist;
for (count = 0; count < num_descs; count++) { for (count = 0; count < num_descs; count++) {
if (qdf_unlikely(!rx_desc_pool->freelist)) { if (qdf_unlikely(!rx_desc_pool->freelist)) {
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_unlock_bh(&rx_desc_pool->lock);
return count; return count;
} }
*tail = rx_desc_pool->freelist; *tail = rx_desc_pool->freelist;
rx_desc_pool->freelist = rx_desc_pool->freelist->next; rx_desc_pool->freelist = rx_desc_pool->freelist->next;
} }
(*tail)->next = NULL; (*tail)->next = NULL;
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_unlock_bh(&rx_desc_pool->lock);
return count; return count;
} }
@@ -149,7 +153,7 @@ void dp_rx_add_desc_list_to_free_list(struct dp_soc *soc,
{ {
union dp_rx_desc_list_elem_t *temp_list = NULL; union dp_rx_desc_list_elem_t *temp_list = NULL;
qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_lock_bh(&rx_desc_pool->lock);
temp_list = rx_desc_pool->freelist; temp_list = rx_desc_pool->freelist;
@@ -159,5 +163,5 @@ void dp_rx_add_desc_list_to_free_list(struct dp_soc *soc,
rx_desc_pool->freelist = *local_desc_list; rx_desc_pool->freelist = *local_desc_list;
(*tail)->next = temp_list; (*tail)->next = temp_list;
qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); qdf_spin_unlock_bh(&rx_desc_pool->lock);
} }

View File

@@ -211,11 +211,13 @@ enum dp_nss_cfg {
* @pool_size: number of RX descriptor in the pool * @pool_size: number of RX descriptor in the pool
* @array: pointer to array of RX descriptor * @array: pointer to array of RX descriptor
* @freelist: pointer to free RX descriptor link list * @freelist: pointer to free RX descriptor link list
* @lock: Protection for the RX descriptor pool
*/ */
struct rx_desc_pool { struct rx_desc_pool {
uint32_t pool_size; uint32_t pool_size;
union dp_rx_desc_list_elem_t *array; union dp_rx_desc_list_elem_t *array;
union dp_rx_desc_list_elem_t *freelist; union dp_rx_desc_list_elem_t *freelist;
qdf_spinlock_t lock;
}; };
/** /**
@@ -684,9 +686,6 @@ struct dp_soc {
/* Rx SW descriptor pool for RXDMA status buffer */ /* Rx SW descriptor pool for RXDMA status buffer */
struct rx_desc_pool rx_desc_status[MAX_RXDESC_POOLS]; struct rx_desc_pool rx_desc_status[MAX_RXDESC_POOLS];
/* DP rx desc lock */
DP_MUTEX_TYPE rx_desc_mutex[MAX_RXDESC_POOLS];
/* HAL SOC handle */ /* HAL SOC handle */
void *hal_soc; void *hal_soc;