This patch makes the truesize warning be printed when the truesize
actually changed, not just when the header was increased and the
additional size actually used.Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
---
It'll trigger with mac80211, should hold it until I fixed that.include/linux/skbuff.h | 8 ++++++--
net/core/skbuff.c | 10 ++++++++--
2 files changed, 14 insertions(+), 4 deletions(-)--- everything.orig/include/linux/skbuff.h 2008-05-03 15:47:00.000000000 +0200
+++ everything/include/linux/skbuff.h 2008-05-04 00:30:34.000000000 +0200
@@ -387,9 +387,13 @@ extern void skb_truesize_bug(strucstatic inline void skb_truesize_check(struct sk_buff *skb)
{
- int len = sizeof(struct sk_buff) + skb->len;
+#ifdef NET_SKBUFF_DATA_USES_OFFSET
+ int len = sizeof(struct sk_buff) + skb->end;
+#else
+ int len = sizeof(struct sk_buff) + (skb->end - skb->head);
+#endif- if (unlikely((int)skb->truesize < len))
+ if (unlikely((int)skb->truesize != len))
skb_truesize_bug(skb);
}--- everything.orig/net/core/skbuff.c 2008-05-03 16:29:23.000000000 +0200
+++ everything/net/core/skbuff.c 2008-05-04 00:31:32.000000000 +0200
@@ -151,9 +151,15 @@ void skb_under_panic(struct sk_buff *skbvoid skb_truesize_bug(struct sk_buff *skb)
{
+#ifdef NET_SKBUFF_DATA_USES_OFFSET
+ int len = sizeof(struct sk_buff) + skb->end;
+#else
+ int len = sizeof(struct sk_buff) + (skb->end - skb->head);
+#endif
+
printk(KERN_ERR "SKB BUG: Invalid truesize (%u) "
- "len=%u, sizeof(sk_buff)=%Zd\n",
- skb->truesize, skb->len, sizeof(struct sk_buff));
+ "size=%u, sizeof(sk_buff)=%Zd\n",
+ skb->truesize, len, sizeof(struct sk_buff));
}
EXPORT_SYMBOL(skb_truesize_bug);--
Umm, is this even correct? Should it check data_len? I seem to get the
truesize warning a bit now:[11381.081709] SKB BUG: Invalid truesize (16864) size=3D4112, sizeof(sk_buf=
f)=3D272
[11381.081725] last reallocate at:
[11381.081729] [<c0274194>] __alloc_skb+0xdc/0x140
[11381.081745] [<c02aeca8>] sk_stream_alloc_skb+0x38/0x134
[11381.081758] [<c02af16c>] tcp_sendmsg+0x3c8/0xcbc
[11381.081767] [<c026bcc4>] sock_sendmsg+0xac/0xe4
[11381.081780] [<c026c058>] sys_sendto+0xbc/0xec
[11381.081790] [<c026cbc8>] sys_socketcall+0x14c/0x1dc
[11381.081800] [<c00124cc>] ret_from_syscall+0x0/0x38johannes
It must check data_len.
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
I figured. Just add it?
johannes
With all the patches I posted it now no longer triggers with mac80211
but within netlink, e.g.:[ 152.607800] SKB BUG: Invalid truesize (556) size=560, sizeof(sk_buff)=272
[ 152.607805] last reallocate at:
[ 152.607807] [<00000000>] 0x0
[ 152.607822] [<c02735ec>] pskb_expand_head+0xa4/0x1f8
[ 152.607828] [<c0296a9c>] netlink_broadcast+0xb0/0x42c
[ 152.607834] [<c0297680>] nlmsg_notify+0x4c/0xc8
[ 152.607838] [<c0287518>] rtnl_notify+0x30/0x40
[ 152.607843] [<c0320e68>] wireless_nlevent_process+0x28/0x60
[ 152.607851] [<c0035058>] tasklet_action+0x74/0xec
[ 152.607858] [<c0035964>] __do_softirq+0x8c/0xfc
[ 152.607863] [<c0006e40>] do_softirq+0x58/0x5c
[ 152.607869] [<c0035738>] ksoftirqd+0x7c/0x178
[ 152.607874] [<c0047944>] kthread+0x50/0x88
[ 152.607879] [<c0012310>] kernel_thread+0x44/0x60below patch helps debug it, but I can't fix it all right now.
It most likely is a consequence of pskb_expand_head() not updating
truesize and some, but not all, callers doing it. IMHO pskb_expand_head
should do it and those callers that do it be changed to not (afaik it's
afpacket or something and mac80211 now)johannes
---
include/linux/skbuff.h | 12 ++++++++++++
kernel/stacktrace.c | 3 +++
net/Kconfig | 12 ++++++++++++
net/core/skbuff.c | 37 +++++++++++++++++++++++++++++++++++++
4 files changed, 64 insertions(+)--- everything.orig/include/linux/skbuff.h 2008-05-04 23:31:31.000000000 +0200
+++ everything/include/linux/skbuff.h 2008-05-04 23:35:21.000000000 +0200
@@ -28,6 +28,7 @@
#include <linux/rcupdate.h>
#include <linux/dmaengine.h>
#include <linux/hrtimer.h>
+#include <linux/stacktrace.h>#define HAVE_ALLOC_SKB /* For the drivers to know */
#define HAVE_ALIGNABLE_SKB /* Ditto 8) */
@@ -188,6 +189,8 @@ enum {
#define NET_SKBUFF_DATA_USES_OFFSET 1
#endif+#define NET_SKBUFF_STACKTRACE_ENTRIES 20
...
| Tarkan Erimer | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Mike Travis | [RFC 00/15] x86_64: Optimize percpu accesses |
| Dave Jones | agp / cpufreq. |
| Willy Tarreau | Re: [PATCH] tcp: splice as many packets as possible at once |
| Gerrit Renker | [PATCH 14/37] dccp: Tidy up setsockopt calls |
| David Miller | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Natalie Protasevich | [BUG] New Kernel Bugs |
git: | |
