The branch stable/14 has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=b2420591ff02b9ada66ff64b2d030a5198d6ea3c

commit b2420591ff02b9ada66ff64b2d030a5198d6ea3c
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2025-06-05 22:02:01 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2025-06-10 23:40:32 +0000

    LinuxKPI: 802.11: improve queue locking
    
    Introduce an internal lkpi_ieee80211_wake_queues_locked() function
    that can be used from context holding the wiphy lock.
    Make linuxkpi_ieee80211_wake_queues() a wrapper with locking around
    this.
    
    Equally apply the wiphy lock to linuxkpi_ieee80211_wake_queue().
    
    In lkpi_ieee80211_wake_queues() only wakeup the driver if the queue
    is not empty;  otherwise weird sideeffects can happen with some drivers.
    
    Sponsored by:   The FreeBSD Foundation
    
    (cherry picked from commit bc24342d96aa816b448bec4d32b1f5e4a5793886)
---
 sys/compat/linuxkpi/common/src/linux_80211.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c 
b/sys/compat/linuxkpi/common/src/linux_80211.c
index ba6c73b99c32..be671a2ed7a3 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -7395,6 +7395,7 @@ linuxkpi_ieee80211_tx_dequeue(struct ieee80211_hw *hw,
        struct lkpi_vif *lvif;
        struct sk_buff *skb;
 
+       IMPROVE("wiphy_lock? or assert?");
        skb = NULL;
        ltxq = TXQ_TO_LTXQ(txq);
        ltxq->seen_dequeue = true;
@@ -7897,8 +7898,8 @@ lkpi_ieee80211_wake_queues(struct ieee80211_hw *hw, int 
hwq)
 
                                                ltxq->stopped = false;
 
-                                               /* XXX-BZ see when this 
explodes with all the locking. taskq? */
-                                               lkpi_80211_mo_wake_tx_queue(hw, 
sta->txq[tid]);
+                                               if 
(!skb_queue_empty(&ltxq->skbq))
+                                                       
lkpi_80211_mo_wake_tx_queue(hw, sta->txq[tid]);
                                        }
                                }
                                rcu_read_unlock();
@@ -7908,8 +7909,8 @@ lkpi_ieee80211_wake_queues(struct ieee80211_hw *hw, int 
hwq)
        LKPI_80211_LHW_LVIF_UNLOCK(lhw);
 }
 
-void
-linuxkpi_ieee80211_wake_queues(struct ieee80211_hw *hw)
+static void
+lkpi_ieee80211_wake_queues_locked(struct ieee80211_hw *hw)
 {
        int i;
 
@@ -7918,6 +7919,14 @@ linuxkpi_ieee80211_wake_queues(struct ieee80211_hw *hw)
                lkpi_ieee80211_wake_queues(hw, i);
 }
 
+void
+linuxkpi_ieee80211_wake_queues(struct ieee80211_hw *hw)
+{
+       wiphy_lock(hw->wiphy);
+       lkpi_ieee80211_wake_queues_locked(hw);
+       wiphy_unlock(hw->wiphy);
+}
+
 void
 linuxkpi_ieee80211_wake_queue(struct ieee80211_hw *hw, int qnum)
 {
@@ -7925,7 +7934,9 @@ linuxkpi_ieee80211_wake_queue(struct ieee80211_hw *hw, 
int qnum)
        KASSERT(qnum < hw->queues, ("%s: qnum %d >= hw->queues %d, hw %p\n",
            __func__, qnum, hw->queues, hw));
 
+       wiphy_lock(hw->wiphy);
        lkpi_ieee80211_wake_queues(hw, qnum);
+       wiphy_unlock(hw->wiphy);
 }
 
 /* This is just hardware queues. */

Reply via email to