From: Konstantin Khlebnikov
Vhost has error notifications, let's log them like other errors.
For each virt-queue setup eventfd for vring error notifications.
Signed-off-by: Konstantin Khlebnikov
[vsementsov: rename patch, change commit message and dump error like
other errors in the file]
Signed-off-by: Vladimir Sementsov-Ogievskiy
---
hw/virtio/vhost.c | 37 +
include/hw/virtio/vhost.h | 1 +
2 files changed, 38 insertions(+)
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 6c41fa13e3..0827d631c0 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -1278,6 +1278,19 @@ static int vhost_virtqueue_set_busyloop_timeout(struct
vhost_dev *dev,
return 0;
}
+static void vhost_virtqueue_error_notifier(EventNotifier *n)
+{
+struct vhost_virtqueue *vq = container_of(n, struct vhost_virtqueue,
+ error_notifier);
+struct vhost_dev *dev = vq->dev;
+int index = vq - dev->vqs;
+
+if (event_notifier_test_and_clear(n) && dev->vdev) {
+VHOST_OPS_DEBUG(-EINVAL, "vhost vring error in virtqueue %d",
+dev->vq_index + index);
+}
+}
+
static int vhost_virtqueue_init(struct vhost_dev *dev,
struct vhost_virtqueue *vq, int n)
{
@@ -1299,7 +1312,27 @@ static int vhost_virtqueue_init(struct vhost_dev *dev,
vq->dev = dev;
+if (dev->vhost_ops->vhost_set_vring_err) {
+r = event_notifier_init(>error_notifier, 0);
+if (r < 0) {
+goto fail_call;
+}
+
+file.fd = event_notifier_get_fd(>error_notifier);
+r = dev->vhost_ops->vhost_set_vring_err(dev, );
+if (r) {
+VHOST_OPS_DEBUG(r, "vhost_set_vring_err failed");
+goto fail_err;
+}
+
+event_notifier_set_handler(>error_notifier,
+ vhost_virtqueue_error_notifier);
+}
+
return 0;
+
+fail_err:
+event_notifier_cleanup(>error_notifier);
fail_call:
event_notifier_cleanup(>masked_notifier);
return r;
@@ -1308,6 +1341,10 @@ fail_call:
static void vhost_virtqueue_cleanup(struct vhost_virtqueue *vq)
{
event_notifier_cleanup(>masked_notifier);
+if (vq->dev->vhost_ops->vhost_set_vring_err) {
+event_notifier_set_handler(>error_notifier, NULL);
+event_notifier_cleanup(>error_notifier);
+}
}
int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
index b291fe4e24..1e7cbd9a10 100644
--- a/include/hw/virtio/vhost.h
+++ b/include/hw/virtio/vhost.h
@@ -29,6 +29,7 @@ struct vhost_virtqueue {
unsigned long long used_phys;
unsigned used_size;
EventNotifier masked_notifier;
+EventNotifier error_notifier;
struct vhost_dev *dev;
};
--
2.25.1