Re: [PATCH v2 2/2] vhost: setup error eventfd and dump errors

2022-06-24 Thread Roman Kagan
On Thu, Jun 23, 2022 at 07:13:25PM +0300, Vladimir Sementsov-Ogievskiy wrote:
> 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(+)

Reviewed-by: Roman Kagan 



[PATCH v2 2/2] vhost: setup error eventfd and dump errors

2022-06-23 Thread Vladimir Sementsov-Ogievskiy
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