From 192d08ac1fe06b646d581d545a6b6857e0c59cfc Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Tue, 23 Feb 2021 16:57:44 +0530 Subject: [PATCH] qcacmn: Avoid per packet Rx refill buffer pool lock Avoid per packet Rx refill buff pool lock, instead acquire/release lock for burst of nbuf's replenishment. Change-Id: I778cb9702d31d4b8911cca4e7f06f12c50ef6df9 CRs-Fixed: 2884208 --- dp/wifi3.0/dp_rx.c | 5 +++++ dp/wifi3.0/dp_rx_buffer_pool.c | 6 ++---- dp/wifi3.0/dp_rx_buffer_pool.h | 33 +++++++++++++++++++++++++++++++++ dp/wifi3.0/dp_types.h | 1 + 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 0e908d1e6649..4e6ee6f6a83f 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -301,6 +301,7 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, "requested %d buffers for replenish", num_req_buffers); hal_srng_access_start(dp_soc->hal_soc, rxdma_srng); + num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc, rxdma_srng, sync_hw_ptr); @@ -350,6 +351,8 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, count = 0; + dp_rx_refill_buff_pool_lock(dp_soc); + while (count < num_req_buffers) { /* Flag is set while pdev rx_desc_pool initialization */ if (qdf_unlikely(rx_desc_pool->rx_mon_dest_frag_enable)) @@ -406,6 +409,8 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, } + dp_rx_refill_buff_pool_unlock(dp_soc); + hal_srng_access_end(dp_soc->hal_soc, rxdma_srng); dp_rx_schedule_refill_thread(dp_soc); diff --git a/dp/wifi3.0/dp_rx_buffer_pool.c b/dp/wifi3.0/dp_rx_buffer_pool.c index f5c860211af6..6f40039c3d62 100644 --- a/dp/wifi3.0/dp_rx_buffer_pool.c +++ b/dp/wifi3.0/dp_rx_buffer_pool.c @@ -195,15 +195,13 @@ static inline qdf_nbuf_t dp_rx_refill_buff_pool_dequeue_nbuf(struct dp_soc *soc) qdf_nbuf_t nbuf = NULL; struct rx_refill_buff_pool *buff_pool = &soc->rx_refill_buff_pool; - if (!buff_pool->is_initialized || !buff_pool->bufq_len) + if (!buff_pool->in_rx_refill_lock || !buff_pool->bufq_len) return nbuf; - qdf_spin_lock_bh(&buff_pool->bufq_lock); nbuf = buff_pool->buf_head; buff_pool->buf_head = qdf_nbuf_next(buff_pool->buf_head); qdf_nbuf_set_next(nbuf, NULL); buff_pool->bufq_len--; - qdf_spin_unlock_bh(&buff_pool->bufq_lock); return nbuf; } @@ -219,7 +217,7 @@ dp_rx_buffer_pool_nbuf_alloc(struct dp_soc *soc, uint32_t mac_id, qdf_nbuf_t nbuf; nbuf = dp_rx_refill_buff_pool_dequeue_nbuf(soc); - if (nbuf) { + if (qdf_likely(nbuf)) { DP_STATS_INC(dp_pdev, rx_refill_buff_pool.num_bufs_allocated, 1); return nbuf; diff --git a/dp/wifi3.0/dp_rx_buffer_pool.h b/dp/wifi3.0/dp_rx_buffer_pool.h index 7cc73cbb1a57..081d87ff9fec 100644 --- a/dp/wifi3.0/dp_rx_buffer_pool.h +++ b/dp/wifi3.0/dp_rx_buffer_pool.h @@ -109,6 +109,34 @@ static inline void dp_rx_schedule_refill_thread(struct dp_soc *soc) soc->cdp_soc.ol_ops->dp_rx_sched_refill_thread(dp_soc_to_cdp_soc_t(soc)); } +/** + * dp_rx_refill_buff_pool_lock() - Acquire Rx refill buff pool lock + * @soc: SoC handle + * + */ +static inline void dp_rx_refill_buff_pool_lock(struct dp_soc *soc) +{ + struct rx_refill_buff_pool *buff_pool = &soc->rx_refill_buff_pool; + + if (buff_pool->is_initialized && + qdf_spin_trylock_bh(&buff_pool->bufq_lock)) + buff_pool->in_rx_refill_lock = true; +} + +/** + * dp_rx_refill_buff_pool_unlock() - Release Rx refill buff pool lock + * @soc: SoC handle + * + */ +static inline void dp_rx_refill_buff_pool_unlock(struct dp_soc *soc) +{ + struct rx_refill_buff_pool *buff_pool = &soc->rx_refill_buff_pool; + + if (buff_pool->in_rx_refill_lock) { + qdf_spin_unlock_bh(&buff_pool->bufq_lock); + buff_pool->in_rx_refill_lock = false; + } +} #else /** * dp_rx_buffer_pool_init() - Initialize emergency buffer pool @@ -206,5 +234,10 @@ dp_rx_buffer_pool_nbuf_map(struct dp_soc *soc, } static inline void dp_rx_schedule_refill_thread(struct dp_soc *soc) { } + +static inline void dp_rx_refill_buff_pool_lock(struct dp_soc *soc) { } + +static inline void dp_rx_refill_buff_pool_unlock(struct dp_soc *soc) { } + #endif /* WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL */ #endif /* _DP_RX_BUFFER_POOL_H_ */ diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 0774ac2c30e8..815b442c46de 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1112,6 +1112,7 @@ struct rx_refill_buff_pool { qdf_spinlock_t bufq_lock; uint32_t bufq_len; uint32_t max_bufq_len; + bool in_rx_refill_lock; bool is_initialized; };