qcacmn: Clean up dp_tx_desc_alloc and dp_tx_desc_free API

Clean up dp_tx_desc_alloc and dp_tx_desc_free API to avoid array
dereferencing multiple times.

Change-Id: If84721cb2c6fe023d8008a97859bc88421b58e94
This commit is contained in:
Radha Krishna Simha Jiguru
2020-03-23 11:24:52 +05:30
committed by nshrivas
parent 403408b8c9
commit 351cdfe15f

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -536,25 +536,25 @@ static inline struct dp_tx_desc_s *dp_tx_desc_alloc(struct dp_soc *soc,
uint8_t desc_pool_id) uint8_t desc_pool_id)
{ {
struct dp_tx_desc_s *tx_desc = NULL; struct dp_tx_desc_s *tx_desc = NULL;
struct dp_tx_desc_pool_s *pool = &soc->tx_desc[desc_pool_id];
TX_DESC_LOCK_LOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_LOCK(&pool->lock);
tx_desc = soc->tx_desc[desc_pool_id].freelist; tx_desc = pool->freelist;
/* Pool is exhausted */ /* Pool is exhausted */
if (!tx_desc) { if (!tx_desc) {
TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_UNLOCK(&pool->lock);
return NULL; return NULL;
} }
soc->tx_desc[desc_pool_id].freelist = pool->freelist = pool->freelist->next;
soc->tx_desc[desc_pool_id].freelist->next; pool->num_allocated++;
soc->tx_desc[desc_pool_id].num_allocated++; pool->num_free--;
soc->tx_desc[desc_pool_id].num_free--;
tx_desc->flags = DP_TX_DESC_FLAG_ALLOCATED; tx_desc->flags = DP_TX_DESC_FLAG_ALLOCATED;
TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_UNLOCK(&pool->lock);
return tx_desc; return tx_desc;
} }
@@ -575,20 +575,21 @@ static inline struct dp_tx_desc_s *dp_tx_desc_alloc_multiple(
{ {
struct dp_tx_desc_s *c_desc = NULL, *h_desc = NULL; struct dp_tx_desc_s *c_desc = NULL, *h_desc = NULL;
uint8_t count; uint8_t count;
struct dp_tx_desc_pool_s *pool = &soc->tx_desc[desc_pool_id];
TX_DESC_LOCK_LOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_LOCK(&pool->lock);
if ((num_requested == 0) || if ((num_requested == 0) ||
(soc->tx_desc[desc_pool_id].num_free < num_requested)) { (pool->num_free < num_requested)) {
TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_UNLOCK(&pool->lock);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s, No Free Desc: Available(%d) num_requested(%d)", "%s, No Free Desc: Available(%d) num_requested(%d)",
__func__, soc->tx_desc[desc_pool_id].num_free, __func__, pool->num_free,
num_requested); num_requested);
return NULL; return NULL;
} }
h_desc = soc->tx_desc[desc_pool_id].freelist; h_desc = pool->freelist;
/* h_desc should never be NULL since num_free > requested */ /* h_desc should never be NULL since num_free > requested */
qdf_assert_always(h_desc); qdf_assert_always(h_desc);
@@ -598,12 +599,12 @@ static inline struct dp_tx_desc_s *dp_tx_desc_alloc_multiple(
c_desc->flags = DP_TX_DESC_FLAG_ALLOCATED; c_desc->flags = DP_TX_DESC_FLAG_ALLOCATED;
c_desc = c_desc->next; c_desc = c_desc->next;
} }
soc->tx_desc[desc_pool_id].num_free -= count; pool->num_free -= count;
soc->tx_desc[desc_pool_id].num_allocated += count; pool->num_allocated += count;
soc->tx_desc[desc_pool_id].freelist = c_desc->next; pool->freelist = c_desc->next;
c_desc->next = NULL; c_desc->next = NULL;
TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_UNLOCK(&pool->lock);
return h_desc; return h_desc;
} }
@@ -618,19 +619,20 @@ static inline void
dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
uint8_t desc_pool_id) uint8_t desc_pool_id)
{ {
TX_DESC_LOCK_LOCK(&soc->tx_desc[desc_pool_id].lock); struct dp_tx_desc_pool_s *pool = NULL;
tx_desc->vdev = NULL; tx_desc->vdev = NULL;
tx_desc->nbuf = NULL; tx_desc->nbuf = NULL;
tx_desc->flags = 0; tx_desc->flags = 0;
tx_desc->next = soc->tx_desc[desc_pool_id].freelist;
soc->tx_desc[desc_pool_id].freelist = tx_desc;
soc->tx_desc[desc_pool_id].num_allocated--;
soc->tx_desc[desc_pool_id].num_free++;
pool = &soc->tx_desc[desc_pool_id];
TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_LOCK(&pool->lock);
tx_desc->next = pool->freelist;
pool->freelist = tx_desc;
pool->num_allocated--;
pool->num_free++;
TX_DESC_LOCK_UNLOCK(&pool->lock);
} }
#endif /* QCA_LL_TX_FLOW_CONTROL_V2 */ #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */
#ifdef QCA_DP_TX_DESC_ID_CHECK #ifdef QCA_DP_TX_DESC_ID_CHECK