On 23.01.24 12:12, Fiona Ebner wrote: [...] > I noticed poll_set_started() is not called, because > ctx->fdmon_ops->need_wait(ctx) was true, i.e. ctx->poll_disable_cnt was > positive (I'm using fdmon_poll). I then found this is because of the > notifier for the event vq, being attached with > >> virtio_queue_aio_attach_host_notifier_no_poll(vs->event_vq, s->ctx); > in virtio_scsi_dataplane_start(). But in virtio_scsi_drained_end() it is > attached with virtio_queue_aio_attach_host_notifier() instead of the > _no_poll() variant. So that might be the actual issue here? > > From a quick test, I cannot see the CPU-usage-spike issue with the > following either: > >> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c >> index 690aceec45..ba1ab8e410 100644 >> --- a/hw/scsi/virtio-scsi.c >> +++ b/hw/scsi/virtio-scsi.c >> @@ -1166,7 +1166,15 @@ static void virtio_scsi_drained_end(SCSIBus *bus) >> >> for (uint32_t i = 0; i < total_queues; i++) { >> VirtQueue *vq = virtio_get_queue(vdev, i); >> - virtio_queue_aio_attach_host_notifier(vq, s->ctx); >> + if (!virtio_queue_get_notification(vq)) { >> + virtio_queue_set_notification(vq, true); >> + } >> + if (vq == VIRTIO_SCSI_COMMON(s)->event_vq) { >> + virtio_queue_aio_attach_host_notifier_no_poll(vq, s->ctx); >> + } else { >> + virtio_queue_aio_attach_host_notifier(vq, s->ctx); >> + } >> + virtio_queue_notify(vdev, i); >> } >> } Perfect, so we agree on trying it that way. :) Hanna