Stefano Garzarella
2021-Nov-22  16:35 UTC
[PATCH 0/2] vhost/vsock: fix used length and cleanup in vhost_vsock_handle_tx_kick()
This is a follow-up to Micheal's patch [1] and the discussion with Halil and Jason [2]. I made two patches, one to fix the problem and one for cleanup. This should simplify the backport of the fix because we've had the problem since vhost-vsock was introduced (v4.8) and that part has been touched a bit recently. Thanks, Stefano [1] https://lore.kernel.org/virtualization/20211122105822.onarsa4sydzxqynu at steredhat/T/#t [2] https://lore.kernel.org/virtualization/20211027022107.14357-1-jasowang at redhat.com/T/#t Stefano Garzarella (2): vhost/vsock: fix incorrect used length reported to the guest vhost/vsock: cleanup removing `len` variable drivers/vhost/vsock.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) -- 2.31.1
Stefano Garzarella
2021-Nov-22  16:35 UTC
[PATCH 1/2] vhost/vsock: fix incorrect used length reported to the guest
The "used length" reported by calling vhost_add_used() must be the
number of bytes written by the device (using "in" buffers).
In vhost_vsock_handle_tx_kick() the device only reads the guest
buffers (they are all "out" buffers), without writing anything,
so we must pass 0 as "used length" to comply virtio spec.
Fixes: 433fc58e6bf2 ("VSOCK: Introduce vhost_vsock.ko")
Cc: stable at vger.kernel.org
Reported-by: Halil Pasic <pasic at linux.ibm.com>
Suggested-by: Jason Wang <jasowang at redhat.com>
Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
---
 drivers/vhost/vsock.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index 938aefbc75ec..4e3b95af7ee4 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -554,7 +554,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work
*work)
 			virtio_transport_free_pkt(pkt);
 
 		len += sizeof(pkt->hdr);
-		vhost_add_used(vq, head, len);
+		vhost_add_used(vq, head, 0);
 		total_len += len;
 		added = true;
 	} while(likely(!vhost_exceeds_weight(vq, ++pkts, total_len)));
-- 
2.31.1
Stefano Garzarella
2021-Nov-22  16:35 UTC
[PATCH 2/2] vhost/vsock: cleanup removing `len` variable
We can increment `total_len` directly and remove `len` since it
is no longer used for vhost_add_used().
Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
---
 drivers/vhost/vsock.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index 4e3b95af7ee4..d6ca1c7ad513 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -511,8 +511,6 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work
*work)
 
 	vhost_disable_notify(&vsock->dev, vq);
 	do {
-		u32 len;
-
 		if (!vhost_vsock_more_replies(vsock)) {
 			/* Stop tx until the device processes already
 			 * pending replies.  Leave tx virtqueue
@@ -540,7 +538,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work
*work)
 			continue;
 		}
 
-		len = pkt->len;
+		total_len += sizeof(pkt->hdr) + pkt->len;
 
 		/* Deliver to monitoring devices all received packets */
 		virtio_transport_deliver_tap_pkt(pkt);
@@ -553,9 +551,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work
*work)
 		else
 			virtio_transport_free_pkt(pkt);
 
-		len += sizeof(pkt->hdr);
 		vhost_add_used(vq, head, 0);
-		total_len += len;
 		added = true;
 	} while(likely(!vhost_exceeds_weight(vq, ++pkts, total_len)));
 
-- 
2.31.1
Stefan Hajnoczi
2021-Nov-23  12:54 UTC
[PATCH 0/2] vhost/vsock: fix used length and cleanup in vhost_vsock_handle_tx_kick()
On Mon, Nov 22, 2021 at 05:35:23PM +0100, Stefano Garzarella wrote:> This is a follow-up to Micheal's patch [1] and the discussion with Halil and > Jason [2]. > > I made two patches, one to fix the problem and one for cleanup. This should > simplify the backport of the fix because we've had the problem since > vhost-vsock was introduced (v4.8) and that part has been touched a bit > recently. > > Thanks, > Stefano > > [1] https://lore.kernel.org/virtualization/20211122105822.onarsa4sydzxqynu at steredhat/T/#t > [2] https://lore.kernel.org/virtualization/20211027022107.14357-1-jasowang at redhat.com/T/#t > > Stefano Garzarella (2): > vhost/vsock: fix incorrect used length reported to the guest > vhost/vsock: cleanup removing `len` variable > > drivers/vhost/vsock.c | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > > -- > 2.31.1 >Reviewed-by: Stefan Hajnoczi <stefanha at redhat.com> -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 488 bytes Desc: not available URL: <http://lists.linuxfoundation.org/pipermail/virtualization/attachments/20211123/6f101c25/attachment-0001.sig>