2019-03-13 19:08:16 +00:00
|
|
|
From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@redhat.com>
|
|
|
|
Date: Tue, 22 Jan 2019 15:20:16 +0100
|
|
|
|
Subject: [PATCH] mac80211: Expose ieee80211_schedule_txq() function
|
|
|
|
MIME-Version: 1.0
|
|
|
|
Content-Type: text/plain; charset=UTF-8
|
|
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
|
|
|
|
Since we reworked ieee80211_return_txq() so it assumes that the caller
|
|
|
|
takes care of logging, we need another function that can be called without
|
|
|
|
holding any locks. Introduce ieee80211_schedule_txq() which serves this
|
|
|
|
purpose.
|
|
|
|
|
|
|
|
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
|
|
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
|
|
---
|
|
|
|
|
|
|
|
--- a/include/net/mac80211.h
|
|
|
|
+++ b/include/net/mac80211.h
|
|
|
|
@@ -6074,6 +6074,19 @@ void ieee80211_txq_schedule_end(struct i
|
|
|
|
__releases(txq_lock);
|
|
|
|
|
|
|
|
/**
|
|
|
|
+ * ieee80211_schedule_txq - schedule a TXQ for transmission
|
|
|
|
+ *
|
|
|
|
+ * @hw: pointer as obtained from ieee80211_alloc_hw()
|
|
|
|
+ * @txq: pointer obtained from station or virtual interface
|
|
|
|
+ *
|
|
|
|
+ * Schedules a TXQ for transmission if it is not already scheduled. Takes a
|
|
|
|
+ * lock, which means it must *not* be called between
|
|
|
|
+ * ieee80211_txq_schedule_start() and ieee80211_txq_schedule_end()
|
|
|
|
+ */
|
|
|
|
+void ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
|
|
|
|
+ __acquires(txq_lock) __releases(txq_lock);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
* ieee80211_txq_may_transmit - check whether TXQ is allowed to transmit
|
|
|
|
*
|
|
|
|
* This function is used to check whether given txq is allowed to transmit by
|
|
|
|
--- a/net/mac80211/driver-ops.h
|
|
|
|
+++ b/net/mac80211/driver-ops.h
|
|
|
|
@@ -1179,9 +1179,7 @@ static inline void drv_wake_tx_queue(str
|
|
|
|
static inline void schedule_and_wake_txq(struct ieee80211_local *local,
|
|
|
|
struct txq_info *txqi)
|
|
|
|
{
|
|
|
|
- spin_lock_bh(&local->active_txq_lock[txqi->txq.ac]);
|
|
|
|
- ieee80211_return_txq(&local->hw, &txqi->txq);
|
|
|
|
- spin_unlock_bh(&local->active_txq_lock[txqi->txq.ac]);
|
|
|
|
+ ieee80211_schedule_txq(&local->hw, &txqi->txq);
|
|
|
|
drv_wake_tx_queue(local, txqi);
|
|
|
|
}
|
|
|
|
|
|
|
|
--- a/net/mac80211/tx.c
|
|
|
|
+++ b/net/mac80211/tx.c
|
2019-07-06 22:08:20 +00:00
|
|
|
@@ -3673,6 +3673,19 @@ void ieee80211_return_txq(struct ieee802
|
2019-03-13 19:08:16 +00:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(ieee80211_return_txq);
|
|
|
|
|
|
|
|
+void ieee80211_schedule_txq(struct ieee80211_hw *hw,
|
|
|
|
+ struct ieee80211_txq *txq)
|
|
|
|
+ __acquires(txq_lock) __releases(txq_lock)
|
|
|
|
+{
|
|
|
|
+ struct ieee80211_local *local = hw_to_local(hw);
|
|
|
|
+ struct txq_info *txqi = to_txq_info(txq);
|
|
|
|
+
|
|
|
|
+ spin_lock_bh(&local->active_txq_lock[txq->ac]);
|
|
|
|
+ ieee80211_return_txq(hw, txq);
|
|
|
|
+ spin_unlock_bh(&local->active_txq_lock[txq->ac]);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(ieee80211_schedule_txq);
|
|
|
|
+
|
|
|
|
bool ieee80211_txq_may_transmit(struct ieee80211_hw *hw,
|
|
|
|
struct ieee80211_txq *txq)
|
|
|
|
{
|