Juergen Gross ed68ac
Patch-mainline: v6.2-rc7
Juergen Gross ed68ac
Git-commit: 9526f9a2b762af16be94a72aca5d65c677d28f50
Juergen Gross ed68ac
References: git-fixes
Juergen Gross ed68ac
From: Eric Auger <eric.auger@redhat.com>
Juergen Gross ed68ac
Date: Tue, 17 Jan 2023 10:15:18 -0500
Juergen Gross ed68ac
Subject: [PATCH] vhost/net: Clear the pending messages when the backend is
Juergen Gross ed68ac
 removed
Juergen Gross ed68ac
Juergen Gross ed68ac
When the vhost iotlb is used along with a guest virtual iommu
Juergen Gross ed68ac
and the guest gets rebooted, some MISS messages may have been
Juergen Gross ed68ac
recorded just before the reboot and spuriously executed by
Juergen Gross ed68ac
the virtual iommu after the reboot.
Juergen Gross ed68ac
Juergen Gross ed68ac
As vhost does not have any explicit reset user API,
Juergen Gross ed68ac
VHOST_NET_SET_BACKEND looks a reasonable point where to clear
Juergen Gross ed68ac
the pending messages, in case the backend is removed.
Juergen Gross ed68ac
Juergen Gross ed68ac
Export vhost_clear_msg() and call it in vhost_net_set_backend()
Juergen Gross ed68ac
when fd == -1.
Juergen Gross ed68ac
Juergen Gross ed68ac
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Juergen Gross ed68ac
Suggested-by: Jason Wang <jasowang@redhat.com>
Juergen Gross ed68ac
Fixes: 6b1e6cc7855b0 ("vhost: new device IOTLB API")
Juergen Gross ed68ac
Message-Id: <20230117151518.44725-3-eric.auger@redhat.com>
Juergen Gross ed68ac
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Juergen Gross ed68ac
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross ed68ac
---
Juergen Gross ed68ac
 drivers/vhost/net.c   | 3 +++
Juergen Gross ed68ac
 drivers/vhost/vhost.c | 3 ++-
Juergen Gross ed68ac
 drivers/vhost/vhost.h | 1 +
Juergen Gross ed68ac
 3 files changed, 6 insertions(+), 1 deletion(-)
Juergen Gross ed68ac
Juergen Gross ed68ac
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
Juergen Gross ed68ac
index 9af19b0cf3b7..4c538b30fd76 100644
Juergen Gross ed68ac
--- a/drivers/vhost/net.c
Juergen Gross ed68ac
+++ b/drivers/vhost/net.c
Juergen Gross ed68ac
@@ -1511,6 +1511,9 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
Juergen Gross ed68ac
 	nvq = &n->vqs[index];
Juergen Gross ed68ac
 	mutex_lock(&vq->mutex);
Juergen Gross ed68ac
 
Juergen Gross ed68ac
+	if (fd == -1)
Juergen Gross ed68ac
+		vhost_clear_msg(&n->dev);
Juergen Gross ed68ac
+
Juergen Gross ed68ac
 	/* Verify that ring has been setup correctly. */
Juergen Gross ed68ac
 	if (!vhost_vq_access_ok(vq)) {
Juergen Gross ed68ac
 		r = -EFAULT;
Juergen Gross ed68ac
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
Juergen Gross ed68ac
index cbe72bfd2f1f..43c9770b86e5 100644
Juergen Gross ed68ac
--- a/drivers/vhost/vhost.c
Juergen Gross ed68ac
+++ b/drivers/vhost/vhost.c
Juergen Gross ed68ac
@@ -661,7 +661,7 @@ void vhost_dev_stop(struct vhost_dev *dev)
Juergen Gross ed68ac
 }
Juergen Gross ed68ac
 EXPORT_SYMBOL_GPL(vhost_dev_stop);
Juergen Gross ed68ac
 
Juergen Gross ed68ac
-static void vhost_clear_msg(struct vhost_dev *dev)
Juergen Gross ed68ac
+void vhost_clear_msg(struct vhost_dev *dev)
Juergen Gross ed68ac
 {
Juergen Gross ed68ac
 	struct vhost_msg_node *node, *n;
Juergen Gross ed68ac
 
Juergen Gross ed68ac
@@ -679,6 +679,7 @@ static void vhost_clear_msg(struct vhost_dev *dev)
Juergen Gross ed68ac
 
Juergen Gross ed68ac
 	spin_unlock(&dev->iotlb_lock);
Juergen Gross ed68ac
 }
Juergen Gross ed68ac
+EXPORT_SYMBOL_GPL(vhost_clear_msg);
Juergen Gross ed68ac
 
Juergen Gross ed68ac
 void vhost_dev_cleanup(struct vhost_dev *dev)
Juergen Gross ed68ac
 {
Juergen Gross ed68ac
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
Juergen Gross ed68ac
index d9109107af08..790b296271f1 100644
Juergen Gross ed68ac
--- a/drivers/vhost/vhost.h
Juergen Gross ed68ac
+++ b/drivers/vhost/vhost.h
Juergen Gross ed68ac
@@ -181,6 +181,7 @@ long vhost_dev_ioctl(struct vhost_dev *, unsigned int ioctl, void __user *argp);
Juergen Gross ed68ac
 long vhost_vring_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp);
Juergen Gross ed68ac
 bool vhost_vq_access_ok(struct vhost_virtqueue *vq);
Juergen Gross ed68ac
 bool vhost_log_access_ok(struct vhost_dev *);
Juergen Gross ed68ac
+void vhost_clear_msg(struct vhost_dev *dev);
Juergen Gross ed68ac
 
Juergen Gross ed68ac
 int vhost_get_vq_desc(struct vhost_virtqueue *,
Juergen Gross ed68ac
 		      struct iovec iov[], unsigned int iov_count,
Juergen Gross ed68ac
-- 
Juergen Gross ed68ac
2.35.3
Juergen Gross ed68ac