aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_offload.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_offload.c')
-rw-r--r--net/ipv4/tcp_offload.c13
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) -