Re: [PATCH v5 3/5] vhost/vsock: re-scan TX virtqueue on device start
Stefano Garzarella <[email protected]> Wed, 22 Jul 2026 11:14:53 +0200
| Newsgroups | dev.linux.lists.virtualization,org.kernel.vger.kvm,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <amCKAp08S68JWXRf@sgarzare-redhat> |
On Mon, Jul 20, 2026 at 01:22:39PM +0300, Andrey Drobyshev wrote: >During QEMU CPR live-update (and VHOST_RESET_OWNER in general) the guest >keeps running while the host drops and later re-attaches vhost backends. >If the guest adds a buffer to the TX virtqueue (guest->host) and kicks >while the backend is temporarily NULL (between vhost_vsock_drop_backends() >and the next vhost_vsock_start()), then the kick is delivered to the >vhost worker, handle_tx_kick() sees a NULL backend and returns, and the >kick signal is consumed. The buffer is then left in the ring. > >Then upon device start vhost_vsock_start() only re-kicks the RX send >worker, never the TX VQ, so the buffer is processed only if the guest >happens to kick again. But if the guest itself is now waiting for data >from the host, it will never kick TX VQ again, and we end up in a >deadlock. > >The issue itself is pre-existing, but it only manifests during a device >pause caused by VHOST_RESET_OWNER. Namely, the deadlock is reproduced >during active host->guest socat data transfer under multiple consecutive >CPR live-update's. > >To fix this, in vhost_vsock_start(), after kicking the RX send worker, also >queue the TX vq poll so any buffers the guest enqueued while we were paused >get scanned. > >The VHOST_RESET_OWNER ioctl itself is implemented in the following >patch, thus this patch is a preparation to support VHOST_RESET_OWNER. > >Signed-off-by: Andrey Drobyshev <[email protected]> >Reviewed-by: Pavel Tikhomirov <[email protected]> >--- > drivers/vhost/vsock.c | 7 +++++++ > 1 file changed, 7 insertions(+) Reviewed-by: Stefano Garzarella <[email protected]>