mac80211: improve performance a bit
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 11 Mar 2010 15:30:37 +0000 (15:30 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 11 Mar 2010 15:30:37 +0000 (15:30 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@20145 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/mac80211/patches/580-tx_status_optimization.patch [new file with mode: 0644]

diff --git a/package/mac80211/patches/580-tx_status_optimization.patch b/package/mac80211/patches/580-tx_status_optimization.patch
new file mode 100644 (file)
index 0000000..34eeff2
--- /dev/null
@@ -0,0 +1,48 @@
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -171,7 +171,7 @@ void ieee80211_tx_status(struct ieee8021
+       struct net_device *prev_dev = NULL;
+       struct sta_info *sta, *tmp;
+       int retry_count = -1, i;
+-      bool injected;
++      bool send_to_cooked;
+       for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
+               /* the HW cannot have attempted that rate */
+@@ -296,11 +296,15 @@ void ieee80211_tx_status(struct ieee8021
+       /* this was a transmitted frame, but now we want to reuse it */
+       skb_orphan(skb);
++      /* Need to make a copy before skb->cb gets cleared */
++      send_to_cooked = !!(info->flags & IEEE80211_TX_CTL_INJECTED) ||
++                      (type != IEEE80211_FTYPE_DATA);
++
+       /*
+        * This is a bit racy but we can avoid a lot of work
+        * with this test...
+        */
+-      if (!local->monitors && !local->cooked_mntrs) {
++      if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
+               dev_kfree_skb(skb);
+               return;
+       }
+@@ -345,9 +349,6 @@ void ieee80211_tx_status(struct ieee8021
+       /* for now report the total retry_count */
+       rthdr->data_retries = retry_count;
+-      /* Need to make a copy before skb->cb gets cleared */
+-      injected = !!(info->flags & IEEE80211_TX_CTL_INJECTED);
+-
+       /* XXX: is this sufficient for BPF? */
+       skb_set_mac_header(skb, 0);
+       skb->ip_summed = CHECKSUM_UNNECESSARY;
+@@ -362,8 +363,7 @@ void ieee80211_tx_status(struct ieee8021
+                               continue;
+                       if ((sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) &&
+-                          !injected &&
+-                          (type == IEEE80211_FTYPE_DATA))
++                          !send_to_cooked)
+                               continue;
+                       if (prev_dev) {