diff options
Diffstat (limited to 'net/ipv4/tcp_offload.c')
-rw-r--r-- | net/ipv4/tcp_offload.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index a7a5583eab04..a2b68a108eae 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c | |||
@@ -18,6 +18,7 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb, | |||
18 | netdev_features_t features) | 18 | netdev_features_t features) |
19 | { | 19 | { |
20 | struct sk_buff *segs = ERR_PTR(-EINVAL); | 20 | struct sk_buff *segs = ERR_PTR(-EINVAL); |
21 | unsigned int sum_truesize = 0; | ||
21 | struct tcphdr *th; | 22 | struct tcphdr *th; |
22 | unsigned int thlen; | 23 | unsigned int thlen; |
23 | unsigned int seq; | 24 | unsigned int seq; |
@@ -104,13 +105,7 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb, | |||
104 | if (copy_destructor) { | 105 | if (copy_destructor) { |
105 | skb->destructor = gso_skb->destructor; | 106 | skb->destructor = gso_skb->destructor; |
106 | skb->sk = gso_skb->sk; | 107 | skb->sk = gso_skb->sk; |
107 | /* {tcp|sock}_wfree() use exact truesize accounting : | 108 | sum_truesize += skb->truesize; |
108 | * sum(skb->truesize) MUST be exactly be gso_skb->truesize | ||
109 | * So we account mss bytes of 'true size' for each segment. | ||
110 | * The last segment will contain the remaining. | ||
111 | */ | ||
112 | skb->truesize = mss; | ||
113 | gso_skb->truesize -= mss; | ||
114 | } | 109 | } |
115 | skb = skb->next; | 110 | skb = skb->next; |
116 | th = tcp_hdr(skb); | 111 | th = tcp_hdr(skb); |
@@ -127,7 +122,9 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb, | |||
127 | if (copy_destructor) { | 122 | if (copy_destructor) { |
128 | swap(gso_skb->sk, skb->sk); | 123 | swap(gso_skb->sk, skb->sk); |
129 | swap(gso_skb->destructor, skb->destructor); | 124 | swap(gso_skb->destructor, skb->destructor); |
130 | swap(gso_skb->truesize, skb->truesize); | 125 | sum_truesize += skb->truesize; |
126 | atomic_add(sum_truesize - gso_skb->truesize, | ||
127 | &skb->sk->sk_wmem_alloc); | ||
131 | } | 128 | } |
132 | 129 | ||
133 | delta = htonl(oldlen + (skb_tail_pointer(skb) - | 130 | delta = htonl(oldlen + (skb_tail_pointer(skb) - |