Since all the shadow virtqueue device is done in software, we can avoid the write syscall.
Signed-off-by: Eugenio Pérez <epere...@redhat.com> --- hw/virtio/vhost-shadow-virtqueue.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c index 8f6ffa729a..b6bab438d6 100644 --- a/hw/virtio/vhost-shadow-virtqueue.c +++ b/hw/virtio/vhost-shadow-virtqueue.c @@ -41,6 +41,9 @@ typedef struct VhostShadowVirtqueue { * set when the masked notifier has no uses */ QemuEvent is_free; + + /* Avoid re-sending signals */ + bool signaled; } masked_notifier; /* Virtio queue shadowing */ @@ -81,7 +84,8 @@ static void vhost_shadow_vq_handle_call_no_test(EventNotifier *n) unsigned n = virtio_get_queue_index(svq->vq); virtio_queue_invalidate_signalled_used(svq->vdev, n); virtio_notify_irqfd(svq->vdev, svq->vq); - } else { + } else if (!svq->masked_notifier.signaled) { + svq->masked_notifier.signaled = true; event_notifier_set(svq->masked_notifier.n); } @@ -110,6 +114,7 @@ static void vhost_shadow_vq_handle_call(EventNotifier *n) */ void vhost_shadow_vq_mask(VhostShadowVirtqueue *svq, EventNotifier *masked) { + svq->masked_notifier.signaled = false; qatomic_store_release(&svq->masked_notifier.n, masked); } -- 2.27.0