diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2008-01-23 01:39:26 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-23 06:11:43 -0500 |
commit | f945fa7ad9c12a3356a3de7fb2143ccc2f2c3bca (patch) | |
tree | 2dd386474d0ab5e728af671c2b2eafdacc099f09 /net | |
parent | ff4b950277b6534caab2b2b956dba6ce29757551 (diff) |
[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>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/ip_output.c | 4 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 4 |
2 files changed, 4 insertions, 4 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 480469b92aa..bc9e57550e8 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -1016,8 +1016,6 @@ alloc_new_skb: | |||
1016 | 1016 | ||
1017 | skb_fill_page_desc(skb, i, page, 0, 0); | 1017 | skb_fill_page_desc(skb, i, page, 0, 0); |
1018 | frag = &skb_shinfo(skb)->frags[i]; | 1018 | frag = &skb_shinfo(skb)->frags[i]; |
1019 | skb->truesize += PAGE_SIZE; | ||
1020 | atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc); | ||
1021 | } else { | 1019 | } else { |
1022 | err = -EMSGSIZE; | 1020 | err = -EMSGSIZE; |
1023 | goto error; | 1021 | goto error; |
@@ -1030,6 +1028,8 @@ alloc_new_skb: | |||
1030 | frag->size += copy; | 1028 | frag->size += copy; |
1031 | skb->len += copy; | 1029 | skb->len += copy; |
1032 | skb->data_len += copy; | 1030 | skb->data_len += copy; |
1031 | skb->truesize += copy; | ||
1032 | atomic_add(copy, &sk->sk_wmem_alloc); | ||
1033 | } | 1033 | } |
1034 | offset += copy; | 1034 | offset += copy; |
1035 | length -= copy; | 1035 | length -= copy; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 6338a9c1aa1..3bef30e4a23 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1316,8 +1316,6 @@ alloc_new_skb: | |||
1316 | 1316 | ||
1317 | skb_fill_page_desc(skb, i, page, 0, 0); | 1317 | skb_fill_page_desc(skb, i, page, 0, 0); |
1318 | frag = &skb_shinfo(skb)->frags[i]; | 1318 | frag = &skb_shinfo(skb)->frags[i]; |
1319 | skb->truesize += PAGE_SIZE; | ||
1320 | atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc); | ||
1321 | } else { | 1319 | } else { |
1322 | err = -EMSGSIZE; | 1320 | err = -EMSGSIZE; |
1323 | goto error; | 1321 | goto error; |
@@ -1330,6 +1328,8 @@ alloc_new_skb: | |||
1330 | frag->size += copy; | 1328 | frag->size += copy; |
1331 | skb->len += copy; | 1329 | skb->len += copy; |
1332 | skb->data_len += copy; | 1330 | skb->data_len += copy; |
1331 | skb->truesize += copy; | ||
1332 | atomic_add(copy, &sk->sk_wmem_alloc); | ||
1333 | } | 1333 | } |
1334 | offset += copy; | 1334 | offset += copy; |
1335 | length -= copy; | 1335 | length -= copy; |