virtio-scsi: Attach event vq notifier with no_poll
As of commit38738f7dbb
("virtio-scsi: don't waste CPU polling the event virtqueue"), we only attach an io_read notifier for the virtio-scsi event virtqueue instead, and no polling notifiers. During operation, the event virtqueue is typically non-empty, but none of the buffers are intended to be used immediately. Instead, they only get used when certain events occur. Therefore, it makes no sense to continuously poll it when non-empty, because it is supposed to be and stay non-empty. We do this by using virtio_queue_aio_attach_host_notifier_no_poll() instead of virtio_queue_aio_attach_host_notifier() for the event virtqueue. Commit766aa2de0f
("virtio-scsi: implement BlockDevOps->drained_begin()") however has virtio_scsi_drained_end() use virtio_queue_aio_attach_host_notifier() for all virtqueues, including the event virtqueue. This can lead to it being polled again, undoing the benefit of commit38738f7dbb
. Fix it by using virtio_queue_aio_attach_host_notifier_no_poll() for the event virtqueue. Reported-by: Fiona Ebner <f.ebner@proxmox.com> Fixes:766aa2de0f
("virtio-scsi: implement BlockDevOps->drained_begin()") Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Tested-by: Fiona Ebner <f.ebner@proxmox.com> Reviewed-by: Fiona Ebner <f.ebner@proxmox.com> Signed-off-by: Hanna Czenczek <hreitz@redhat.com> Message-ID: <20240202153158.788922-2-hreitz@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
10b2393e5e
commit
c42c3833e0
@ -1149,6 +1149,7 @@ static void virtio_scsi_drained_begin(SCSIBus *bus)
|
|||||||
static void virtio_scsi_drained_end(SCSIBus *bus)
|
static void virtio_scsi_drained_end(SCSIBus *bus)
|
||||||
{
|
{
|
||||||
VirtIOSCSI *s = container_of(bus, VirtIOSCSI, bus);
|
VirtIOSCSI *s = container_of(bus, VirtIOSCSI, bus);
|
||||||
|
VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
|
||||||
VirtIODevice *vdev = VIRTIO_DEVICE(s);
|
VirtIODevice *vdev = VIRTIO_DEVICE(s);
|
||||||
uint32_t total_queues = VIRTIO_SCSI_VQ_NUM_FIXED +
|
uint32_t total_queues = VIRTIO_SCSI_VQ_NUM_FIXED +
|
||||||
s->parent_obj.conf.num_queues;
|
s->parent_obj.conf.num_queues;
|
||||||
@ -1166,7 +1167,11 @@ static void virtio_scsi_drained_end(SCSIBus *bus)
|
|||||||
|
|
||||||
for (uint32_t i = 0; i < total_queues; i++) {
|
for (uint32_t i = 0; i < total_queues; i++) {
|
||||||
VirtQueue *vq = virtio_get_queue(vdev, i);
|
VirtQueue *vq = virtio_get_queue(vdev, i);
|
||||||
virtio_queue_aio_attach_host_notifier(vq, s->ctx);
|
if (vq == vs->event_vq) {
|
||||||
|
virtio_queue_aio_attach_host_notifier_no_poll(vq, s->ctx);
|
||||||
|
} else {
|
||||||
|
virtio_queue_aio_attach_host_notifier(vq, s->ctx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user