diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2014-09-10 20:47:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-13 12:50:46 -0400 |
commit | a58354409a00f2d8f7882c6a91fde1df5d0a4bb8 (patch) | |
tree | a4ee23b8017e37b0f9b255fb8ddecf23eb55c5f6 /drivers/net/virtio_net.c | |
parent | 0fe13151beaf1853753339c677d1bb37e5dbff27 (diff) |
virtio_net: pass well-formed sgs to virtqueue_add_*()
This is the only driver which doesn't hand virtqueue_add_inbuf and
virtqueue_add_outbuf a well-formed, well-terminated sg. Fix it,
so we can make virtio_add_* simpler.
pktgen results:
modprobe pktgen
echo 'add_device eth0' > /proc/net/pktgen/kpktgend_0
echo nowait 1 > /proc/net/pktgen/eth0
echo count 1000000 > /proc/net/pktgen/eth0
echo clone_skb 100000 > /proc/net/pktgen/eth0
echo dst_mac 4e:14:25:a9:30:ac > /proc/net/pktgen/eth0
echo dst 192.168.1.2 > /proc/net/pktgen/eth0
for i in `seq 20`; do echo start > /proc/net/pktgen/pgctrl; tail -n1 /proc/net/pktgen/eth0; done
Before:
746547-793084(786421+/-9.6e+03)pps 346-367(364.4+/-4.4)Mb/sec (346397808-367990976(3.649e+08+/-4.5e+06)bps) errors: 0
After:
767390-792966(785159+/-6.5e+03)pps 356-367(363.75+/-2.9)Mb/sec (356068960-367936224(3.64314e+08+/-3e+06)bps) errors: 0
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r-- | drivers/net/virtio_net.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 9359a13d285a..3d0ce4468ce6 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -546,8 +546,8 @@ static int add_recvbuf_small(struct receive_queue *rq, gfp_t gfp) | |||
546 | skb_put(skb, GOOD_PACKET_LEN); | 546 | skb_put(skb, GOOD_PACKET_LEN); |
547 | 547 | ||
548 | hdr = skb_vnet_hdr(skb); | 548 | hdr = skb_vnet_hdr(skb); |
549 | sg_init_table(rq->sg, MAX_SKB_FRAGS + 2); | ||
549 | sg_set_buf(rq->sg, &hdr->hdr, sizeof hdr->hdr); | 550 | sg_set_buf(rq->sg, &hdr->hdr, sizeof hdr->hdr); |
550 | |||
551 | skb_to_sgvec(skb, rq->sg + 1, 0, skb->len); | 551 | skb_to_sgvec(skb, rq->sg + 1, 0, skb->len); |
552 | 552 | ||
553 | err = virtqueue_add_inbuf(rq->vq, rq->sg, 2, skb, gfp); | 553 | err = virtqueue_add_inbuf(rq->vq, rq->sg, 2, skb, gfp); |
@@ -563,6 +563,8 @@ static int add_recvbuf_big(struct receive_queue *rq, gfp_t gfp) | |||
563 | char *p; | 563 | char *p; |
564 | int i, err, offset; | 564 | int i, err, offset; |
565 | 565 | ||
566 | sg_init_table(rq->sg, MAX_SKB_FRAGS + 2); | ||
567 | |||
566 | /* page in rq->sg[MAX_SKB_FRAGS + 1] is list tail */ | 568 | /* page in rq->sg[MAX_SKB_FRAGS + 1] is list tail */ |
567 | for (i = MAX_SKB_FRAGS + 1; i > 1; --i) { | 569 | for (i = MAX_SKB_FRAGS + 1; i > 1; --i) { |
568 | first = get_a_page(rq, gfp); | 570 | first = get_a_page(rq, gfp); |
@@ -899,6 +901,7 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) | |||
899 | if (vi->mergeable_rx_bufs) | 901 | if (vi->mergeable_rx_bufs) |
900 | hdr->mhdr.num_buffers = 0; | 902 | hdr->mhdr.num_buffers = 0; |
901 | 903 | ||
904 | sg_init_table(sq->sg, MAX_SKB_FRAGS + 2); | ||
902 | if (can_push) { | 905 | if (can_push) { |
903 | __skb_push(skb, hdr_len); | 906 | __skb_push(skb, hdr_len); |
904 | num_sg = skb_to_sgvec(skb, sq->sg, 0, skb->len); | 907 | num_sg = skb_to_sgvec(skb, sq->sg, 0, skb->len); |