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@xxxxxxxxxxx> --- 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 _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization