? jiang
2019-Jul-18 12:55 UTC
[PATCH] virtio-net: parameterize min ring num_free for virtio receive
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
Michael S. Tsirkin
2019-Jul-18 13:04 UTC
[PATCH] virtio-net: parameterize min ring num_free for virtio receive
On Thu, Jul 18, 2019 at 12:55:50PM +0000, ? jiang wrote:> 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>That would be one reason, but I suspect it's not the true one. If you need more buffer due to jitter then just increase the queue size. Would be cleaner. However are you sure this is the reason for packet drops? Do you see them dropped by dpdk due to lack of space in the ring? As opposed to by guest?> --- > 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
Jason Wang
2019-Jul-18 14:01 UTC
[PATCH] virtio-net: parameterize min ring num_free for virtio receive
On 2019/7/18 ??9:04, Michael S. Tsirkin wrote:> On Thu, Jul 18, 2019 at 12:55:50PM +0000, ? jiang wrote: >> 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> > That would be one reason, but I suspect it's not the > true one. If you need more buffer due to jitter > then just increase the queue size. Would be cleaner. > > > However are you sure this is the reason for > packet drops? Do you see them dropped by dpdk > due to lack of space in the ring? As opposed to > by guest? > >Besides those, this patch depends on the user to choose a suitable threshold which is not good. You need either a good value with demonstrated numbers or something smarter. Thanks
Apparently Analagous Threads
- [PATCH] virtio-net: parameterize min ring num_free for virtio receive
- [PATCH] virtio-net: parameterize min ring num_free for virtio receive
- [PATCH] virtio-net: parameterize min ring num_free for virtio receive
- [PATCH] virtio-net: parameterize min ring num_free for virtio receive
- [PATCH] virtio-net: parameterize min ring num_free for virtio receive