Move TXQ scheduling and airtime fairness into mac80211
Subsystems (4)
v4 cover Move TXQ scheduling and airtime fairness into mac80211
All,
Sorry for the long delay. Here is the consolidated series of mac80211, ath9k and ath10k changes for moving TXQ scheduling and airtime fairness into mac80211 and support airtime fairness.
Three main APIs are defined for TXQ scheduling.
- ieee80211_next_txq
- ieee80211_return_txq
- ieee80211_txq_may_transmit
and two APIs for synchronization when the driver wants to iterate through all TXQs.
- ieee80211_txq_schedule_start
- ieee80211_txq_schedule_end
The earlier discussions:
https://patchwork.kernel.org/project/linux-wireless/list/?series=&submitter=&state=*&q=TXQ+scheduling&archive=both&delegate=
-Rajkumar
v2:
- replaced driver specific airtime default by multiplier
- fixed tab intent
- fixed author and commit log
v3:
- fixed checkpatch warnings and kbuild bot errors. few of over 80 char warnings are left.
v4:
- Folded Louie's airtime counter reset change
- rebased the series on top of mac80211 tree.
Kan Yan (1):
ath10k: reporting estimated tx airtime for fairness
Toke Høiland-Jørgensen (5):
mac80211: Add TXQ scheduling API
cfg80211: Add airtime statistics and settings
mac80211: Add airtime accounting and scheduling to TXQs
ath9k: Switch to mac80211 TXQ scheduling and airtime APIs
ath10k: migrate to mac80211 txq scheduling
drivers/net/wireless/ath/ath10k/core.c | 2 - drivers/net/wireless/ath/ath10k/core.h | 8 +- drivers/net/wireless/ath/ath10k/htc.h | 1 - drivers/net/wireless/ath/ath10k/htt_rx.c | 9 ++ drivers/net/wireless/ath/ath10k/mac.c | 155 +++++++++++------- drivers/net/wireless/ath/ath10k/txrx.c | 4 + drivers/net/wireless/ath/ath9k/ath9k.h | 14 -- drivers/net/wireless/ath/ath9k/debug.c | 3 - drivers/net/wireless/ath/ath9k/debug.h | 8 - drivers/net/wireless/ath/ath9k/debug_sta.c | 70 --------- drivers/net/wireless/ath/ath9k/init.c | 3 +- drivers/net/wireless/ath/ath9k/recv.c | 9 +- drivers/net/wireless/ath/ath9k/xmit.c | 244 +++++++++-------------------- include/net/cfg80211.h | 10 +- include/net/mac80211.h | 121 +++++++++++++- include/uapi/linux/nl80211.h | 15 ++ net/mac80211/agg-tx.c | 2 +- net/mac80211/cfg.c | 3 + net/mac80211/debugfs.c | 3 + net/mac80211/debugfs_sta.c | 68 +++++++- net/mac80211/driver-ops.h | 9 ++ net/mac80211/ieee80211_i.h | 11 ++ net/mac80211/main.c | 9 ++ net/mac80211/sta_info.c | 46 +++++- net/mac80211/sta_info.h | 13 ++ net/mac80211/status.c | 6 + net/mac80211/tx.c | 140 ++++++++++++++++- net/wireless/nl80211.c | 30 ++++ 28 files changed, 662 insertions(+), 354 deletions(-)
Signature · 1 line
1.9.1
PATCH v4 1/6 mac80211: Add TXQ scheduling API
From: Toke Høiland-Jørgensen <[email protected]>
This adds an API to mac80211 to handle scheduling of TXQs. The interface between driver and mac80211 for TXQ handling is changed by adding two new
functions: ieee80211_next_txq(), which will return the next TXQ to schedule in the current round-robin rotation, and ieee80211_return_txq(), which the driver uses to indicate that it has finished scheduling a TXQ (which will then be put back in the scheduling rotation if it isn't empty).
The driver must call ieee80211_txq_schedule_start() at the start of each scheduling session, and ieee80211_txq_schedule_end() at the end. The API then guarantees that the same TXQ is not returned twice in the same session (so a driver can loop on ieee80211_next_txq() without worrying about breaking the loop.
Usage of the new API is optional, so drivers can be ported one at a time. In this patch, the actual scheduling performed by mac80211 is simple round-robin, but a subsequent commit adds airtime fairness awareness to the scheduler.
--- include/net/mac80211.h | 62 +++++++++++++++++++++++++++++++++++++++++++--- net/mac80211/agg-tx.c | 2 +- net/mac80211/driver-ops.h | 9 +++++++ net/mac80211/ieee80211_i.h | 9 +++++++ net/mac80211/main.c | 5 ++++ net/mac80211/sta_info.c | 2 +- net/mac80211/tx.c | 58 ++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 140 insertions(+), 7 deletions(-)
include/net/mac80211.h +58 -4
@@ -108,9 +108,15 @@* The driver is expected to initialize its private per-queue data for stations * and interfaces in the .add_interface and .sta_add ops. * -* The driver can't access the queue directly. To dequeue a frame, it calls -* ieee80211_tx_dequeue(). Whenever mac80211 adds a new frame to a queue, it -* calls the .wake_tx_queue driver op. +* The driver can't access the queue directly. To dequeue a frame from a +* txq, it calls ieee80211_tx_dequeue(). Whenever mac80211 adds a new frame to a +* queue, it calls the .wake_tx_queue driver op. +* +* Drivers can optionally delegate responsibility for scheduling queues to +* mac80211, to take advantage of airtime fairness accounting. In this case, to +* obtain the next queue to pull frames from, the driver calls +* ieee80211_next_txq(). The driver is then expected to return the txq using +* ieee80211_return_txq(). * * For AP powersave TIM handling, the driver only needs to indicate if it has * buffered packets in the driver specific data structures by calling
@@ -6088,7 +6094,8 @@ void ieee80211_tdls_oper_request(struct ieee80211_vif *vif, const u8 *peer,* ieee80211_tx_dequeue - dequeue a packet from a software tx queue * * @hw: pointer as obtained from ieee80211_alloc_hw() -* @txq: pointer obtained from station or virtual interface +* @txq: pointer obtained from station or virtual interface, or from +* ieee80211_next_txq() * * Returns the skb if successful, %NULL if no frame was available. */
@@ -6096,6 +6103,53 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, struct ieee80211_txq *txq);/** +* ieee80211_next_txq - get next tx queue to pull packets from +* +* @hw: pointer as obtained from ieee80211_alloc_hw() +* @ac: AC number to return packets from. +* +* Should only be called between calls to ieee80211_txq_schedule_start() +* and ieee80211_txq_schedule_end(). +* Returns the next txq if successful, %NULL if no queue is eligible. If a txq +* is returned, it should be returned with ieee80211_return_txq() after the +* driver has finished scheduling it. +*/ +struct ieee80211_txq *ieee80211_next_txq (struct ieee80211_hw *hw,u8 ac); + +/** +* ieee80211_return_txq - return a TXQ previously acquired by +* ieee80211_next_txq() +* +* @hw: pointer as obtained from ieee80211_alloc_hw() +* @txq: pointer obtained from station or virtual interface +* +* Should only be called between calls to ieee80211_txq_schedule_start() +* and ieee80211_txq_schedule_end(). +*/ +void ieee80211_return_txq (struct ieee80211_hw *hw,struct ieee80211_txq *txq); + +/** +* ieee80211_txq_schedule_start - acquire locks for safe scheduling of an AC +* +* @hw: pointer as obtained from ieee80211_alloc_hw() +* @ac: AC number to acquire locks for +* +* Acquire locks needed to schedule TXQs from the given AC. Should be called +* before ieee80211_next_txq() or ieee80211_return_txq(). +*/ +void ieee80211_txq_schedule_start (struct ieee80211_hw *hw,u8 ac); + +/** +* ieee80211_txq_schedule_end - release locks for safe scheduling of an AC +* +* @hw: pointer as obtained from ieee80211_alloc_hw() +* @ac: AC number to acquire locks for +* +* Release locks previously acquired by ieee80211_txq_schedule_end(). +*/ +void ieee80211_txq_schedule_end (struct ieee80211_hw *hw,u8 ac); + +/** * ieee80211_txq_get_depth - get pending frame/byte count of given txq * * The values are not guaranteed to be coherent with regard to each other, i.e.
net/mac80211/agg-tx.c +1 -1
@@ -229,7 +229,7 @@ static void __releases(agg_queue)clear_bit (IEEE80211_TXQ_STOP , &txqi->flags);local_bh_disable ();rcu_read_lock (); -drv_wake_tx_queue (sta->sdata->local, txqi); +schedule_and_wake_txq (sta->sdata->local, txqi);rcu_read_unlock ();local_bh_enable (); }
net/mac80211/driver-ops.h +9 -0
@@ -1173,6 +1173,15 @@ static inline void drv_wake_tx_queue(struct ieee80211_local *local, local->ops->wake_tx_queue (&local->hw, &txq->txq); } +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]); +drv_wake_tx_queue (local, txqi); +} +static inline int drv_can_aggregate_in_amsdu (struct ieee80211_local *local,struct sk_buff *head,struct sk_buff *skb)
net/mac80211/ieee80211_i.h +9 -0
@@ -830,6 +830,8 @@ enum txq_info_flags {* a fq_flow which is already owned by a different tin * @def_cvars: codel vars for @def_flow * @frags: used to keep fragments created after dequeue +* @schedule_order: used with ieee80211_local->active_txqs +* @schedule_round: counter to prevent infinite loops on TXQ scheduling */ struct txq_info {struct fq_tin tin;
@@ -837,6 +839,8 @@ struct txq_info {struct codel_vars def_cvars;struct codel_stats cstats;struct sk_buff_head frags; +struct list_head schedule_order; +u16 schedule_round;unsigned long flags;/* keep last! */
@@ -1128,6 +1132,11 @@ struct ieee80211_local {struct codel_vars *cvars;struct codel_params cparams; +/* protects active_txqs and txqi->schedule_order */ +spinlock_t active_txq_lock[IEEE80211_NUM_ACS ]; +struct list_head active_txqs[IEEE80211_NUM_ACS ]; +u16 schedule_round[IEEE80211_NUM_ACS ]; +const struct ieee80211_ops *ops;/*
net/mac80211/main.c +5 -0
@@ -663,6 +663,11 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,spin_lock_init (&local->rx_path_lock);spin_lock_init (&local->queue_stop_reason_lock); +for (i =0 ; i <IEEE80211_NUM_ACS ; i++) { +INIT_LIST_HEAD (&local->active_txqs[i]); +spin_lock_init (&local->active_txq_lock[i]); + } +INIT_LIST_HEAD (&local->chanctx_list);mutex_init (&local->chanctx_mtx);
net/mac80211/sta_info.c +1 -1
@@ -1249,7 +1249,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)if (!sta->sta.txq[i] || !txq_has_queue (sta->sta.txq[i]))continue ; -drv_wake_tx_queue (local,to_txq_info (sta->sta.txq[i])); +schedule_and_wake_txq (local,to_txq_info (sta->sta.txq[i])); }skb_queue_head_init (&pending);
net/mac80211/tx.c +57 -1
82 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v4 2/6 cfg80211: Add airtime statistics and settings
In reply to Rajkumar ManoharanFrom: Toke Høiland-Jørgensen <[email protected]>
This adds TX airtime statistics to the cfg80211 station dump (to go along with the RX info already present), and adds a new parameter to set the airtime weight of each station. The latter allows userspace to implement policies for different stations by varying their weights.
--- include/net/cfg80211.h | 10 +++++++++- include/uapi/linux/nl80211.h | 15 +++++++++++++++ net/wireless/nl80211.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-)
include/net/cfg80211.h +9 -1
@@ -1001,6 +1001,7 @@ enum station_parameters_apply_mask {* @support_p2p_ps: information if station supports P2P PS mechanism * @he_capa: HE capabilities of station * @he_capa_len: the length of the HE capabilities +* @airtime_weight: airtime scheduler weight for this station */ struct station_parameters {const u8 *supported_rates;
@@ -1030,6 +1031,7 @@ struct station_parameters {int support_p2p_ps;const struct ieee80211_he_cap_elem *he_capa;u8 he_capa_len; +u16 airtime_weight; };/**
@@ -1297,6 +1299,8 @@ struct cfg80211_tid_stats {* @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received * from this peer * @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer +* @tx_duration: aggregate PPDU duration(usecs) for all the frames to a peer +* @airtime_weight: current airtime scheduling weight * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last * (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs. * Note that this doesn't use the @filled bit, but is used if non-NULL.
@@ -1347,10 +1351,12 @@ struct station_info {u32 expected_throughput; -u64 rx_beacon; +u64 tx_duration;u64 rx_duration; +u64 rx_beacon;u8 rx_beacon_signal_avg;struct cfg80211_tid_stats *pertid; +u16 airtime_weight;s8 ack_signal;s8 avg_ack_signal;
@@ -2381,6 +2387,8 @@ enum wiphy_params_flags { WIPHY_PARAM_TXQ_QUANTUM = 1 << 8, }; +#define IEEE80211_DEFAULT_AIRTIME_WEIGHT 256 +/** * struct cfg80211_pmksa - PMK Security Association *
include/uapi/linux/nl80211.h +15 -0
@@ -2254,6 +2254,9 @@ enum nl80211_commands {* @NL80211_ATTR_FTM_RESPONDER_STATS: Nested attribute with FTM responder * statistics, see &enum nl80211_ftm_responder_stats. * +* @NL80211_ATTR_AIRTIME_WEIGHT: Station's weight when scheduled by the airtime +* scheduler. +* * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2699,6 +2702,8 @@ enum nl80211_attrs {NL80211_ATTR_FTM_RESPONDER_STATS , +NL80211_ATTR_AIRTIME_WEIGHT , +/* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST,
@@ -3074,6 +3079,9 @@ enum nl80211_sta_bss_param {* with an FCS error (u32, from this station). This count may not include * some packets with an FCS error due to TA corruption. Hence this counter * might not be fully accurate. +* @NL80211_STA_INFO_TX_DURATION: aggregate PPDU duration for all frames +* sent to the station (u64, usec) +* @NL80211_STA_INFO_AIRTIME_WEIGHT: current airtime weight for station (u16) * @__NL80211_STA_INFO_AFTER_LAST: internal * @NL80211_STA_INFO_MAX: highest possible station info attribute */
@@ -3116,6 +3124,8 @@ enum nl80211_sta_info {NL80211_STA_INFO_ACK_SIGNAL_AVG ,NL80211_STA_INFO_RX_MPDUS ,NL80211_STA_INFO_FCS_ERROR_COUNT , +NL80211_STA_INFO_TX_DURATION , +NL80211_STA_INFO_AIRTIME_WEIGHT ,/* keep last */ __NL80211_STA_INFO_AFTER_LAST,
@@ -5258,6 +5268,10 @@ enum nl80211_feature_flags {* if this flag is not set. Ignoring this can leak clear text packets and/or * freeze the connection. * +* @NL80211_EXT_FEATURE_AIRTIME_FAIRNESS: Driver supports getting airtime +* fairness for transmitted packets and has enabled airtime fairness +* scheduling. +* * @NUM_NL80211_EXT_FEATURES: number of extended features. * @MAX_NL80211_EXT_FEATURES: highest extended feature index. */
@@ -5297,6 +5311,7 @@ enum nl80211_ext_feature_index {NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT ,NL80211_EXT_FEATURE_CAN_REPLACE_PTK0 ,NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER , +NL80211_EXT_FEATURE_AIRTIME_FAIRNESS ,/* add new features before the definition below */ NUM_NL80211_EXT_FEATURES,
net/wireless/nl80211.c +30 -0
@@ -497,6 +497,7 @@ static int validate_ie_attr(const struct nlattr *attr, .type = NLA_NESTED, .validation_data = nl80211_ftm_responder_policy, }, + [NL80211_ATTR_AIRTIME_WEIGHT] = { .type = NLA_U16 }, };/* policy for the key attributes */
@@ -4690,6 +4691,11 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,PUT_SINFO (PLID , plid, u16);PUT_SINFO (PLINK_STATE , plink_state, u8);PUT_SINFO_U64 (RX_DURATION , rx_duration); +PUT_SINFO_U64 (TX_DURATION , tx_duration); + +if (wiphy_ext_feature_isset (&rdev->wiphy, +NL80211_EXT_FEATURE_AIRTIME_FAIRNESS )) +PUT_SINFO (AIRTIME_WEIGHT , airtime_weight, u16);switch (rdev->wiphy.signal_type) {case CFG80211_SIGNAL_TYPE_MBM :
@@ -5308,6 +5314,18 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)nla_get_u8 (info->attrs[NL80211_ATTR_OPMODE_NOTIF ]); } +if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT ]) { + params.airtime_weight = +nla_get_u16 (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT ]); +if (!params.airtime_weight) +return -EINVAL ; + } + +if (params.airtime_weight && + !wiphy_ext_feature_isset (&rdev->wiphy, +NL80211_EXT_FEATURE_AIRTIME_FAIRNESS )) +return -EOPNOTSUPP ; +/* Include parameters for TDLS peer (will check later) */ err =nl80211_set_station_tdls (info, ¶ms);if (err)
@@ -5436,6 +5454,18 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) params.plink_action =nla_get_u8 (info->attrs[NL80211_ATTR_STA_PLINK_ACTION ]); +if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT ]) { + params.airtime_weight = +nla_get_u16 (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT ]); +if (!params.airtime_weight) +return -EINVAL ; + } + +if (params.airtime_weight && + !wiphy_ext_feature_isset (&rdev->wiphy, +NL80211_EXT_FEATURE_AIRTIME_FAIRNESS )) +return -EOPNOTSUPP ; + err =nl80211_parse_sta_channel_info (info, ¶ms);if (err)return err;
Signature · 1 line
1.9.1
PATCH v4 3/6 mac80211: Add airtime accounting and scheduling to TXQs
In reply to Rajkumar ManoharanFrom: Toke Høiland-Jørgensen <[email protected]>
This adds airtime accounting and scheduling to the mac80211 TXQ scheduler. A new callback, ieee80211_sta_register_airtime(), is added that drivers can call to report airtime usage for stations.
When airtime information is present, mac80211 will schedule TXQs (through ieee80211_next_txq()) in a way that enforces airtime fairness between active stations. This scheduling works the same way as the ath9k in-driver airtime fairness scheduling. If no airtime usage is reported by the driver, the scheduler will default to round-robin scheduling.
For drivers that don't control TXQ scheduling in software, a new API function, ieee80211_txq_may_transmit(), is added which the driver can use to check if the TXQ is eligible for transmission, or should be throttled to enforce fairness. Calls to this function must also be enclosed in ieee80211_txq_schedule_{start,end}() calls to ensure proper locking.
The API ieee80211_txq_may_transmit() also ensures that TXQ list will be aligned aginst driver's own round-robin scheduler list. i.e it rotates the TXQ list till it makes the requested node becomes the first entry in TXQ list. Thus both the TXQ list and driver's list are in sync.
--- include/net/mac80211.h | 59 ++++++++++++++++++++++++++++++ net/mac80211/cfg.c | 3 ++ net/mac80211/debugfs.c | 3 ++ net/mac80211/debugfs_sta.c | 68 +++++++++++++++++++++++++++++++++-- net/mac80211/ieee80211_i.h | 2 ++ net/mac80211/main.c | 4 +++ net/mac80211/sta_info.c | 44 +++++++++++++++++++++-- net/mac80211/sta_info.h | 13 +++++++ net/mac80211/status.c | 6 ++++ net/mac80211/tx.c | 90 +++++++++++++++++++++++++++++++++++++++++++--- 10 files changed, 282 insertions(+), 10 deletions(-)
include/net/mac80211.h +59 -0
@@ -2357,6 +2357,9 @@ enum ieee80211_hw_flags {* @tx_sk_pacing_shift: Pacing shift to set on TCP sockets when frames from * them are encountered. The default should typically not be changed, * unless the driver has good reasons for needing more buffers. +* +* @weight_multipler: Driver specific airtime weight multiplier used while +* refilling deficit of each TXQ. */ struct ieee80211_hw {struct ieee80211_conf conf;
@@ -2393,6 +2396,7 @@ struct ieee80211_hw {const struct ieee80211_cipher_scheme *cipher_schemes;u8 max_nan_de_entries;u8 tx_sk_pacing_shift; +u8 weight_multiplier; }; static inline bool _ieee80211_hw_check(struct ieee80211_hw *hw,
@@ -5393,6 +5397,34 @@ void ieee80211_sta_block_awake(struct ieee80211_hw *hw,void ieee80211_send_eosp_nullfunc (struct ieee80211_sta *pubsta,int tid);/** +* ieee80211_sta_register_airtime - register airtime usage for a sta/tid +* +* Register airtime usage for a given sta on a given tid. The driver can call +* this function to notify mac80211 that a station used a certain amount of +* airtime. This information will be used by the TXQ scheduler to schedule +* stations in a way that ensures airtime fairness. +* +* The reported airtime should as a minimum include all time that is spent +* transmitting to the remote station, including overhead and padding, but not +* including time spent waiting for a TXOP. If the time is not reported by the +* hardware it can in some cases be calculated from the rate and known frame +* composition. When possible, the time should include any failed transmission +* attempts. +* +* The driver can either call this function synchronously for every packet or +* aggregate, or asynchronously as airtime usage information becomes available. +* TX and RX airtime can be reported together, or separately by setting one of +* them to 0. +* +* @pubsta: the station +* @tid: the TID to register airtime for +* @tx_airtime: airtime used during TX (in usec) +* @rx_airtime: airtime used during RX (in usec) +*/ +void ieee80211_sta_register_airtime (struct ieee80211_sta *pubsta,u8 tid, +u32 tx_airtime,u32 rx_airtime); + +/** * ieee80211_iter_keys - iterate keys programmed into the device * @hw: pointer obtained from ieee80211_alloc_hw() * @vif: virtual interface to iterate, may be %NULL for all
@@ -6150,6 +6182,33 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,void ieee80211_txq_schedule_end (struct ieee80211_hw *hw,u8 ac);/** +* 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 +* the airtime scheduler, and can be used by drivers to access the airtime +* fairness accounting without going using the scheduling order enfored by +* next_txq(). +* +* Returns %true if the airtime scheduler thinks the TXQ should be allowed to +* transmit, and %false if it should be throttled. This function can also have +* the side effect of rotating the TXQ in the scheduler rotation, which will +* eventually bring the deficit to positive and allow the station to transmit +* again. +* +* The API ieee80211_txq_may_transmit() also ensures that TXQ list will be +* aligned aginst driver's own round-robin scheduler list. i.e it rotates +* the TXQ list till it makes the requested node becomes the first entry +* in TXQ list. Thus both the TXQ list and driver's list are in sync. If this +* function returns %true, the driver is expected to schedule packets +* for transmission, and then return the TXQ through ieee80211_return_txq(). +* +* @hw: pointer as obtained from ieee80211_alloc_hw() +* @txq: pointer obtained from station or virtual interface +*/ +bool ieee80211_txq_may_transmit (struct ieee80211_hw *hw, +struct ieee80211_txq *txq); + +/** * ieee80211_txq_get_depth - get pending frame/byte count of given txq * * The values are not guaranteed to be coherent with regard to each other, i.e.
net/mac80211/cfg.c +3 -0
@@ -1447,6 +1447,9 @@ static int sta_apply_parameters(struct ieee80211_local *local,if (ieee80211_vif_is_mesh (&sdata->vif))sta_apply_mesh_params (local, sta, params); +if (params->airtime_weight) + sta->airtime_weight = params->airtime_weight; +/* set the STA state after all sta info from usermode has been set */ if (test_sta_flag (sta,WLAN_STA_TDLS_PEER ) || set &BIT (NL80211_STA_FLAG_ASSOCIATED )) {
net/mac80211/debugfs.c +3 -0
@@ -383,6 +383,9 @@ void debugfs_hw_add(struct ieee80211_local *local)if (local->ops->wake_tx_queue)DEBUGFS_ADD_MODE (aqm,0600 ); +debugfs_create_u16 ("airtime_flags" ,0600 , + phyd, &local->airtime_flags); + statsd =debugfs_create_dir ("statistics" , phyd);/* if the dir failed, don't put all the other things into the root! */
net/mac80211/debugfs_sta.c +65 -3
86 lines not on this page · raw message
net/mac80211/ieee80211_i.h +2 -0
@@ -1137,6 +1137,8 @@ struct ieee80211_local {struct list_head active_txqs[IEEE80211_NUM_ACS ];u16 schedule_round[IEEE80211_NUM_ACS ]; +u16 airtime_flags; +const struct ieee80211_ops *ops;/*
net/mac80211/main.c +4 -0
@@ -667,6 +667,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,INIT_LIST_HEAD (&local->active_txqs[i]);spin_lock_init (&local->active_txq_lock[i]); } + local->airtime_flags =AIRTIME_USE_TX |AIRTIME_USE_RX ;INIT_LIST_HEAD (&local->chanctx_list);mutex_init (&local->chanctx_mtx);
@@ -1153,6 +1154,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)if (!local->hw.max_nan_de_entries) local->hw.max_nan_de_entries =IEEE80211_MAX_NAN_INSTANCE_ID ; +if (!local->hw.weight_multiplier) + local->hw.weight_multiplier =1 ; + result =ieee80211_wep_init (local);if (result <0 ) wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n",
net/mac80211/sta_info.c +41 -3
78 lines not on this page · raw message
net/mac80211/sta_info.h +13 -0
@@ -127,6 +127,16 @@ enum ieee80211_agg_stop_reason { AGG_STOP_DESTROY_STA, }; +/* Debugfs flags to enable/disable use of RX/TX airtime in scheduler */ +#define AIRTIME_USE_TX BIT(0) +#define AIRTIME_USE_RX BIT(1) + +struct airtime_info { +u64 rx_airtime; +u64 tx_airtime; +s64 deficit; +}; +struct sta_info ;/**
@@ -563,6 +573,9 @@ struct sta_info { } tx_stats;u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK +1 ]; +struct airtime_info airtime[IEEE80211_NUM_ACS ]; +u16 airtime_weight; +/* * Aggregation information, locked with lock. */
net/mac80211/status.c +6 -0
@@ -823,6 +823,12 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,ieee80211_sta_tx_notify (sta->sdata, (void *) skb->data, acked, info->status.tx_time); +if (info->status.tx_time && +wiphy_ext_feature_isset (local->hw.wiphy, +NL80211_EXT_FEATURE_AIRTIME_FAIRNESS )) +ieee80211_sta_register_airtime (&sta->sta, tid, + info->status.tx_time,0 ); +if (ieee80211_hw_check (&local->hw,REPORTS_TX_ACK_STATUS )) {if (info->flags &IEEE80211_TX_STAT_ACK ) {if (sta->status_stats.lost_packets)
net/mac80211/tx.c +86 -4
117 lines not on this page · raw message
Signature · 1 line
1.9.1
kbuild test robot
build botRe: [PATCH v4 3/6] mac80211: Add airtime accounting and scheduling to TXQs
I love your patch! Perhaps something to improve:
Hi Toke,
I love your patch! Perhaps something to improve:
[auto build test WARNING on mac80211/master]
[also build test WARNING on v4.20-rc7]
[cannot apply to next-20181218]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Rajkumar-Manoharan/Move-TXQ-scheduling-and-airtime-fairness-into-mac80211/20181219-080126 base: https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git master config: i386-randconfig-x001-201850 (attached as .config) compiler: gcc-7 (Debian 7.3.0-1) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386
All warnings (new ones prefixed by >>):
In file included from include/linux/bitops.h:5:0,
from include/linux/kernel.h:11,
from include/linux/list.h:9,
from include/linux/module.h:9,
from net/mac80211/sta_info.c:13:
net/mac80211/sta_info.c: In function 'sta_set_sinfo':
include/linux/bits.h:6:24: warning: left shift count >= width of type [-Wshift-count-overflow]
#define BIT(nr) (1UL << (nr))
^
>> net/mac80211/sta_info.c:2215:20: note: in expansion of macro 'BIT'
sinfo->filled |= BIT(NL80211_STA_INFO_RX_DURATION);
^~~
include/linux/bits.h:6:24: warning: left shift count >= width of type [-Wshift-count-overflow]
#define BIT(nr) (1UL << (nr))
^
net/mac80211/sta_info.c:2221:20: note: in expansion of macro 'BIT'
sinfo->filled |= BIT(NL80211_STA_INFO_TX_DURATION);
^~~
include/linux/bits.h:6:24: warning: left shift count >= width of type [-Wshift-count-overflow]
#define BIT(nr) (1UL << (nr))
^
net/mac80211/sta_info.c:2226:20: note: in expansion of macro 'BIT'
sinfo->filled |= BIT(NL80211_STA_INFO_AIRTIME_WEIGHT);
^~~vim +/BIT +2215 net/mac80211/sta_info.c
2120
2121 void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
2122 bool tidstats)
2123 {
2124 struct ieee80211_sub_if_data *sdata = sta->sdata;
2125 struct ieee80211_local *local = sdata->local;
2126 u32 thr = 0;
2127 int i, ac, cpu;
2128 struct ieee80211_sta_rx_stats *last_rxstats;
2129
2130 last_rxstats = sta_get_last_rx_stats(sta);
2131
2132 sinfo->generation = sdata->local->sta_generation;
2133
2134 /* do before driver, so beacon filtering drivers have a
2135 * chance to e.g. just add the number of filtered beacons
2136 * (or just modify the value entirely, of course)
2137 */
2138 if (sdata->vif.type == NL80211_IFTYPE_STATION)
2139 sinfo->rx_beacon = sdata->u.mgd.count_beacon_signal;
2140
2141 drv_sta_statistics(local, sdata, &sta->sta, sinfo);
2142
2143 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME) |
2144 BIT_ULL(NL80211_STA_INFO_STA_FLAGS) |
2145 BIT_ULL(NL80211_STA_INFO_BSS_PARAM) |
2146 BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME) |
2147 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC);
2148
2149 if (sdata->vif.type == NL80211_IFTYPE_STATION) {
2150 sinfo->beacon_loss_count = sdata->u.mgd.beacon_loss_count;
2151 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS);
2152 }
2153
2154 sinfo->connected_time = ktime_get_seconds() - sta->last_connected;
2155 sinfo->inactive_time =
2156 jiffies_to_msecs(jiffies - ieee80211_sta_last_active(sta));
2157
2158 if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES64) |
2159 BIT_ULL(NL80211_STA_INFO_TX_BYTES)))) {
2160 sinfo->tx_bytes = 0;
2161 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
2162 sinfo->tx_bytes += sta->tx_stats.bytes[ac];
2163 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
2164 }
2165
2166 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) {
2167 sinfo->tx_packets = 0;
2168 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
2169 sinfo->tx_packets += sta->tx_stats.packets[ac];
2170 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
2171 }
2172
2173 if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES64) |
2174 BIT_ULL(NL80211_STA_INFO_RX_BYTES)))) {
2175 sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
2176
2177 if (sta->pcpu_rx_stats) {
2178 for_each_possible_cpu(cpu) {
2179 struct ieee80211_sta_rx_stats *cpurxs;
2180
2181 cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
2182 sinfo->rx_bytes += sta_get_stats_bytes(cpurxs);
2183 }
2184 }
2185
2186 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
2187 }
2188
2189 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) {
2190 sinfo->rx_packets = sta->rx_stats.packets;
2191 if (sta->pcpu_rx_stats) {
2192 for_each_possible_cpu(cpu) {
2193 struct ieee80211_sta_rx_stats *cpurxs;
2194
2195 cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
2196 sinfo->rx_packets += cpurxs->packets;
2197 }
2198 }
2199 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
2200 }
2201
2202 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_RETRIES))) {
2203 sinfo->tx_retries = sta->status_stats.retry_count;
2204 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
2205 }
2206
2207 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED))) {
2208 sinfo->tx_failed = sta->status_stats.retry_failed;
2209 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
2210 }
2211
2212 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_DURATION))) {
2213 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
2214 sinfo->rx_duration += sta->airtime[ac].rx_airtime;
> 2215 sinfo->filled |= BIT(NL80211_STA_INFO_RX_DURATION);
2216 }
2217
2218 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_DURATION))) {
2219 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
2220 sinfo->tx_duration += sta->airtime[ac].tx_airtime;
2221 sinfo->filled |= BIT(NL80211_STA_INFO_TX_DURATION);
2222 }
2223
2224 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT))) {
2225 sinfo->airtime_weight = sta->airtime_weight;
2226 sinfo->filled |= BIT(NL80211_STA_INFO_AIRTIME_WEIGHT);
2227 }
2228
2229 sinfo->rx_dropped_misc = sta->rx_stats.dropped;
2230 if (sta->pcpu_rx_stats) {
2231 for_each_possible_cpu(cpu) {
2232 struct ieee80211_sta_rx_stats *cpurxs;
2233
2234 cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
2235 sinfo->rx_dropped_misc += cpurxs->dropped;
2236 }
2237 }
2238
2239 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
2240 !(sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)) {
2241 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX) |
2242 BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
2243 sinfo->rx_beacon_signal_avg = ieee80211_ave_rssi(&sdata->vif);
2244 }
2245
2246 if (ieee80211_hw_check(&sta->local->hw, SIGNAL_DBM) ||
2247 ieee80211_hw_check(&sta->local->hw, SIGNAL_UNSPEC)) {
2248 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL))) {
2249 sinfo->signal = (s8)last_rxstats->last_signal;
2250 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
2251 }
2252
2253 if (!sta->pcpu_rx_stats &&
2254 !(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG))) {
2255 sinfo->signal_avg =
2256 -ewma_signal_read(&sta->rx_stats_avg.signal);
2257 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
2258 }
2259 }
2260
2261 /* for the average - if pcpu_rx_stats isn't set - rxstats must point to
2262 * the sta->rx_stats struct, so the check here is fine with and without
2263 * pcpu statistics
2264 */
2265 if (last_rxstats->chains &&
2266 !(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL) |
2267 BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) {
2268 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
2269 if (!sta->pcpu_rx_stats)
2270 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
2271
2272 sinfo->chains = last_rxstats->chains;
2273
2274 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
2275 sinfo->chain_signal[i] =
2276 last_rxstats->chain_signal_last[i];
2277 sinfo->chain_signal_avg[i] =
2278 -ewma_signal_read(&sta->rx_stats_avg.chain_signal[i]);
2279 }
2280 }
2281
2282 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE))) {
2283 sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate,
2284 &sinfo->txrate);
2285 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
2286 }
2287
2288 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE))) {
2289 if (sta_set_rate_info_rx(sta, &sinfo->rxrate) == 0)
2290 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
2291 }
2292
2293 if (tidstats && !cfg80211_sinfo_alloc_tid_stats(sinfo, GFP_KERNEL)) {
2294 for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) {
2295 struct cfg80211_tid_stats *tidstats = &sinfo->pertid[i];
2296
2297 sta_set_tidstats(sta, tidstats, i);
2298 }
2299 }
2300
2301 if (ieee80211_vif_is_mesh(&sdata->vif)) {
2302 #ifdef CONFIG_MAC80211_MESH
2303 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_LLID) |
2304 BIT_ULL(NL80211_STA_INFO_PLID) |
2305 BIT_ULL(NL80211_STA_INFO_PLINK_STATE) |
2306 BIT_ULL(NL80211_STA_INFO_LOCAL_PM) |
2307 BIT_ULL(NL80211_STA_INFO_PEER_PM) |
2308 BIT_ULL(NL80211_STA_INFO_NONPEER_PM);
2309
2310 sinfo->llid = sta->mesh->llid;
2311 sinfo->plid = sta->mesh->plid;
2312 sinfo->plink_state = sta->mesh->plink_state;
2313 if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) {
2314 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_T_OFFSET);
2315 sinfo->t_offset = sta->mesh->t_offset;
2316 }
2317 sinfo->local_pm = sta->mesh->local_pm;
2318 sinfo->peer_pm = sta->mesh->peer_pm;
2319 sinfo->nonpeer_pm = sta->mesh->nonpeer_pm;
2320 #endif
2321 }
2322
2323 sinfo->bss_param.flags = 0;
2324 if (sdata->vif.bss_conf.use_cts_prot)
2325 sinfo->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
2326 if (sdata->vif.bss_conf.use_short_preamble)
2327 sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
2328 if (sdata->vif.bss_conf.use_short_slot)
2329 sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
2330 sinfo->bss_param.dtim_period = sdata->vif.bss_conf.dtim_period;
2331 sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int;
2332
2333 sinfo->sta_flags.set = 0;
2334 sinfo->sta_flags.mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
2335 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
2336 BIT(NL80211_STA_FLAG_WME) |
2337 BIT(NL80211_STA_FLAG_MFP) |
2338 BIT(NL80211_STA_FLAG_AUTHENTICATED) |
2339 BIT(NL80211_STA_FLAG_ASSOCIATED) |
2340 BIT(NL80211_STA_FLAG_TDLS_PEER);
2341 if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2342 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHORIZED);
2343 if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE))
2344 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE);
2345 if (sta->sta.wme)
2346 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_WME);
2347 if (test_sta_flag(sta, WLAN_STA_MFP))
2348 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_MFP);
2349 if (test_sta_flag(sta, WLAN_STA_AUTH))
2350 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHENTICATED);
2351 if (test_sta_flag(sta, WLAN_STA_ASSOC))
2352 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
2353 if (test_sta_flag(sta, WLAN_STA_TDLS_PEER))
2354 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
2355
2356 thr = sta_get_expected_throughput(sta);
2357
2358 if (thr != 0) {
2359 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
2360 sinfo->expected_throughput = thr;
2361 }
2362
2363 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL)) &&
2364 sta->status_stats.ack_signal_filled) {
2365 sinfo->ack_signal = sta->status_stats.last_ack_signal;
2366 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
2367 }
2368
2369 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG)) &&
2370 sta->status_stats.ack_signal_filled) {
2371 sinfo->avg_ack_signal =
2372 -(s8)ewma_avg_signal_read(
2373 &sta->status_stats.avg_ack_signal);
2374 sinfo->filled |=
2375 BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
2376 }
2377 }
2378
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
ath10k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath10k
PATCH v4 4/6 ath9k: Switch to mac80211 TXQ scheduling and airtime APIs
In reply to Rajkumar ManoharanFrom: Toke Høiland-Jørgensen <[email protected]>
This moves the ath9k driver to use the mac80211 TXQ scheduling and airtime accounting APIs, removing the corresponding state tracking inside the driver.
--- drivers/net/wireless/ath/ath9k/ath9k.h | 14 -- drivers/net/wireless/ath/ath9k/debug.c | 3 - drivers/net/wireless/ath/ath9k/debug.h | 8 - drivers/net/wireless/ath/ath9k/debug_sta.c | 70 --------- drivers/net/wireless/ath/ath9k/init.c | 3 +- drivers/net/wireless/ath/ath9k/recv.c | 9 +- drivers/net/wireless/ath/ath9k/xmit.c | 244 +++++++++-------------------- 7 files changed, 75 insertions(+), 276 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +0 -14
@@ -112,8 +112,6 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,#define ATH_TXFIFO_DEPTH 8#define ATH_TX_ERROR 0x01 -#define ATH_AIRTIME_QUANTUM 300/* usec */ -/* Stop tx traffic 1ms before the GO goes away */ #define ATH_P2P_PS_STOP_TIME 1000
@@ -246,10 +244,8 @@ struct ath_atx_tid {s8 bar_index;bool active;bool clear_ps_filter; -bool has_queued; }; -void __ath_tx_queue_tid (struct ath_softc *sc,struct ath_atx_tid *tid);void ath_tx_queue_tid (struct ath_softc *sc,struct ath_atx_tid *tid);struct ath_node {
@@ -263,12 +259,9 @@ struct ath_node {bool sleeping;bool no_ps_filter; -s64 airtime_deficit[IEEE80211_NUM_ACS ]; -u32 airtime_rx_start;#ifdef CONFIG_ATH9K_STATION_STATISTICS struct ath_rx_rate_stats rx_rate_stats; -struct ath_airtime_stats airtime_stats;#endif u8 key_idx[4 ];
@@ -986,11 +979,6 @@ struct ath_ant_comb {#define ATH9K_NUM_CHANCTX 2/* supports 2 operating channels */ -#define AIRTIME_USE_TX BIT(0) -#define AIRTIME_USE_RX BIT(1) -#define AIRTIME_USE_NEW_QUEUES BIT(2) -#define AIRTIME_ACTIVE (flags) (!!(flags & (AIRTIME_USE_TX|AIRTIME_USE_RX))) -struct ath_softc {struct ieee80211_hw *hw;struct device *dev;
@@ -1034,8 +1022,6 @@ struct ath_softc {short nbcnvifs;unsigned long ps_usecount; -u16 airtime_flags;/* AIRTIME_* */ -struct ath_rx rx;struct ath_tx tx;struct ath_beacon beacon;
drivers/net/wireless/ath/ath9k/debug.c +0 -3
@@ -1443,9 +1443,6 @@ int ath9k_init_debug(struct ath_hw *ah)#endif debugfs_create_file ("tpc" ,0600 , sc->debug.debugfs_phy, sc, &fops_tpc); -debugfs_create_u16 ("airtime_flags" ,0600 , - sc->debug.debugfs_phy, &sc->airtime_flags); -debugfs_create_file ("nf_override" ,0600 , sc->debug.debugfs_phy, sc, &fops_nf_override);
drivers/net/wireless/ath/ath9k/debug.h +0 -8
@@ -319,20 +319,12 @@ static inline void ath9k_debug_stat_ant(struct ath_softc *sc,void ath_debug_rate_stats (struct ath_softc *sc,struct ath_rx_status *rs,struct sk_buff *skb); -void ath_debug_airtime (struct ath_softc *sc, -struct ath_node *an, -u32 rx,u32 tx);#else static inline void ath_debug_rate_stats (struct ath_softc *sc,struct ath_rx_status *rs,struct sk_buff *skb) { } -static inline void ath_debug_airtime (struct ath_softc *sc, -struct ath_node *an, -u32 rx,u32 tx) -{ -}#endif /* CONFIG_ATH9K_STATION_STATISTICS */ #endif /* DEBUG_H */
drivers/net/wireless/ath/ath9k/debug_sta.c +0 -70
80 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/init.c +1 -2
@@ -676,8 +676,6 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,/* Will be cleared in ath9k_start() */ set_bit (ATH_OP_INVALID , &common->op_flags); - sc->airtime_flags = (AIRTIME_USE_TX |AIRTIME_USE_RX | -AIRTIME_USE_NEW_QUEUES ); sc->sc_ah = ah; sc->dfs_detector =dfs_pattern_detector_init (common,NL80211_DFS_UNSET );
@@ -1013,6 +1011,7 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)SET_IEEE80211_PERM_ADDR (hw, common->macaddr);wiphy_ext_feature_set (hw->wiphy,NL80211_EXT_FEATURE_CQM_RSSI_LIST ); +wiphy_ext_feature_set (hw->wiphy,NL80211_EXT_FEATURE_AIRTIME_FAIRNESS ); } int ath9k_init_device(u16 devid, struct ath_softc *sc,
drivers/net/wireless/ath/ath9k/recv.c +1 -8
@@ -1054,14 +1054,7 @@ static void ath_rx_count_airtime(struct ath_softc *sc, len, rxs->rate_idx, is_sp); } -if (!!(sc->airtime_flags &AIRTIME_USE_RX )) { -spin_lock_bh (&acq->lock); - an->airtime_deficit[acno] -= airtime; -if (an->airtime_deficit[acno] <=0 ) -__ath_tx_queue_tid (sc,ATH_AN_2_TID (an, tidno)); -spin_unlock_bh (&acq->lock); - } -ath_debug_airtime (sc, an, airtime,0 ); +ieee80211_sta_register_airtime (sta, tidno,0 , airtime); exit:rcu_read_unlock (); }
drivers/net/wireless/ath/ath9k/xmit.c +73 -171
491 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v4 5/6 ath10k: migrate to mac80211 txq scheduling
In reply to Rajkumar ManoharanFrom: Toke Høiland-Jørgensen <[email protected]>
ath10k maintains common txqs list for all stations. This txq management can be removed by migrating to mac80211 txq APIs and let mac80211 handle txqs reordering based on reported airtime. By doing this, txq fairness maintained in ath10k i.e processing N frames per txq is removed. By adapting to mac80211 APIs, ath10k will support mac80211 based airtime fairness algorithm.
--- drivers/net/wireless/ath/ath10k/core.c | 2 - drivers/net/wireless/ath/ath10k/core.h | 6 +- drivers/net/wireless/ath/ath10k/htc.h | 1 - drivers/net/wireless/ath/ath10k/htt_rx.c | 8 +++ drivers/net/wireless/ath/ath10k/mac.c | 98 ++++++++++++++------------------ 5 files changed, 54 insertions(+), 61 deletions(-)
drivers/net/wireless/ath/ath10k/core.c +0 -2
@@ -3065,9 +3065,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,mutex_init (&ar->conf_mutex);spin_lock_init (&ar->data_lock); -spin_lock_init (&ar->txqs_lock); -INIT_LIST_HEAD (&ar->txqs);INIT_LIST_HEAD (&ar->peers);init_waitqueue_head (&ar->peer_mapping_wq);init_waitqueue_head (&ar->htt.empty_tx_wq);
drivers/net/wireless/ath/ath10k/core.h +3 -3
@@ -90,6 +90,9 @@/* The magic used by QCA spec */ #define ATH10K_SMBIOS_BDF_EXT_MAGIC "BDF_" +/* Default Airtime weight multipler (Tuned for multiclient performance) */ +#define ATH10K_AIRTIME_WEIGHT_MULTIPLIER 4 +struct ath10k ;static inline const char *ath10k_bus_str (enum ath10k_bus bus)
@@ -1062,10 +1065,7 @@ struct ath10k {/* protects shared structure data */ spinlock_t data_lock; -/* protects: ar->txqs, artxq->list */ -spinlock_t txqs_lock; -struct list_head txqs;struct list_head arvifs;struct list_head peers;struct ath10k_peer *peer_map[ATH10K_MAX_NUM_PEER_IDS ];
drivers/net/wireless/ath/ath10k/htc.h +0 -1
@@ -51,7 +51,6 @@*/ #define HTC_HOST_MAX_MSG_PER_RX_BUNDLE 8 -#define HTC_HOST_MAX_MSG_PER_TX_BUNDLE 16enum ath10k_htc_tx_flags {ATH10K_HTC_FLAG_NEED_CREDIT_UPDATE =0x01 ,
drivers/net/wireless/ath/ath10k/htt_rx.c +8 -0
@@ -2379,6 +2379,7 @@ static void ath10k_htt_rx_tx_fetch_ind(struct ath10k *ar, struct sk_buff *skb)u8 tid;int ret;int i; +bool may_tx;ath10k_dbg (ar,ATH10K_DBG_HTT ,"htt rx tx fetch ind\n" );
@@ -2451,8 +2452,13 @@ static void ath10k_htt_rx_tx_fetch_ind(struct ath10k *ar, struct sk_buff *skb) num_msdus =0 ; num_bytes =0 ; +ieee80211_txq_schedule_start (hw, txq->ac); + may_tx =ieee80211_txq_may_transmit (hw, txq);while (num_msdus < max_num_msdus && num_bytes < max_num_bytes) { +if (!may_tx) +break ; + ret =ath10k_mac_tx_push_txq (hw, txq);if (ret <0 )break ;
@@ -2460,6 +2466,8 @@ static void ath10k_htt_rx_tx_fetch_ind(struct ath10k *ar, struct sk_buff *skb) num_msdus++; num_bytes += ret; } +ieee80211_return_txq (hw, txq); +ieee80211_txq_schedule_end (hw, txq->ac); record->num_msdus =cpu_to_le16 (num_msdus); record->num_bytes =cpu_to_le32 (num_bytes);
drivers/net/wireless/ath/ath10k/mac.c +43 -55
154 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v4 6/6 ath10k: reporting estimated tx airtime for fairness
In reply to Rajkumar ManoharanFrom: Kan Yan <[email protected]>
Transmit airtime will be estimated from last tx rate used. Firmware report tx rate by peer stats. Airtime is computed on tx path and the same will be reported to mac80211 upon tx completion.
This change is based on Kan's orginal commit in Chromium tree ("CHROMIUM: ath10k: Implementing airtime fairness based TX scheduler")
ref: https://chromium-review.googlesource.com/588190
--- drivers/net/wireless/ath/ath10k/core.h | 2 ++ drivers/net/wireless/ath/ath10k/htt_rx.c | 1 + drivers/net/wireless/ath/ath10k/mac.c | 57 ++++++++++++++++++++++++++++++-- drivers/net/wireless/ath/ath10k/txrx.c | 4 +++ 4 files changed, 61 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath10k/core.h +2 -0
@@ -126,6 +126,7 @@ struct ath10k_skb_cb {u8 flags;u8 eid;u16 msdu_id; +u16 airtime_est;struct ieee80211_vif *vif;struct ieee80211_txq *txq; } __packed;
@@ -496,6 +497,7 @@ struct ath10k_sta {u32 smps;u16 peer_id;struct rate_info txrate; +u32 last_tx_bitrate;struct work_struct update_wk;u64 rx_duration;
drivers/net/wireless/ath/ath10k/htt_rx.c +1 -0
@@ -2808,6 +2808,7 @@ static inline int ath10k_get_legacy_rate_idx(struct ath10k *ar, u8 rate) arsta->txrate.nss = txrate.nss; arsta->txrate.bw =ath10k_bw_to_mac80211_bw (txrate.bw); + arsta->last_tx_bitrate =cfg80211_calculate_bitrate (&arsta->txrate);if (ath10k_debug_is_extd_tx_stats_enabled (ar)) ath10k_accumulate_per_peer_tx_stats(ar, arsta, peer_stats,
drivers/net/wireless/ath/ath10k/mac.c +54 -3
100 lines not on this page · raw message
drivers/net/wireless/ath/ath10k/txrx.c +4 -0
@@ -95,6 +95,10 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt,wake_up (&htt->empty_tx_wq);spin_unlock_bh (&htt->tx_lock); +if (txq && txq->sta) +ieee80211_sta_register_airtime (txq->sta, txq->tid, + skb_cb->airtime_est,0 ); +if (ar->dev_type !=ATH10K_DEV_TYPE_HL )dma_unmap_single (dev, skb_cb->paddr, msdu->len,DMA_TO_DEVICE );
Signature · 1 line
1.9.1
Toke Høiland-Jørgensen
maintainerRe: [PATCH v4 6/6] ath10k: reporting estimated tx airtime for fairness
Quoted 6 lines · Rajkumar Manoharan
From: Kan Yan <[email protected]>
Transmit airtime will be estimated from last tx rate used. Firmware report tx rate by peer stats. Airtime is computed on tx path and the same will be reported to mac80211 upon tx completion.
FYI, it seems that this last patch in the series no longer applies cleanly on top of mac80211-next. May need a refresh.
The mac80211 parts were merged into mac80211-next (thanks, Johannes!); I guess the driver updates are waiting for drivers-next to catch up to that?
Patches 4 and 5 in the series are fine...
-Toke
Toke Høiland-Jørgensen
maintainerRe: [PATCH v4 6/6] ath10k: reporting estimated tx airtime for fairness
Quoted 9 lines · Toke Høiland-Jørgensen
Quoted 6 lines · Rajkumar Manoharan
From: Kan Yan <[email protected]>
Transmit airtime will be estimated from last tx rate used. Firmware report tx rate by peer stats. Airtime is computed on tx path and the same will be reported to mac80211 upon tx completion.
Quoted 8 lines
FYI, it seems that this last patch in the series no longer applies cleanly on top of mac80211-next. May need a refresh.
The mac80211 parts were merged into mac80211-next (thanks, Johannes!); I guess the driver updates are waiting for drivers-next to catch up to that?
Patches 4 and 5 in the series are fine...
This was meant to be a reply to v5 of the patch set (which is where I had the issue); apologies for picking the wrong one to reply to...
-Toke
Quoted 2 lines
-Toke