aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-09-24 11:59:17 -0400
committerRusty Russell <rusty@rustcorp.com.au>2009-09-23 20:29:18 -0400
commit2b5bbe3b8bee8b38bdc27dd9c0270829b6eb7eeb (patch)
treeae10e097de665aba47306799e9ab5ef44776e1e1 /drivers/net
parenta724eada8c2a7b62463b73ccf73fd0bb6e928aeb (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')
-rw-r--r--drivers/net/virtio_net.c6
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}