|
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 |
|