OSDN Git Service

Revert "mac80211: Add airtime account and scheduling to TXQs"
authorJohannes Berg <johannes.berg@intel.com>
Tue, 19 Dec 2017 09:10:48 +0000 (10:10 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 19 Dec 2017 09:12:26 +0000 (10:12 +0100)
This reverts commit b0d52ad821843a6c5badebd80feef9f871904fa6.

We need to revert the TXQ scheduling API due to conflicts
with a new driver, and this depends on that API.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/debugfs.c
net/mac80211/debugfs_sta.c
net/mac80211/ieee80211_i.h
net/mac80211/main.c
net/mac80211/rx.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac80211/status.c
net/mac80211/tx.c

index 531b526..4515580 100644 (file)
@@ -1188,8 +1188,6 @@ enum mac80211_rx_encoding {
  *     HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
  * @nss: number of streams (VHT and HE only)
  * @flag: %RX_FLAG_\*
- * @airtime: Duration of frame in usec. See @IEEE80211_HW_AIRTIME_ACCOUNTING for
- *       how to use this.
  * @encoding: &enum mac80211_rx_encoding
  * @bw: &enum rate_info_bw
  * @enc_flags: uses bits from &enum mac80211_rx_encoding_flags
@@ -1204,7 +1202,6 @@ struct ieee80211_rx_status {
        u32 device_timestamp;
        u32 ampdu_reference;
        u32 flag;
-       u16 airtime;
        u16 freq;
        u8 enc_flags;
        u8 encoding:2, bw:3;
@@ -2069,26 +2066,6 @@ struct ieee80211_txq {
  * @IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA: Hardware supports buffer STA on
  *     TDLS links.
  *
- * @IEEE80211_HW_AIRTIME_ACCOUNTING: Hardware supports accounting the airtime
- *      usage of other stations and reports it in the @tx_time and/or @airtime
- *      fields of the TX/RX status structs.
- *      When setting this flag, the driver should ensure that the respective
- *      fields in the TX and RX status structs are always either zero or
- *      contains a valid duration for the frame in usec. The driver can choose
- *      to report either or both of TX and RX airtime, but it is recommended to
- *      report both.
- *      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.
- *      For aggregated frames, there are two possible strategies to report the
- *      airtime: Either include the airtime of the entire aggregate in the first
- *      (or last) frame and leave the others at zero. Alternatively, include the
- *      overhead of the full aggregate in the first or last frame and report the
- *      time of each frame + padding not including the full aggregate overhead.
- *
  * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
  */
 enum ieee80211_hw_flags {
@@ -2132,7 +2109,6 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_REPORTS_LOW_ACK,
        IEEE80211_HW_SUPPORTS_TX_FRAG,
        IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA,
-       IEEE80211_HW_AIRTIME_ACCOUNTING,
 
        /* keep last, obviously */
        NUM_IEEE80211_HW_FLAGS
index d6b87a4..1f466d1 100644 (file)
@@ -212,7 +212,6 @@ static const char *hw_flag_names[] = {
        FLAG(REPORTS_LOW_ACK),
        FLAG(SUPPORTS_TX_FRAG),
        FLAG(SUPPORTS_TDLS_BUFFER_STA),
-       FLAG(AIRTIME_ACCOUNTING),
 #undef FLAG
 };
 
index 40dba44..b15412c 100644 (file)
@@ -188,32 +188,6 @@ static ssize_t sta_aqm_read(struct file *file, char __user *userbuf,
 }
 STA_OPS(aqm);
 
-static ssize_t sta_airtime_read(struct file *file, char __user *userbuf,
-                               size_t count, loff_t *ppos)
-{
-       struct sta_info *sta = file->private_data;
-       size_t bufsz = 200;
-       char *buf = kzalloc(bufsz, GFP_KERNEL), *p = buf;
-       ssize_t rv;
-
-       if (!buf)
-               return -ENOMEM;
-
-       spin_lock_bh(&sta->lock);
-
-       p += scnprintf(p, bufsz + buf - p,
-               "RX: %llu us\nTX: %llu us\nDeficit: %lld us\n",
-               sta->airtime_stats.rx_airtime,
-               sta->airtime_stats.tx_airtime,
-               sta->airtime_deficit);
-
-       spin_unlock_bh(&sta->lock);
-       rv = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
-       kfree(buf);
-       return rv;
-}
-STA_OPS(airtime);
-
 static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
                                        size_t count, loff_t *ppos)
 {
@@ -568,9 +542,6 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta)
        if (local->ops->wake_tx_queue)
                DEBUGFS_ADD(aqm);
 
-       if (ieee80211_hw_check(&local->hw, AIRTIME_ACCOUNTING))
-               DEBUGFS_ADD(airtime);
-
        if (sizeof(sta->driver_buffered_tids) == sizeof(u32))
                debugfs_create_x32("driver_buffered_tids", 0400,
                                   sta->debugfs_dir,
index 120c516..4155838 100644 (file)
@@ -90,9 +90,6 @@ extern const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS];
 
 #define IEEE80211_MAX_NAN_INSTANCE_ID 255
 
-/* How much to increase airtime deficit on each scheduling round */
-#define IEEE80211_AIRTIME_QUANTUM        1000 /* usec */
-
 struct ieee80211_fragment_entry {
        struct sk_buff_head skb_list;
        unsigned long first_frag_time;
@@ -1126,10 +1123,9 @@ struct ieee80211_local {
        struct codel_vars *cvars;
        struct codel_params cparams;
 
-       /* protects active_txqs_{new,old} and txqi->schedule_order */
+       /* protects active_txqs and txqi->schedule_order */
        spinlock_t active_txq_lock;
-       struct list_head active_txqs_new;
-       struct list_head active_txqs_old;
+       struct list_head active_txqs;
 
        const struct ieee80211_ops *ops;
 
index b7142f8..935d6e2 100644 (file)
@@ -619,8 +619,7 @@ 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);
 
-       INIT_LIST_HEAD(&local->active_txqs_new);
-       INIT_LIST_HEAD(&local->active_txqs_old);
+       INIT_LIST_HEAD(&local->active_txqs);
        spin_lock_init(&local->active_txq_lock);
 
        INIT_LIST_HEAD(&local->chanctx_list);
index 808f41f..b3cff69 100644 (file)
@@ -1630,14 +1630,6 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
        if (ieee80211_vif_is_mesh(&rx->sdata->vif))
                ieee80211_mps_rx_h_sta_process(sta, hdr);
 
-       /* airtime accounting */
-       if (status->airtime) {
-               spin_lock_bh(&sta->lock);
-               sta->airtime_stats.rx_airtime += status->airtime;
-               sta->airtime_deficit -= status->airtime;
-               spin_unlock_bh(&sta->lock);
-       }
-
        /*
         * Drop (qos-)data::nullfunc frames silently, since they
         * are used only to control station power saving mode.
index ed5500e..e0bcf16 100644 (file)
@@ -425,8 +425,6 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
        sta->cparams.interval = MS2TIME(100);
        sta->cparams.ecn = true;
 
-       sta->airtime_deficit = IEEE80211_AIRTIME_QUANTUM;
-
        sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr);
 
        return sta;
index e356f2f..cd53619 100644 (file)
@@ -559,13 +559,6 @@ struct sta_info {
        } tx_stats;
        u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1];
 
-       /* Airtime stats and deficit, protected by lock */
-       struct {
-               u64 rx_airtime;
-               u64 tx_airtime;
-       } airtime_stats;
-       s64 airtime_deficit;
-
        /*
         * Aggregation information, locked with lock.
         */
index b044dbe..da7427a 100644 (file)
@@ -823,14 +823,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
                                ieee80211_lost_packet(sta, info);
                        }
                }
-
-               if (info->status.tx_time &&
-                   ieee80211_hw_check(&local->hw, AIRTIME_ACCOUNTING)) {
-                       spin_lock_bh(&sta->lock);
-                       sta->airtime_stats.tx_airtime += info->status.tx_time;
-                       sta->airtime_deficit -= info->status.tx_time;
-                       spin_unlock_bh(&sta->lock);
-               }
        }
 
        /* SNMP counters
@@ -955,14 +947,6 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
                        sta->status_stats.retry_failed++;
                sta->status_stats.retry_count += retry_count;
 
-               if (info->status.tx_time &&
-                   ieee80211_hw_check(&local->hw, AIRTIME_ACCOUNTING)) {
-                       spin_lock_bh(&sta->lock);
-                       sta->airtime_stats.tx_airtime += info->status.tx_time;
-                       sta->airtime_deficit -= info->status.tx_time;
-                       spin_unlock_bh(&sta->lock);
-               }
-
                if (acked) {
                        sta->status_stats.last_ack = jiffies;
 
index 1838158..842881c 100644 (file)
@@ -3566,7 +3566,7 @@ bool ieee80211_schedule_txq(struct ieee80211_hw *hw,
        spin_lock_bh(&local->active_txq_lock);
 
        if (list_empty(&txqi->schedule_order)) {
-               list_add_tail(&txqi->schedule_order, &local->active_txqs_new);
+               list_add_tail(&txqi->schedule_order, &local->active_txqs);
                ret = true;
        }
 
@@ -3580,35 +3580,14 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw)
 {
        struct ieee80211_local *local = hw_to_local(hw);
        struct txq_info *txqi = NULL;
-       struct list_head *head;
 
        spin_lock_bh(&local->active_txq_lock);
 
-begin:
-       head = &local->active_txqs_new;
-       if (list_empty(head)) {
-               head = &local->active_txqs_old;
-               if (list_empty(head))
-                       goto out;
-       }
-
-       txqi = list_first_entry(head, struct txq_info, schedule_order);
-
-       if (txqi->txq.sta) {
-               struct sta_info *sta = container_of(txqi->txq.sta,
-                                               struct sta_info, sta);
-
-               spin_lock_bh(&sta->lock);
-               if (sta->airtime_deficit < 0) {
-                       sta->airtime_deficit += IEEE80211_AIRTIME_QUANTUM;
-                       list_move_tail(&txqi->schedule_order,
-                                      &local->active_txqs_old);
-                       spin_unlock_bh(&sta->lock);
-                       goto begin;
-               }
-               spin_unlock_bh(&sta->lock);
-       }
+       if (list_empty(&local->active_txqs))
+               goto out;
 
+       txqi = list_first_entry(&local->active_txqs,
+                               struct txq_info, schedule_order);
        list_del_init(&txqi->schedule_order);
 
 out: