On Wed, Sep 17, 2025 at 8:31 AM Jason Wang jasowang@redhat.com wrote:
Commit 8c2e6b26ffe2 ("vhost/net: Defer TX queue re-enable until after sendmsg") tries to defer the notification enabling by moving the logic out of the loop after the vhost_tx_batch() when nothing new is spotted. This caused unexpected side effects as the new logic is reused for several other error conditions.
A previous patch reverted 8c2e6b26ffe2. Now, bring the performance back up by flushing batched buffers before enabling notifications.
Acked-by: Eugenio Pérez eperezma@redhat.com
Reported-by: Jon Kohler jon@nutanix.com Cc: stable@vger.kernel.org Fixes: 8c2e6b26ffe2 ("vhost/net: Defer TX queue re-enable until after sendmsg") Signed-off-by: Jason Wang jasowang@redhat.com Signed-off-by: Michael S. Tsirkin mst@redhat.com
drivers/vhost/net.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 57efd5c55f89..35ded4330431 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -780,6 +780,11 @@ static void handle_tx_copy(struct vhost_net *net, struct socket *sock)
The same optimization can be done in handle_tx_zerocopy, should it be marked as TODO?
I guess a lot of logic could be reused from one function to the other or, ideally, merging both handle_tx_zerocopy and handle_tx_copy.
But it is better to do it on top.
break; /* Nothing new? Wait for eventfd to tell us they refilled. */ if (head == vq->num) {
/* Flush batched packets to handle pending RX
* work (if busyloop_intr is set) and to avoid
* unnecessary virtqueue kicks.
*/
vhost_tx_batch(net, nvq, sock, &msg); if (unlikely(busyloop_intr)) { vhost_poll_queue(&vq->poll); } else if (unlikely(vhost_enable_notify(&net->dev,
-- 2.34.1