aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/tx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-02-05 10:55:21 +0100
committerJohannes Berg <johannes.berg@intel.com>2013-03-07 14:32:18 +0100
commit560d268220d3416a2d473bcc906ea2ccbf51e4ec (patch)
tree4cc83a5346d70fc14ec1874d9ad5c9714b64a0a0 /net/mac80211/tx.c
parentmac80211: init mesh timer for user authed STAs (diff)
downloadlinux-dev-560d268220d3416a2d473bcc906ea2ccbf51e4ec.tar.xz
linux-dev-560d268220d3416a2d473bcc906ea2ccbf51e4ec.zip
mac80211: provide race-free 64-bit traffic counters
Make the TX bytes/packets counters race-free by keeping them per AC so concurrent TX on queues can't cause lost or wrong updates. This works since each station belongs to a single interface. While at it also make the bytes counters 64-bit. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r--net/mac80211/tx.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 8914d2d2881a..3fcdf2118101 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -991,15 +991,18 @@ static ieee80211_tx_result debug_noinline
ieee80211_tx_h_stats(struct ieee80211_tx_data *tx)
{
struct sk_buff *skb;
+ int ac = -1;
if (!tx->sta)
return TX_CONTINUE;
- tx->sta->tx_packets++;
skb_queue_walk(&tx->skbs, skb) {
+ ac = skb_get_queue_mapping(skb);
tx->sta->tx_fragments++;
- tx->sta->tx_bytes += skb->len;
+ tx->sta->tx_bytes[ac] += skb->len;
}
+ if (ac >= 0)
+ tx->sta->tx_packets[ac]++;
return TX_CONTINUE;
}