forked from luck/tmp_suning_uos_patched
[INET]: Fix truesize setting in ip_append_data
As it is ip_append_data only counts page fragments to the skb that allocated it. As such it means that the first skb gets hit with a 4K charge even though it might have only used a fraction of it while all subsequent skb's that use the same page gets away with no charge at all. This bug was exposed by the UDP accounting patch. [ The wmem_alloc bumping needs to be moved with the truesize, noticed by Takahiro Yasui. -DaveM ] Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ff4b950277
commit
f945fa7ad9
|
@ -1016,8 +1016,6 @@ int ip_append_data(struct sock *sk,
|
|||
|
||||
skb_fill_page_desc(skb, i, page, 0, 0);
|
||||
frag = &skb_shinfo(skb)->frags[i];
|
||||
skb->truesize += PAGE_SIZE;
|
||||
atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc);
|
||||
} else {
|
||||
err = -EMSGSIZE;
|
||||
goto error;
|
||||
|
@ -1030,6 +1028,8 @@ int ip_append_data(struct sock *sk,
|
|||
frag->size += copy;
|
||||
skb->len += copy;
|
||||
skb->data_len += copy;
|
||||
skb->truesize += copy;
|
||||
atomic_add(copy, &sk->sk_wmem_alloc);
|
||||
}
|
||||
offset += copy;
|
||||
length -= copy;
|
||||
|
|
|
@ -1316,8 +1316,6 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
|
||||
skb_fill_page_desc(skb, i, page, 0, 0);
|
||||
frag = &skb_shinfo(skb)->frags[i];
|
||||
skb->truesize += PAGE_SIZE;
|
||||
atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc);
|
||||
} else {
|
||||
err = -EMSGSIZE;
|
||||
goto error;
|
||||
|
@ -1330,6 +1328,8 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
frag->size += copy;
|
||||
skb->len += copy;
|
||||
skb->data_len += copy;
|
||||
skb->truesize += copy;
|
||||
atomic_add(copy, &sk->sk_wmem_alloc);
|
||||
}
|
||||
offset += copy;
|
||||
length -= copy;
|
||||
|
|
Loading…
Reference in New Issue
Block a user