Massimo Cetra a écrit :
David Miller ha scritto:
quoted
From: "Rafael J. Wysocki" <redacted>
Date: Mon, 12 Oct 2009 00:22:04 +0200 (CEST)
quoted
Bug-Entry : http://bugzilla.kernel.org/show_bug.cgi?id=14378
Subject : Problems with net/core/skbuff.c
Submitter : Massimo Cetra [off-list ref]
Date : 2009-10-08 14:51 (4 days old)
References : http://marc.info/?l=linux-kernel&m=125501488220358&w=4
I don't know what to do about this one.
The user indicates that they have the vserver patches applied,
so maybe there is some interaction with that stuff.
Actually i found another oops which is very similar to the previous one.
Here, vserver is not involved, and the problem starts at drbd which
lives in kernel space (the other oops started at ocfs2).
Both ocfs2 and drbd make heavy use of network I/O so i guess the problem
is something in the network layer.
Anything i can do to help to debugging and solving this issue ?
Thanks
Max
Problem is kfree_skb() is called from irq context, wich is not allowed.
static void skb_release_head_state(struct sk_buff *skb)
{
...
if (skb->destructor) {
WARN_ON(in_irq());
skb->destructor();
}
...
}
virtio_net start_xmit() function calls free_old_xmit_skbs() and
free_old_xmit_skbs() ultimately calls kfree_skb()
Quick fix would be to use dev_kfree_skb_any() instead,
because netpoll can definitly calls start_xmit()
with irq disabled.
Could you please following patch ?
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 8d00976..54bf091 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -454,7 +454,7 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)
vi->dev->stats.tx_bytes += skb->len;
vi->dev->stats.tx_packets++;
tot_sgs += skb_vnet_hdr(skb)->num_sg;
- kfree_skb(skb);
+ dev_kfree_skb_any(skb);
}
return tot_sgs;
}