Changeset 44748


Ignore:
Timestamp:
2015-03-14T03:00:36+01:00 (3 years ago)
Author:
nbd
Message:

mac80211: improve powersave handling in the tx queue rework patch

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/package/kernel/mac80211/patches
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/kernel/mac80211/patches/300-mac80211-add-an-intermediate-software-queue-implemen.patch

    r44738 r44748  
    294294        } 
    295295  
    296 +       if (sta->txq) { 
     296+       if (sta->txqi) { 
    297297+               for (i = 0; i < IEEE80211_NUM_TIDS; i++) 
    298298+                       ieee80211_flush_tx_queue(local, sta->sta.txq[i]); 
     
    306306        sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr); 
    307307  
    308 +       kfree(sta->txq); 
     308+       kfree(sta->txqi); 
    309309        kfree(rcu_dereference_raw(sta->sta.rates)); 
    310310        kfree(sta); 
     
    340340+                       goto free; 
    341341+ 
    342 +               sta->txq = txq_data; 
     342+               sta->txqi = txq_data; 
    343343+               for (i = 0; i < IEEE80211_NUM_TIDS; i++) { 
    344344+                       struct txq_info *txq = txq_data + i * size; 
     
    368368+ 
    369369+free_txq: 
    370 +       kfree(sta->txq); 
     370+       kfree(sta->txqi); 
    371371+free: 
    372372+       kfree(sta); 
     
    375375  
    376376 static int sta_info_insert_check(struct sta_info *sta) 
     377@@ -640,6 +667,8 @@ static void __sta_info_recalc_tim(struct 
     378  
     379                indicate_tim |= 
     380                        sta->driver_buffered_tids & tids; 
     381+               indicate_tim |= 
     382+                       sta->txq_buffered_tids & tids; 
     383        } 
     384  
     385  done: 
     386@@ -1071,7 +1100,7 @@ void ieee80211_sta_ps_deliver_wakeup(str 
     387        struct ieee80211_sub_if_data *sdata = sta->sdata; 
     388        struct ieee80211_local *local = sdata->local; 
     389        struct sk_buff_head pending; 
     390-       int filtered = 0, buffered = 0, ac; 
     391+       int filtered = 0, buffered = 0, ac, i; 
     392        unsigned long flags; 
     393        struct ps_data *ps; 
     394  
     395@@ -1090,10 +1119,25 @@ void ieee80211_sta_ps_deliver_wakeup(str 
     396  
     397        BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1); 
     398        sta->driver_buffered_tids = 0; 
     399+       sta->txq_buffered_tids = 0; 
     400  
     401        if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS)) 
     402                drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta); 
     403  
     404+       if (sta->txqi) { 
     405+               for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { 
     406+                       struct txq_info *txqi; 
     407+ 
     408+                       txqi = container_of(sta->sta.txq[i], struct txq_info, 
     409+                                           txq); 
     410+ 
     411+                       if (!skb_queue_len(&txqi->queue)) 
     412+                               continue; 
     413+ 
     414+                       drv_wake_tx_queue(local, txqi); 
     415+               } 
     416+       } 
     417+ 
     418        skb_queue_head_init(&pending); 
     419  
     420        /* sync with ieee80211_tx_h_unicast_ps_buf */ 
     421@@ -1254,7 +1298,7 @@ ieee80211_sta_ps_deliver_response(struct 
     422        struct ieee80211_sub_if_data *sdata = sta->sdata; 
     423        struct ieee80211_local *local = sdata->local; 
     424        bool more_data = false; 
     425-       int ac; 
     426+       int ac, tid; 
     427        unsigned long driver_release_tids = 0; 
     428        struct sk_buff_head frames; 
     429  
     430@@ -1275,8 +1319,10 @@ ieee80211_sta_ps_deliver_response(struct 
     431                /* if we already have frames from software, then we can't also 
     432                 * release from hardware queues 
     433                 */ 
     434-               if (skb_queue_empty(&frames)) 
     435+               if (skb_queue_empty(&frames)) { 
     436                        driver_release_tids |= sta->driver_buffered_tids & tids; 
     437+                       driver_release_tids |= sta->txq_buffered_tids & tids; 
     438+               } 
     439  
     440                if (driver_release_tids) { 
     441                        /* If the driver has data on more than one TID then 
     442@@ -1447,6 +1493,8 @@ ieee80211_sta_ps_deliver_response(struct 
     443  
     444                sta_info_recalc_tim(sta); 
     445        } else { 
     446+               unsigned long tids = sta->txq_buffered_tids & driver_release_tids; 
     447+ 
     448                /* 
     449                 * We need to release a frame that is buffered somewhere in the 
     450                 * driver ... it'll have to handle that. 
     451@@ -1466,8 +1514,25 @@ ieee80211_sta_ps_deliver_response(struct 
     452                 * that the TID(s) became empty before returning here from the 
     453                 * release function. 
     454                 * Either way, however, when the driver tells us that the TID(s) 
     455-                * became empty we'll do the TIM recalculation. 
     456+                * became empty or we find that a txq became empty, we'll do the 
     457+                * TIM recalculation. 
     458                 */ 
     459+ 
     460+               if (!sta->txqi) 
     461+                       return; 
     462+ 
     463+               for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) { 
     464+                       struct txq_info *txqi; 
     465+ 
     466+                       txqi = container_of(sta->sta.txq[tid], struct txq_info, 
     467+                                           txq); 
     468+ 
     469+                       if (!(tids & BIT(tid)) || skb_queue_len(&txqi->queue)) 
     470+                               continue; 
     471+ 
     472+                       sta_info_recalc_tim(sta); 
     473+                       break; 
     474+               } 
     475        } 
     476 } 
     477  
    377478--- a/net/mac80211/sta_info.h 
    378479+++ b/net/mac80211/sta_info.h 
    379 @@ -368,6 +368,7 @@ struct sta_info { 
     480@@ -274,6 +274,7 @@ struct sta_ampdu_mlme { 
     481  *     entered power saving state, these are also delivered to 
     482  *     the station when it leaves powersave or polls for frames 
     483  * @driver_buffered_tids: bitmap of TIDs the driver has data buffered on 
     484+ * @txq_buffered_tids: bitmap of TIDs that mac80211 has txq data buffered on 
     485  * @rx_packets: Number of MSDUs received from this STA 
     486  * @rx_bytes: Number of bytes received from this STA 
     487  * @last_rx: time (in jiffies) when last frame was received from this STA 
     488@@ -368,6 +369,8 @@ struct sta_info { 
    380489        struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; 
    381490        struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; 
    382491        unsigned long driver_buffered_tids; 
    383 +       struct txq_info *txq; 
     492+       unsigned long txq_buffered_tids; 
     493+       struct txq_info *txqi; 
    384494  
    385495        /* Updated from RX path only, no locking requirements */ 
     
    430540--- a/net/mac80211/tx.c 
    431541+++ b/net/mac80211/tx.c 
    432 @@ -1201,13 +1201,76 @@ ieee80211_tx_prepare(struct ieee80211_su 
     542@@ -1201,13 +1201,80 @@ ieee80211_tx_prepare(struct ieee80211_su 
    433543        return TX_CONTINUE; 
    434544 } 
     
    441551+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; 
    442552+       struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 
     553+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    443554+       struct ieee80211_tx_control control = { 
    444555+               .sta = pubsta 
     
    447558+       struct txq_info *txqi; 
    448559+       u8 ac; 
     560+ 
     561+       if (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE) 
     562+               goto tx_normal; 
    449563+ 
    450564+       if (ieee80211_is_mgmt(hdr->frame_control) || 
     
    508622        unsigned long flags; 
    509623  
    510 @@ -1265,10 +1328,9 @@ static bool ieee80211_tx_frags(struct ie 
     624@@ -1265,10 +1332,9 @@ static bool ieee80211_tx_frags(struct ie 
    511625                spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 
    512626  
     
    571685+       atomic_sub(n, &sdata->txqs_len[txq->ac]); 
    572686+} 
     687--- a/net/mac80211/rx.c 
     688+++ b/net/mac80211/rx.c 
     689@@ -1176,6 +1176,7 @@ static void sta_ps_start(struct sta_info 
     690        struct ieee80211_sub_if_data *sdata = sta->sdata; 
     691        struct ieee80211_local *local = sdata->local; 
     692        struct ps_data *ps; 
     693+       int tid; 
     694  
     695        if (sta->sdata->vif.type == NL80211_IFTYPE_AP || 
     696            sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 
     697@@ -1189,6 +1190,20 @@ static void sta_ps_start(struct sta_info 
     698                drv_sta_notify(local, sdata, STA_NOTIFY_SLEEP, &sta->sta); 
     699        ps_dbg(sdata, "STA %pM aid %d enters power save mode\n", 
     700               sta->sta.addr, sta->sta.aid); 
     701+ 
     702+       if (!sta->txqi) 
     703+               return; 
     704+ 
     705+       for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) { 
     706+               struct txq_info *txqi; 
     707+ 
     708+               txqi = container_of(sta->sta.txq[tid], struct txq_info, txq); 
     709+ 
     710+               if (!skb_queue_len(&txqi->queue)) 
     711+                       set_bit(tid, &sta->txq_buffered_tids); 
     712+               else 
     713+                       clear_bit(tid, &sta->txq_buffered_tids); 
     714+       } 
     715 } 
     716  
     717 static void sta_ps_end(struct sta_info *sta) 
  • trunk/package/kernel/mac80211/patches/301-mac80211-lock-rate-control.patch

    r44655 r44748  
    116116--- a/net/mac80211/sta_info.h 
    117117+++ b/net/mac80211/sta_info.h 
    118 @@ -348,6 +348,7 @@ struct sta_info { 
     118@@ -349,6 +349,7 @@ struct sta_info { 
    119119        u8 ptk_idx; 
    120120        struct rate_control_ref *rate_ctrl; 
Note: See TracChangeset for help on using the changeset viewer.