mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 14:23:38 +00:00
103 lines
3.4 KiB
Diff
103 lines
3.4 KiB
Diff
From 400588039a17a460292eb974ebba5811b8cbdb91 Mon Sep 17 00:00:00 2001
|
|
From: P Praneesh <ppranees@codeaurora.org>
|
|
Date: Fri, 12 Nov 2021 11:02:31 +0200
|
|
Subject: [PATCH] ath11k: add branch predictors in process_rx
|
|
|
|
In datapath, add branch predictors where required in the process rx().
|
|
This protects high value rx path without having performance overhead.
|
|
Also while processing rx packets, the pointer that is returned by
|
|
rcu_dereference() is not dereferenced. so it is preferable to use
|
|
rcu_access_pointer() here.
|
|
|
|
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1.r2-00012-QCAHKSWPL_SILICONZ-1
|
|
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01695-QCAHKSWPL_SILICONZ-1
|
|
|
|
Co-developed-by: Sriram R <srirrama@codeaurora.org>
|
|
Signed-off-by: Sriram R <srirrama@codeaurora.org>
|
|
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
|
|
Signed-off-by: P Praneesh <ppranees@codeaurora.org>
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
|
Link: https://lore.kernel.org/r/1630560820-21905-8-git-send-email-ppranees@codeaurora.org
|
|
---
|
|
drivers/net/wireless/ath/ath11k/dp_rx.c | 24 +++++++++---------------
|
|
1 file changed, 9 insertions(+), 15 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
|
@@ -2610,24 +2610,20 @@ static void ath11k_dp_rx_process_receive
|
|
if (skb_queue_empty(msdu_list))
|
|
return;
|
|
|
|
- rcu_read_lock();
|
|
-
|
|
- ar = ab->pdevs[mac_id].ar;
|
|
- if (!rcu_dereference(ab->pdevs_active[mac_id])) {
|
|
+ if (unlikely(!rcu_access_pointer(ab->pdevs_active[mac_id]))) {
|
|
__skb_queue_purge(msdu_list);
|
|
- rcu_read_unlock();
|
|
return;
|
|
}
|
|
|
|
- if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
|
|
+ ar = ab->pdevs[mac_id].ar;
|
|
+ if (unlikely(test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags))) {
|
|
__skb_queue_purge(msdu_list);
|
|
- rcu_read_unlock();
|
|
return;
|
|
}
|
|
|
|
while ((msdu = __skb_dequeue(msdu_list))) {
|
|
ret = ath11k_dp_rx_process_msdu(ar, msdu, msdu_list, &rx_status);
|
|
- if (ret) {
|
|
+ if (unlikely(ret)) {
|
|
ath11k_dbg(ab, ATH11K_DBG_DATA,
|
|
"Unable to process msdu %d", ret);
|
|
dev_kfree_skb_any(msdu);
|
|
@@ -2636,8 +2632,6 @@ static void ath11k_dp_rx_process_receive
|
|
|
|
ath11k_dp_rx_deliver_msdu(ar, napi, msdu, &rx_status);
|
|
}
|
|
-
|
|
- rcu_read_unlock();
|
|
}
|
|
|
|
int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
|
|
@@ -2682,7 +2676,7 @@ try_again:
|
|
rx_ring = &ar->dp.rx_refill_buf_ring;
|
|
spin_lock_bh(&rx_ring->idr_lock);
|
|
msdu = idr_find(&rx_ring->bufs_idr, buf_id);
|
|
- if (!msdu) {
|
|
+ if (unlikely(!msdu)) {
|
|
ath11k_warn(ab, "frame rx with invalid buf_id %d\n",
|
|
buf_id);
|
|
spin_unlock_bh(&rx_ring->idr_lock);
|
|
@@ -2701,8 +2695,8 @@ try_again:
|
|
|
|
push_reason = FIELD_GET(HAL_REO_DEST_RING_INFO0_PUSH_REASON,
|
|
desc->info0);
|
|
- if (push_reason !=
|
|
- HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION) {
|
|
+ if (unlikely(push_reason !=
|
|
+ HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION)) {
|
|
dev_kfree_skb_any(msdu);
|
|
ab->soc_stats.hal_reo_error[dp->reo_dst_ring[ring_id].ring_id]++;
|
|
continue;
|
|
@@ -2741,7 +2735,7 @@ try_again:
|
|
* head pointer so that we can reap complete MPDU in the current
|
|
* rx processing.
|
|
*/
|
|
- if (!done && ath11k_hal_srng_dst_num_free(ab, srng, true)) {
|
|
+ if (unlikely(!done && ath11k_hal_srng_dst_num_free(ab, srng, true))) {
|
|
ath11k_hal_srng_access_end(ab, srng);
|
|
goto try_again;
|
|
}
|
|
@@ -2750,7 +2744,7 @@ try_again:
|
|
|
|
spin_unlock_bh(&srng->lock);
|
|
|
|
- if (!total_msdu_reaped)
|
|
+ if (unlikely(!total_msdu_reaped))
|
|
goto exit;
|
|
|
|
for (i = 0; i < ab->num_radios; i++) {
|