Le lundi 21 novembre 2011 à 09:24 +0100, Markus Trippelsdorf a écrit : > On 2011.11.21 at 09:05 +0100, Markus Trippelsdorf wrote: > > On 2011.11.21 at 08:44 +0800, Alex,Shi wrote: > > > On Fri, 2011-11-18 at 20:02 +0800, Markus Trippelsdorf wrote: > > > > On 2011.11.18 at 09:54 +0100, Markus Trippelsdorf wrote: > > > > > On 2011.11.18 at 16:43 +0800, Alex,Shi wrote: > > > > > > > > > > > > > > > > The dirty flag comes from a bunch of unrelated xfs patches from Christoph, that > > > > > > > > I'm testing right now. > > > > > > > > > > > > Where is the xfs patchset? I am wondering if it is due to slub code. > > > > > > > > I begin to wonder if this might be the result of a compiler bug. > > > > The kernel in question was compiled with gcc version 4.7.0 20111117. And > > > > there was commit to the gcc repository today that looks suspicious: > > > > http://gcc.gnu.org/viewcvs?view=revision&revision=181466 > > > > > > > > > > Tell us if it is still there and you can reproduce it. > > > > Hm, just noticed the "3.2.0-rc1 panic on PowerPC" thread: > > http://thread.gmane.org/gmane.linux.kernel/1215584 > > > > The backtraces look suspiciously similar to mine. > > So everything points to commit 87fb4b7b533: > "net: more accurate skb truesize" > > Can you take a look Eric? This commit was followed by a fix (for SLOB, since SLUB/SLAB were not affected) Check commit bc417e30f8df (net: Add back alignment for size for __alloc_skb) If current kernel still crash, I believe there is a problem elsewhere (a refcounting problem) that makes underlying page being reused : The ksize(skb->head) call in pskb_expand_head() assumes skb->head is a valid zone, not an already freed one... By the way, we probably can remove (almost dead) code from pskb_expand_head() since we now place struct skb_shared_info at the end of skb->head at skb creation. I'll send this patch later for net-next diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 18a3ceb..5fd67a8 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -892,17 +892,6 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, fastpath = atomic_read(&skb_shinfo(skb)->dataref) == delta; } - if (fastpath && - size + sizeof(struct skb_shared_info) <= ksize(skb->head)) { - memmove(skb->head + size, skb_shinfo(skb), - offsetof(struct skb_shared_info, - frags[skb_shinfo(skb)->nr_frags])); - memmove(skb->head + nhead, skb->head, - skb_tail_pointer(skb) - skb->head); - off = nhead; - goto adjust_others; - } - data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask); if (!data) goto nodata; @@ -935,7 +924,6 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, off = (data + nhead) - skb->head; skb->head = data; -adjust_others: skb->data += off; #ifdef NET_SKBUFF_DATA_USES_OFFSET skb->end = size; -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>