[PATCH] virtio-net: parameterize min ring num_free for virtio receive

? jiang
Thu, 18 Jul 2019 12:55:50 -0000

This change makes ring buffer reclaim threshold num_free configurable for better
performance, while it's hard coded as 1/2 * queue now.
According to our test with qemu + dpdk, packet dropping happens when the guest
is not able to provide free buffer in avail ring timely.
Smaller value of num_free does decrease the number of packet dropping during our
test as it makes virtio_net reclaim buffer earlier.

At least, we should leave the value changeable to user while the default value
as 1/2 * queue is kept.

Signed-off-by: jiangkidd <jiangkidd at hotmail.com>
---
 drivers/net/virtio_net.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 0d4115c9e20b..bc190dec6084 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -26,6 +26,9 @@
 static int napi_weight = NAPI_POLL_WEIGHT;
 module_param(napi_weight, int, 0444);

+static int min_numfree;
+module_param(min_numfree, int, 0444);
+
 static bool csum = true, gso = true, napi_tx;
 module_param(csum, bool, 0444);
 module_param(gso, bool, 0444);
@@ -1315,6 +1318,9 @@ static int virtnet_receive(struct receive_queue *rq, int
budget,
 	void *buf;
 	int i;

+	if (!min_numfree)
+		min_numfree = virtqueue_get_vring_size(rq->vq) / 2;
+
 	if (!vi->big_packets || vi->mergeable_rx_bufs) {
 		void *ctx;

@@ -1331,7 +1337,7 @@ static int virtnet_receive(struct receive_queue *rq, int
budget,
 		}
 	}

-	if (rq->vq->num_free > virtqueue_get_vring_size(rq->vq) / 2) {
+	if (rq->vq->num_free > min_numfree) {
 		if (!try_fill_recv(vi, rq, GFP_ATOMIC))
 			schedule_delayed_work(&vi->refill, 0);
 	}
--
2.11.0