Thread (16 messages) flat view 16 messages, 4 authors, 2021-06-30

Re: [PATCH 12/12] ath11k: avoid unnecessary lock contention in tx_completion path

From: P Praneesh <hidden>
Date: 2021-06-30 05:18:07
Also in: ath11k

On 2021-06-29 23:05, Felix Fietkau wrote:
On 2021-06-15 23:14, Jouni Malinen wrote:
quoted
From: P Praneesh <redacted>

Lock is not needed for the readable idr operation, so avoid 
spin_lock_bh
for the idr_find() call. No need to disable the bottom half preempt if
it is already in bottom half context, so modify the spin_lock_bh to
spin_lock in the data tx completion handler.

Tested-on: IPQ8074 hw2.0 AHB 
WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1 v2

Co-developed-by: Karthikeyan Periyasamy <redacted>
Signed-off-by: Karthikeyan Periyasamy <redacted>
Signed-off-by: P Praneesh <redacted>
Signed-off-by: Jouni Malinen <redacted>
---
 drivers/net/wireless/ath/ath11k/dp_tx.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/ath/ath11k/dp_tx.c 
b/drivers/net/wireless/ath/ath11k/dp_tx.c
index ab9ccf0eb274..659f9d98bc0c 100644
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
@@ -288,19 +288,18 @@ static void ath11k_dp_tx_free_txbuf(struct 
ath11k_base *ab, u8 mac_id,
 	struct sk_buff *msdu;
 	struct ath11k_skb_cb *skb_cb;

-	spin_lock_bh(&tx_ring->tx_idr_lock);
 	msdu = idr_find(&tx_ring->txbuf_idr, msdu_id);
-	if (!msdu) {
+	if (unlikely(!msdu)) {
 		ath11k_warn(ab, "tx completion for unknown msdu_id %d\n",
 			    msdu_id);
-		spin_unlock_bh(&tx_ring->tx_idr_lock);
 		return;
 	}

 	skb_cb = ATH11K_SKB_CB(msdu);

+	spin_lock(&tx_ring->tx_idr_lock);
 	idr_remove(&tx_ring->txbuf_idr, msdu_id);
Why are you doing the lookups twice instead of just using the return
value of idr_remove?

- Felix
Yes, we will address this in the next version of the patch.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help