On Wed, Sep 17, 2025 at 8:31 AM Jason Wang <jasow...@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 <epere...@redhat.com> > Reported-by: Jon Kohler <j...@nutanix.com> > Cc: sta...@vger.kernel.org > Fixes: 8c2e6b26ffe2 ("vhost/net: Defer TX queue re-enable until after > sendmsg") > Signed-off-by: Jason Wang <jasow...@redhat.com> > Signed-off-by: Michael S. Tsirkin <m...@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 >