Re: [PATCH RFC v2 2/4] virtio_net: disable cb aggressively
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: 2021-04-13 14:09:18
Also in:
lkml, virtualization
On Tue, Apr 13, 2021 at 4:53 AM Jason Wang [off-list ref] wrote:
在 2021/4/13 下午1:47, Michael S. Tsirkin 写道:quoted
There are currently two cases where we poll TX vq not in response to a callback: start xmit and rx napi. We currently do this with callbacks enabled which can cause extra interrupts from the card. Used not to be a big issue as we run with interrupts disabled but that is no longer the case, and in some cases the rate of spurious interrupts is so high linux detects this and actually kills the interrupt. Fix up by disabling the callbacks before polling the tx vq. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- drivers/net/virtio_net.c | 2 ++ 1 file changed, 2 insertions(+)diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 82e520d2cb12..16d5abed582c 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c@@ -1429,6 +1429,7 @@ static void virtnet_poll_cleantx(struct receive_queue *rq) return; if (__netif_tx_trylock(txq)) { + virtqueue_disable_cb(sq->vq); free_old_xmit_skbs(sq, true); __netif_tx_unlock(txq);Any reason that we don't need to enable the cb here?
This is an opportunistic clean outside the normal tx-napi path, so if
disabling the tx interrupt here, it won't be reenabled based on
napi_complete_done.
I think that means that it stays disabled until the following start_xmit:
if (use_napi && kick)
virtqueue_enable_cb_delayed(sq->vq);
But that seems sufficient.