ath11k: avoid unnecessary BH disable lock in STA kickout event
authorKarthikeyan Periyasamy <quic_periyasa@quicinc.com>
Wed, 10 Nov 2021 16:06:28 +0000 (21:36 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 15 Nov 2021 09:16:16 +0000 (11:16 +0200)
In STA kickout event processing, the peer object is protected
under spin lock BH. Release this lock after picking up the vdev_id
from the peer object instead after ieee80211_report_low_ack().
This will minimize the lock hold period which will improve
performance since base_lock is used across the data path.
This was found in code review.

Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-00729-QCAHKSWPL_SILICONZ-3 v2

Signed-off-by: Karthikeyan Periyasamy <quic_periyasa@quicinc.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1636560388-24955-1-git-send-email-quic_periyasa@quicinc.com
drivers/net/wireless/ath/ath11k/wmi.c

index 44057cc..ea4bbc2 100644 (file)
@@ -6399,6 +6399,7 @@ static void ath11k_peer_sta_kickout_event(struct ath11k_base *ab, struct sk_buff
        struct ieee80211_sta *sta;
        struct ath11k_peer *peer;
        struct ath11k *ar;
+       u32 vdev_id;
 
        if (ath11k_pull_peer_sta_kickout_ev(ab, skb, &arg) != 0) {
                ath11k_warn(ab, "failed to extract peer sta kickout event");
@@ -6414,10 +6415,15 @@ static void ath11k_peer_sta_kickout_event(struct ath11k_base *ab, struct sk_buff
        if (!peer) {
                ath11k_warn(ab, "peer not found %pM\n",
                            arg.mac_addr);
+               spin_unlock_bh(&ab->base_lock);
                goto exit;
        }
 
-       ar = ath11k_mac_get_ar_by_vdev_id(ab, peer->vdev_id);
+       vdev_id = peer->vdev_id;
+
+       spin_unlock_bh(&ab->base_lock);
+
+       ar = ath11k_mac_get_ar_by_vdev_id(ab, vdev_id);
        if (!ar) {
                ath11k_warn(ab, "invalid vdev id in peer sta kickout ev %d",
                            peer->vdev_id);
@@ -6438,7 +6444,6 @@ static void ath11k_peer_sta_kickout_event(struct ath11k_base *ab, struct sk_buff
        ieee80211_report_low_ack(sta, 10);
 
 exit:
-       spin_unlock_bh(&ab->base_lock);
        rcu_read_unlock();
 }