52 lines
1.6 KiB
Diff
52 lines
1.6 KiB
Diff
|
From: Johannes Berg <johannes.berg@intel.com>
|
||
|
Date: Thu, 30 Aug 2018 10:55:49 +0200
|
||
|
Subject: [PATCH] mac80211: always account for A-MSDU header changes
|
||
|
|
||
|
In the error path of changing the SKB headroom of the second
|
||
|
A-MSDU subframe, we would not account for the already-changed
|
||
|
length of the first frame that just got converted to be in
|
||
|
A-MSDU format and thus is a bit longer now.
|
||
|
|
||
|
Fix this by doing the necessary accounting.
|
||
|
|
||
|
It would be possible to reorder the operations, but that would
|
||
|
make the code more complex (to calculate the necessary pad),
|
||
|
and the headroom expansion should not fail frequently enough
|
||
|
to make that worthwhile.
|
||
|
|
||
|
Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support")
|
||
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||
|
Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||
|
---
|
||
|
|
||
|
--- a/net/mac80211/tx.c
|
||
|
+++ b/net/mac80211/tx.c
|
||
|
@@ -3232,7 +3232,7 @@ static bool ieee80211_amsdu_aggregate(st
|
||
|
|
||
|
if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) +
|
||
|
2 + pad))
|
||
|
- goto out;
|
||
|
+ goto out_recalc;
|
||
|
|
||
|
ret = true;
|
||
|
data = skb_push(skb, ETH_ALEN + 2);
|
||
|
@@ -3249,11 +3249,13 @@ static bool ieee80211_amsdu_aggregate(st
|
||
|
head->data_len += skb->len;
|
||
|
*frag_tail = skb;
|
||
|
|
||
|
- flow->backlog += head->len - orig_len;
|
||
|
- tin->backlog_bytes += head->len - orig_len;
|
||
|
-
|
||
|
- fq_recalc_backlog(fq, tin, flow);
|
||
|
+out_recalc:
|
||
|
+ if (head->len != orig_len) {
|
||
|
+ flow->backlog += head->len - orig_len;
|
||
|
+ tin->backlog_bytes += head->len - orig_len;
|
||
|
|
||
|
+ fq_recalc_backlog(fq, tin, flow);
|
||
|
+ }
|
||
|
out:
|
||
|
fq->memory_usage += head->truesize - orig_truesize;
|
||
|
|