4de9440f87
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
99 lines
3.4 KiB
Diff
99 lines
3.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Xueming Li <xuemingl@nvidia.com>
|
|
Date: Mon, 7 Feb 2022 15:19:28 +0800
|
|
Subject: [PATCH] vhost-user: remove VirtQ notifier restore
|
|
|
|
Notifier set when vhost-user backend asks qemu to mmap an FD and
|
|
offset. When vhost-user backend restart or getting killed, VQ notifier
|
|
FD and mmap addresses become invalid. After backend restart, MR contains
|
|
the invalid address will be restored and fail on notifier access.
|
|
|
|
On the other hand, qemu should munmap the notifier, release underlying
|
|
hardware resources to enable backend restart and allocate hardware
|
|
notifier resources correctly.
|
|
|
|
Qemu shouldn't reference and use resources of disconnected backend.
|
|
|
|
This patch removes VQ notifier restore, uses the default vhost-user
|
|
notifier to avoid invalid address access.
|
|
|
|
After backend restart, the backend should ask qemu to install a hardware
|
|
notifier if needed.
|
|
|
|
Fixes: 44866521bd6e ("vhost-user: support registering external host notifiers")
|
|
Cc: qemu-stable@nongnu.org
|
|
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
|
|
Message-Id: <20220207071929.527149-2-xuemingl@nvidia.com>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
(cherry picked from commit e867144b73b3c5009266b6df07d5ff44acfb82c3)
|
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|
---
|
|
hw/virtio/vhost-user.c | 19 +------------------
|
|
include/hw/virtio/vhost-user.h | 1 -
|
|
2 files changed, 1 insertion(+), 19 deletions(-)
|
|
|
|
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
|
|
index bf6e50223c..c671719e9b 100644
|
|
--- a/hw/virtio/vhost-user.c
|
|
+++ b/hw/virtio/vhost-user.c
|
|
@@ -1143,19 +1143,6 @@ static int vhost_user_set_vring_num(struct vhost_dev *dev,
|
|
return vhost_set_vring(dev, VHOST_USER_SET_VRING_NUM, ring);
|
|
}
|
|
|
|
-static void vhost_user_host_notifier_restore(struct vhost_dev *dev,
|
|
- int queue_idx)
|
|
-{
|
|
- struct vhost_user *u = dev->opaque;
|
|
- VhostUserHostNotifier *n = &u->user->notifier[queue_idx];
|
|
- VirtIODevice *vdev = dev->vdev;
|
|
-
|
|
- if (n->addr && !n->set) {
|
|
- virtio_queue_set_host_notifier_mr(vdev, queue_idx, &n->mr, true);
|
|
- n->set = true;
|
|
- }
|
|
-}
|
|
-
|
|
static void vhost_user_host_notifier_remove(struct vhost_dev *dev,
|
|
int queue_idx)
|
|
{
|
|
@@ -1163,17 +1150,14 @@ static void vhost_user_host_notifier_remove(struct vhost_dev *dev,
|
|
VhostUserHostNotifier *n = &u->user->notifier[queue_idx];
|
|
VirtIODevice *vdev = dev->vdev;
|
|
|
|
- if (n->addr && n->set) {
|
|
+ if (n->addr) {
|
|
virtio_queue_set_host_notifier_mr(vdev, queue_idx, &n->mr, false);
|
|
- n->set = false;
|
|
}
|
|
}
|
|
|
|
static int vhost_user_set_vring_base(struct vhost_dev *dev,
|
|
struct vhost_vring_state *ring)
|
|
{
|
|
- vhost_user_host_notifier_restore(dev, ring->index);
|
|
-
|
|
return vhost_set_vring(dev, VHOST_USER_SET_VRING_BASE, ring);
|
|
}
|
|
|
|
@@ -1538,7 +1522,6 @@ static int vhost_user_slave_handle_vring_host_notifier(struct vhost_dev *dev,
|
|
}
|
|
|
|
n->addr = addr;
|
|
- n->set = true;
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/include/hw/virtio/vhost-user.h b/include/hw/virtio/vhost-user.h
|
|
index a9abca3288..f6012b2078 100644
|
|
--- a/include/hw/virtio/vhost-user.h
|
|
+++ b/include/hw/virtio/vhost-user.h
|
|
@@ -14,7 +14,6 @@
|
|
typedef struct VhostUserHostNotifier {
|
|
MemoryRegion mr;
|
|
void *addr;
|
|
- bool set;
|
|
} VhostUserHostNotifier;
|
|
|
|
typedef struct VhostUserState {
|