mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
sch_cake: Correctly update parent qlen when splitting GSO packets
[ Upstream commit 8c6c37fdc2 ]
To ensure parent qdiscs have the same notion of the number of enqueued
packets even after splitting a GSO packet, update the qdisc tree with the
number of packets that was added due to the split.
Reported-by: Pete Heist <pete@heistp.net>
Tested-by: Pete Heist <pete@heistp.net>
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
36a2e9bf24
commit
146f563f97
|
|
@ -1666,7 +1666,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||
if (skb_is_gso(skb) && q->rate_flags & CAKE_FLAG_SPLIT_GSO) {
|
||||
struct sk_buff *segs, *nskb;
|
||||
netdev_features_t features = netif_skb_features(skb);
|
||||
unsigned int slen = 0;
|
||||
unsigned int slen = 0, numsegs = 0;
|
||||
|
||||
segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK);
|
||||
if (IS_ERR_OR_NULL(segs))
|
||||
|
|
@ -1682,6 +1682,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||
flow_queue_add(flow, segs);
|
||||
|
||||
sch->q.qlen++;
|
||||
numsegs++;
|
||||
slen += segs->len;
|
||||
q->buffer_used += segs->truesize;
|
||||
b->packets++;
|
||||
|
|
@ -1695,7 +1696,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||
sch->qstats.backlog += slen;
|
||||
q->avg_window_bytes += slen;
|
||||
|
||||
qdisc_tree_reduce_backlog(sch, 1, len);
|
||||
qdisc_tree_reduce_backlog(sch, 1-numsegs, len-slen);
|
||||
consume_skb(skb);
|
||||
} else {
|
||||
/* not splitting */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user