Changeset 34133


Ignore:
Timestamp:
2012-11-10T03:47:33+01:00 (5 years ago)
Author:
nbd
Message:

mac80211: add more tx skb free fixes (hopefully final fix to #11894)

Location:
trunk/package/mac80211/patches
Files:
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/300-pending_work.patch

    r34030 r34133  
    108108        /* 
    109109         * set_multicast_list will be invoked by the networking core 
     110@@ -849,7 +826,7 @@ static void ieee80211_do_stop(struct iee 
     111                        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
     112                        if (info->control.vif == &sdata->vif) { 
     113                                __skb_unlink(skb, &local->pending[i]); 
     114-                               dev_kfree_skb_irq(skb); 
     115+                               ieee80211_free_txskb(&local->hw, skb); 
     116                        } 
     117                } 
     118        } 
    110119@@ -997,6 +974,72 @@ static void ieee80211_if_setup(struct ne 
    111120        dev->destructor = free_netdev; 
     
    258267--- a/net/mac80211/status.c 
    259268+++ b/net/mac80211/status.c 
     269@@ -34,7 +34,7 @@ void ieee80211_tx_status_irqsafe(struct  
     270                skb_queue_len(&local->skb_queue_unreliable); 
     271        while (tmp > IEEE80211_IRQSAFE_QUEUE_LIMIT && 
     272               (skb = skb_dequeue(&local->skb_queue_unreliable))) { 
     273-               dev_kfree_skb_irq(skb); 
     274+               ieee80211_free_txskb(hw, skb); 
     275                tmp--; 
     276                I802_DEBUG_INC(local->tx_status_drop); 
     277        } 
     278@@ -159,7 +159,7 @@ static void ieee80211_handle_filtered_fr 
     279                           "dropped TX filtered frame, queue_len=%d PS=%d @%lu\n", 
     280                           skb_queue_len(&sta->tx_filtered[ac]), 
     281                           !!test_sta_flag(sta, WLAN_STA_PS_STA), jiffies); 
     282-       dev_kfree_skb(skb); 
     283+       ieee80211_free_txskb(&local->hw, skb); 
     284 } 
     285  
     286 static void ieee80211_check_pending_bar(struct sta_info *sta, u8 *addr, u8 tid) 
    260287@@ -324,6 +324,75 @@ static void ieee80211_add_tx_radiotap_he 
    261288  
     
    386413        /* this was a transmitted frame, but now we want to reuse it */ 
    387414        skb_orphan(skb); 
    388 @@ -634,25 +660,8 @@ EXPORT_SYMBOL(ieee80211_report_low_ack); 
     415@@ -634,25 +660,17 @@ EXPORT_SYMBOL(ieee80211_report_low_ack); 
    389416 void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb) 
    390417 { 
     
    413440 } 
    414441 EXPORT_SYMBOL(ieee80211_free_txskb); 
     442+ 
     443+void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, 
     444+                             struct sk_buff_head *skbs) 
     445+{ 
     446+       struct sk_buff *skb; 
     447+ 
     448+       while ((skb = __skb_dequeue(skbs))) 
     449+               ieee80211_free_txskb(hw, skb); 
     450+} 
    415451--- a/drivers/net/wireless/p54/main.c 
    416452+++ b/drivers/net/wireless/p54/main.c 
     
    631667--- a/net/mac80211/sta_info.c 
    632668+++ b/net/mac80211/sta_info.c 
     669@@ -585,7 +585,7 @@ static bool sta_info_cleanup_expire_buff 
     670                 */ 
     671                if (!skb) 
     672                        break; 
     673-               dev_kfree_skb(skb); 
     674+               ieee80211_free_txskb(&local->hw, skb); 
     675        } 
     676  
     677        /* 
     678@@ -614,7 +614,7 @@ static bool sta_info_cleanup_expire_buff 
     679                local->total_ps_buffered--; 
     680                ps_dbg(sta->sdata, "Buffered frame expired (STA %pM)\n", 
     681                       sta->sta.addr); 
     682-               dev_kfree_skb(skb); 
     683+               ieee80211_free_txskb(&local->hw, skb); 
     684        } 
     685  
     686        /* 
    633687@@ -674,7 +674,7 @@ int __must_check __sta_info_destroy(stru 
    634688         * will be sufficient. 
     
    640694        ret = sta_info_hash_del(local, sta); 
    641695        if (ret) 
     696@@ -730,8 +730,8 @@ int __must_check __sta_info_destroy(stru 
     697  
     698        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 
     699                local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); 
     700-               __skb_queue_purge(&sta->ps_tx_buf[ac]); 
     701-               __skb_queue_purge(&sta->tx_filtered[ac]); 
     702+               ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]); 
     703+               ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]); 
     704        } 
     705  
     706 #ifdef CONFIG_MAC80211_MESH 
     707@@ -765,7 +765,7 @@ int __must_check __sta_info_destroy(stru 
     708                tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); 
     709                if (!tid_tx) 
     710                        continue; 
     711-               __skb_queue_purge(&tid_tx->pending); 
     712+               ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending); 
     713                kfree(tid_tx); 
     714        } 
     715  
    642716--- a/drivers/net/wireless/ath/ath5k/phy.c 
    643717+++ b/drivers/net/wireless/ath/ath5k/phy.c 
     
    675749        u8 num_of_quiet_elem;   /* can be more the one */ 
    676750        u8 timeout_int_len; 
     751@@ -1318,6 +1317,8 @@ netdev_tx_t ieee80211_monitor_start_xmit 
     752                                         struct net_device *dev); 
     753 netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, 
     754                                       struct net_device *dev); 
     755+void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, 
     756+                             struct sk_buff_head *skbs); 
     757  
     758 /* HT */ 
     759 void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, 
    677760--- a/net/mac80211/util.c 
    678761+++ b/net/mac80211/util.c 
     762@@ -406,7 +406,7 @@ void ieee80211_add_pending_skb(struct ie 
     763        int queue = info->hw_queue; 
     764  
     765        if (WARN_ON(!info->control.vif)) { 
     766-               kfree_skb(skb); 
     767+               ieee80211_free_txskb(&local->hw, skb); 
     768                return; 
     769        } 
     770  
     771@@ -431,7 +431,7 @@ void ieee80211_add_pending_skbs_fn(struc 
     772                struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
     773  
     774                if (WARN_ON(!info->control.vif)) { 
     775-                       kfree_skb(skb); 
     776+                       ieee80211_free_txskb(&local->hw, skb); 
     777                        continue; 
     778                } 
     779  
    679780@@ -792,8 +792,11 @@ u32 ieee802_11_parse_elems_crc(u8 *start 
    680781                        elems->country_elem_len = elen; 
     
    787888                break; 
    788889        default: 
     890--- a/net/mac80211/tx.c 
     891+++ b/net/mac80211/tx.c 
     892@@ -354,7 +354,7 @@ static void purge_old_ps_buffers(struct  
     893                        total += skb_queue_len(&sta->ps_tx_buf[ac]); 
     894                        if (skb) { 
     895                                purged++; 
     896-                               dev_kfree_skb(skb); 
     897+                               ieee80211_free_txskb(&local->hw, skb); 
     898                                break; 
     899                        } 
     900                } 
     901@@ -466,7 +466,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee 
     902                        ps_dbg(tx->sdata, 
     903                               "STA %pM TX buffer for AC %d full - dropping oldest frame\n", 
     904                               sta->sta.addr, ac); 
     905-                       dev_kfree_skb(old); 
     906+                       ieee80211_free_txskb(&local->hw, old); 
     907                } else 
     908                        tx->local->total_ps_buffered++; 
     909  
     910@@ -1103,7 +1103,7 @@ static bool ieee80211_tx_prep_agg(struct 
     911                spin_unlock(&tx->sta->lock); 
     912  
     913                if (purge_skb) 
     914-                       dev_kfree_skb(purge_skb); 
     915+                       ieee80211_free_txskb(&tx->local->hw, purge_skb); 
     916        } 
     917  
     918        /* reset session timer */ 
     919@@ -1214,7 +1214,7 @@ static bool ieee80211_tx_frags(struct ie 
     920 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG 
     921                if (WARN_ON_ONCE(q >= local->hw.queues)) { 
     922                        __skb_unlink(skb, skbs); 
     923-                       dev_kfree_skb(skb); 
     924+                       ieee80211_free_txskb(&local->hw, skb); 
     925                        continue; 
     926                } 
     927 #endif 
     928@@ -1356,9 +1356,9 @@ static int invoke_tx_handlers(struct iee 
     929        if (unlikely(res == TX_DROP)) { 
     930                I802_DEBUG_INC(tx->local->tx_handlers_drop); 
     931                if (tx->skb) 
     932-                       dev_kfree_skb(tx->skb); 
     933+                       ieee80211_free_txskb(&tx->local->hw, tx->skb); 
     934                else 
     935-                       __skb_queue_purge(&tx->skbs); 
     936+                       ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); 
     937                return -1; 
     938        } else if (unlikely(res == TX_QUEUED)) { 
     939                I802_DEBUG_INC(tx->local->tx_handlers_queued); 
     940@@ -1393,7 +1393,7 @@ static bool ieee80211_tx(struct ieee8021 
     941        res_prepare = ieee80211_tx_prepare(sdata, &tx, skb); 
     942  
     943        if (unlikely(res_prepare == TX_DROP)) { 
     944-               dev_kfree_skb(skb); 
     945+               ieee80211_free_txskb(&local->hw, skb); 
     946                goto out; 
     947        } else if (unlikely(res_prepare == TX_QUEUED)) { 
     948                goto out; 
     949@@ -1465,7 +1465,7 @@ void ieee80211_xmit(struct ieee80211_sub 
     950        headroom = max_t(int, 0, headroom); 
     951  
     952        if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) { 
     953-               dev_kfree_skb(skb); 
     954+               ieee80211_free_txskb(&local->hw, skb); 
     955                rcu_read_unlock(); 
     956                return; 
     957        } 
     958@@ -2056,8 +2056,10 @@ netdev_tx_t ieee80211_subif_start_xmit(s 
     959                head_need += IEEE80211_ENCRYPT_HEADROOM; 
     960                head_need += local->tx_headroom; 
     961                head_need = max_t(int, 0, head_need); 
     962-               if (ieee80211_skb_resize(sdata, skb, head_need, true)) 
     963-                       goto fail; 
     964+               if (ieee80211_skb_resize(sdata, skb, head_need, true)) { 
     965+                       ieee80211_free_txskb(&local->hw, skb); 
     966+                       return NETDEV_TX_OK; 
     967+               } 
     968        } 
     969  
     970        if (encaps_data) { 
     971@@ -2124,10 +2126,13 @@ netdev_tx_t ieee80211_subif_start_xmit(s 
     972  */ 
     973 void ieee80211_clear_tx_pending(struct ieee80211_local *local) 
     974 { 
     975+       struct sk_buff *skb; 
     976        int i; 
     977  
     978-       for (i = 0; i < local->hw.queues; i++) 
     979-               skb_queue_purge(&local->pending[i]); 
     980+       for (i = 0; i < local->hw.queues; i++) { 
     981+               while ((skb = skb_dequeue(&local->pending[i])) != NULL) 
     982+                       ieee80211_free_txskb(&local->hw, skb); 
     983+       } 
     984 } 
     985  
     986 /* 
     987@@ -2190,7 +2195,7 @@ void ieee80211_tx_pending(unsigned long  
     988                        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
     989  
     990                        if (WARN_ON(!info->control.vif)) { 
     991-                               kfree_skb(skb); 
     992+                               ieee80211_free_txskb(&local->hw, skb); 
     993                                continue; 
     994                        } 
     995  
  • trunk/package/mac80211/patches/550-mac80211_optimize_mcs_rate_mask.patch

    r33635 r34133  
    7070                    tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT || 
    7171                    tx->sdata->vif.type == NL80211_IFTYPE_ADHOC); 
    72 @@ -2449,8 +2451,6 @@ struct sk_buff *ieee80211_beacon_get_tim 
     72@@ -2452,8 +2454,6 @@ struct sk_buff *ieee80211_beacon_get_tim 
    7373                txrc.max_rate_idx = -1; 
    7474        else 
Note: See TracChangeset for help on using the changeset viewer.