diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2009-09-24 11:59:17 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2009-09-23 20:29:18 -0400 |
commit | 2b5bbe3b8bee8b38bdc27dd9c0270829b6eb7eeb (patch) | |
tree | ae10e097de665aba47306799e9ab5ef44776e1e1 /drivers/net/virtio_net.c | |
parent | a724eada8c2a7b62463b73ccf73fd0bb6e928aeb (diff) |
virtio_net: skb_orphan() and nf_reset() in xmit path.
The complex transmit free logic was introduced to avoid hangs on
removing the ip_conntrack module and also because drivers aren't
generally supposed to keep stale skbs for unbounded times.
After some debate, it was decided that while doing skb_orphan()
generally is a rat's nest, we can do it in this driver. Following
patches take advantage of this.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r-- | drivers/net/virtio_net.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 5c498d2b043f..dc4c68718976 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -528,8 +528,12 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) | |||
528 | num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; | 528 | num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; |
529 | 529 | ||
530 | err = vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); | 530 | err = vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); |
531 | if (err >= 0 && !vi->free_in_tasklet) | 531 | if (err >= 0 && !vi->free_in_tasklet) { |
532 | /* Don't wait up for transmitted skbs to be freed. */ | ||
533 | skb_orphan(skb); | ||
534 | nf_reset(skb); | ||
532 | mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10)); | 535 | mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10)); |
536 | } | ||
533 | 537 | ||
534 | return err; | 538 | return err; |
535 | } | 539 | } |