diff options
Diffstat (limited to 'package/madwifi/patches/342-performance.patch')
-rw-r--r-- | package/madwifi/patches/342-performance.patch | 263 |
1 files changed, 0 insertions, 263 deletions
diff --git a/package/madwifi/patches/342-performance.patch b/package/madwifi/patches/342-performance.patch deleted file mode 100644 index 88cec182dd..0000000000 --- a/package/madwifi/patches/342-performance.patch +++ /dev/null @@ -1,263 +0,0 @@ ---- a/ath/if_ath.c -+++ b/ath/if_ath.c -@@ -3239,7 +3239,6 @@ ath_hardstart(struct sk_buff *skb, struc - struct ath_softc *sc = dev->priv; - struct ieee80211_node *ni = NULL; - struct ath_buf *bf = NULL; -- struct ether_header *eh; - ath_bufhead bf_head; - struct ath_buf *tbf, *tempbf; - struct sk_buff *tskb; -@@ -3251,6 +3250,7 @@ ath_hardstart(struct sk_buff *skb, struc - */ - int requeue = 0; - #ifdef ATH_SUPERG_FF -+ struct ether_header *eh; - unsigned int pktlen; - struct ieee80211com *ic = &sc->sc_ic; - struct ath_node *an; -@@ -3316,27 +3316,9 @@ ath_hardstart(struct sk_buff *skb, struc - requeue = 1; - goto hardstart_fail; - } --#endif - -- /* If the skb data is shared, we will copy it so we can strip padding -- * without affecting any other bridge ports. */ -- if (skb_cloned(skb)) { -- /* Remember the original SKB so we can free up our references */ -- struct sk_buff *skb_new; -- skb_new = skb_copy(skb, GFP_ATOMIC); -- if (skb_new == NULL) { -- DPRINTF(sc, ATH_DEBUG_XMIT, -- "Dropping; skb_copy failure.\n"); -- /* No free RAM, do not requeue! */ -- goto hardstart_fail; -- } -- ieee80211_skb_copy_noderef(skb, skb_new); -- ieee80211_dev_kfree_skb(&skb); -- skb = skb_new; -- } - eh = (struct ether_header *)skb->data; - --#ifdef ATH_SUPERG_FF - /* NB: use this lock to protect an->an_tx_ffbuf (and txq->axq_stageq) - * in athff_can_aggregate() call too. */ - ATH_TXQ_LOCK_IRQ(txq); ---- a/net80211/ieee80211_output.c -+++ b/net80211/ieee80211_output.c -@@ -283,7 +283,7 @@ ieee80211_hardstart(struct sk_buff *skb, - * normal vap. */ - if (vap->iv_xrvap && (ni == vap->iv_bss) && - vap->iv_xrvap->iv_sta_assoc) { -- struct sk_buff *skb1 = skb_copy(skb, GFP_ATOMIC); -+ struct sk_buff *skb1 = skb_clone(skb, GFP_ATOMIC); - if (skb1) { - memset(SKB_CB(skb1), 0, sizeof(struct ieee80211_cb)); - #ifdef IEEE80211_DEBUG_REFCNT -@@ -566,7 +566,7 @@ ieee80211_skbhdr_adjust(struct ieee80211 - struct ieee80211_key *key, struct sk_buff *skb, int ismulticast) - { - /* XXX pre-calculate per node? */ -- int need_headroom = LLC_SNAPFRAMELEN + hdrsize + IEEE80211_ADDR_LEN; -+ int need_headroom = LLC_SNAPFRAMELEN + hdrsize; - int need_tailroom = 0; - #ifdef ATH_SUPERG_FF - int isff = ATH_FF_MAGIC_PRESENT(skb); -@@ -608,109 +608,56 @@ ieee80211_skbhdr_adjust(struct ieee80211 - need_tailroom += cip->ic_miclen; - } - -- if (skb_shared(skb)) { -- /* Take our own reference to the node in the clone */ -- ieee80211_ref_node(SKB_CB(skb)->ni); -- /* Unshare the node, decrementing users in the old skb */ -- skb = skb_unshare(skb, GFP_ATOMIC); -- } -+ need_headroom -= skb_headroom(skb); -+ if (isff) -+ need_tailroom -= skb_tailroom(skb2); -+ else -+ need_tailroom -= skb_tailroom(skb); -+ -+ if (need_headroom < 0) -+ need_headroom = 0; -+ if (need_tailroom < 0) -+ need_tailroom = 0; - --#ifdef ATH_SUPERG_FF -- if (isff) { -- if (skb == NULL) { -- IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -- "%s: cannot unshare for encapsulation\n", -- __func__); -- vap->iv_stats.is_tx_nobuf++; -- ieee80211_dev_kfree_skb(&skb2); -+ if (skb_cloned(skb) || (need_headroom > 0) || -+ (!isff && (need_tailroom > 0))) { - -- return NULL; -+ if (pskb_expand_head(skb, need_headroom, need_tailroom, GFP_ATOMIC)) { -+ IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -+ "%s: cannot expand storage (tail)\n", __func__); -+ goto error; - } -+ } - -- /* first skb header */ -- if (skb_headroom(skb) < need_headroom) { -- struct sk_buff *tmp = skb; -- skb = skb_realloc_headroom(skb, need_headroom); -- if (skb == NULL) { -- IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -- "%s: cannot expand storage (head1)\n", -- __func__); -- vap->iv_stats.is_tx_nobuf++; -- ieee80211_dev_kfree_skb(&skb2); -- return NULL; -- } else -- ieee80211_skb_copy_noderef(tmp, skb); -- ieee80211_dev_kfree_skb(&tmp); -- /* NB: cb[] area was copied, but not next ptr. must do that -- * prior to return on success. */ -- } -+#ifdef ATH_SUPERG_FF -+ if (isff) { -+ inter_headroom -= skb_headroom(skb2); -+ if (inter_headroom < 0) -+ inter_headroom = 0; -+ if ((skb_cloned(skb2) || -+ (inter_headroom > 0) || (need_tailroom > 0))) { - -- /* second skb with header and tail adjustments possible */ -- if (skb_tailroom(skb2) < need_tailroom) { -- int n = 0; -- if (inter_headroom > skb_headroom(skb2)) -- n = inter_headroom - skb_headroom(skb2); -- if (pskb_expand_head(skb2, n, -- need_tailroom - skb_tailroom(skb2), GFP_ATOMIC)) { -- ieee80211_dev_kfree_skb(&skb2); -+ if (pskb_expand_head(skb2, inter_headroom, -+ need_tailroom, GFP_ATOMIC)) { - IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -- "%s: cannot expand storage (tail2)\n", -- __func__); -- vap->iv_stats.is_tx_nobuf++; -- /* this shouldn't happen, but don't send first ff either */ -- ieee80211_dev_kfree_skb(&skb); -+ "%s: cannot expand storage (tail)\n", __func__); -+ goto error; - } -- } else if (skb_headroom(skb2) < inter_headroom) { -- struct sk_buff *tmp = skb2; -- -- skb2 = skb_realloc_headroom(skb2, inter_headroom); -- if (skb2 == NULL) { -- IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -- "%s: cannot expand storage (head2)\n", -- __func__); -- vap->iv_stats.is_tx_nobuf++; -- /* this shouldn't happen, but don't send first ff either */ -- ieee80211_dev_kfree_skb(&skb); -- skb = NULL; -- } else -- ieee80211_skb_copy_noderef(tmp, skb); -- ieee80211_dev_kfree_skb(&tmp); -- } -- if (skb) { -- skb->next = skb2; - } -- return skb; -+ skb->next = skb2; - } - #endif /* ATH_SUPERG_FF */ -- if (skb == NULL) { -- IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -- "%s: cannot unshare for encapsulation\n", __func__); -- vap->iv_stats.is_tx_nobuf++; -- } else if (skb_tailroom(skb) < need_tailroom) { -- int n = 0; -- if (need_headroom > skb_headroom(skb)) -- n = need_headroom - skb_headroom(skb); -- if (pskb_expand_head(skb, n, need_tailroom - -- skb_tailroom(skb), GFP_ATOMIC)) { -- IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -- "%s: cannot expand storage (tail)\n", __func__); -- vap->iv_stats.is_tx_nobuf++; -- ieee80211_dev_kfree_skb(&skb); -- } -- } else if (skb_headroom(skb) < need_headroom) { -- struct sk_buff *tmp = skb; -- skb = skb_realloc_headroom(skb, need_headroom); -- /* Increment reference count after copy */ -- if (skb == NULL) { -- IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, -- "%s: cannot expand storage (head)\n", __func__); -- vap->iv_stats.is_tx_nobuf++; -- } else -- ieee80211_skb_copy_noderef(tmp, skb); -- ieee80211_dev_kfree_skb(&tmp); -- } - - return skb; -+ -+error: -+ vap->iv_stats.is_tx_nobuf++; -+ ieee80211_dev_kfree_skb(&skb); -+#ifdef ATH_SUPERG_FF -+ if (skb2) -+ ieee80211_dev_kfree_skb(&skb2); -+#endif -+ return NULL; - } - - #define KEY_UNDEFINED(k) ((k).wk_cipher == &ieee80211_cipher_none) ---- a/net80211/ieee80211_input.c -+++ b/net80211/ieee80211_input.c -@@ -204,7 +204,6 @@ ieee80211_input(struct ieee80211vap * va - struct ieee80211_frame *wh; - struct ieee80211_key *key; - struct ether_header *eh; -- struct sk_buff *skb2; - #ifdef ATH_SUPERG_FF - struct llc *llc; - #endif -@@ -244,20 +243,6 @@ ieee80211_input(struct ieee80211vap * va - vap->iv_stats.is_rx_tooshort++; - goto out; - } -- /* Clone the SKB... we assume somewhere in this driver that we 'own' -- * the skbuff passed into hard start and we do a lot of messing with it -- * but bridges under some cases will not clone for the first pass of skb -- * to a bridge port, but will then clone for subsequent ones. This is -- * odd behavior but it means that if we have trashed the skb we are given -- * then other ports get clones of the residual garbage. -- */ -- if ((skb2 = skb_copy(skb, GFP_ATOMIC)) == NULL) { -- vap->iv_devstats.tx_dropped++; -- goto out; -- } -- ieee80211_skb_copy_noderef(skb, skb2); -- ieee80211_dev_kfree_skb(&skb); -- skb = skb2; - - /* - * Bit of a cheat here, we use a pointer for a 3-address -@@ -738,7 +723,7 @@ ieee80211_input(struct ieee80211vap * va - /* ether_type must be length as FF frames are always LLC/SNAP encap'd */ - frame_len = ntohs(eh_tmp->ether_type); - -- skb1 = skb_copy(skb, GFP_ATOMIC); -+ skb1 = skb_clone(skb, GFP_ATOMIC); - if (skb1 == NULL) - goto err; - ieee80211_skb_copy_noderef(skb, skb1); -@@ -1137,7 +1122,7 @@ ieee80211_deliver_data(struct ieee80211_ - - if (ETHER_IS_MULTICAST(eh->ether_dhost) && !netif_queue_stopped(dev)) { - /* Create a SKB for the BSS to send out. */ -- skb1 = skb_copy(skb, GFP_ATOMIC); -+ skb1 = skb_clone(skb, GFP_ATOMIC); - if (skb1) - SKB_CB(skb1)->ni = ieee80211_ref_node(vap->iv_bss); - } |