Re: [PATCH net-next] virtio-net: invoke zerocopy callback on xmit path if no tx napi
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: 2017-08-26 01:03:29
On Fri, Aug 25, 2017 at 7:32 PM, Michael S. Tsirkin [off-list ref] wrote:
On Fri, Aug 25, 2017 at 06:44:36PM -0400, Willem de Bruijn wrote:quoted
quoted
quoted
quoted
quoted
quoted
We don't enable network watchdog on virtio but we could and maybe should.Can you elaborate?The issue is that holding onto buffers for very long times makes guests think they are stuck. This is funamentally because from guest point of view this is a NIC, so it is supposed to transmit things out in a timely manner. If host backs the virtual NIC by something that is not a NIC, with traffic shaping etc introducing unbounded latencies, guest will be confused.That assumes that guests are fragile in this regard. A linux guest does not make such assumptions.Yes it does. Examples above: > > - a single slow flow can occupy the whole ring, you will not > > be able to make any new buffers available for the fast flowOh, right. Though those are due to vring_desc pool exhaustion rather than an upper bound on latency of any single packet. Limiting the number of zerocopy packets in flight to some fraction of the ring ensures that fast flows can always grab a slot. Running out of ubuf_info slots reverts to copy, so indirectly does this. But I read it correclty the zerocopy pool may be equal to or larger than the descriptor pool. Should we refine the zcopy_used test (nvq->upend_idx + 1) % UIO_MAXIOV != nvq->done_idx to also return false if the number of outstanding ubuf_info is greater than, say, vq->num >> 1?We'll need to think about where to put the threshold, but I think it's a good idea. Maybe even a fixed number, e.g. max(vq->num >> 1, X) to limit host resources. In a sense it still means once you run out of slots zcopt gets disabled possibly permanently. Need to experiment with some numbers.
I can take a stab with two flows, one delayed in a deep host qdisc queue. See how this change affects the other flow and also how sensitive that is to the chosen threshold value.