mbox series

[v4,00/13] virtio-scsi: add iothread-vq-mapping parameter

Message ID 20250311132616.1049687-1-stefanha@redhat.com (mailing list archive)
Headers show
Series virtio-scsi: add iothread-vq-mapping parameter | expand

Message

Stefan Hajnoczi March 11, 2025, 1:26 p.m. UTC
v4:
- Squash fixup commit properly this time >_< [Peter]
v3:
- Use vq_aio_context[VIRTIO_SCSI_VQ_NUM_FIXED] as the AioContext for the Block
  Backend [Kevin]
v2:
- Only expose cmd vqs via iothread-vq-mapping [Kevin, Peter]

Implement --device virtio-scsi-pci,iothread-vq-mapping= support so that
virtqueues can be assigned to different IOThreads. This improves SMP guest
scalability where I/O-intensive applications can become bottlenecked on a
single IOThread.

The following benchmark results show the effect of iothread-vq-mapping. fio
randread 4k iodepth=64 results from a 4 vCPU guest with an Intel P4800X SSD:
iothreads IOPS
------------------------------
1         189576
2         312698
4         346744

The virtio-scsi device model and core SCSI emulation currently assume that
requests are processed in a single AioContext. This patch series goes about
modifying this as follows:

scsi-disk: drop unused SCSIDiskState->bh field
dma: use current AioContext for dma_blk_io()

Make dma-helpers.c support the QEMU multi-queue block layer by using
qemu_get_current_aio_context().

scsi: track per-SCSIRequest AioContext
scsi: introduce requests_lock

Make the core SCSI emulation code support processing requests in multiple
AioContexts by protecting the per-SCSIDevice requests list.

virtio-scsi: introduce event and ctrl virtqueue locks
virtio-scsi: protect events_dropped field
virtio-scsi: perform TMFs in appropriate AioContexts

Make the virtio-scsi emulation code support processing requests in multiple
AioContexts. The event and ctrl virtqueues can interact with multiple
AioContexts. Especially the SCSI Task Management Functions (TMFs) handled by
the ctrl virtqueue need to be made thread-safe.

virtio-blk: extract cleanup_iothread_vq_mapping() function
virtio-blk: tidy up iothread_vq_mapping functions
virtio: extract iothread-vq-mapping.h API
virtio-scsi: add iothread-vq-mapping parameter

Port over the iothread-vq-mapping qdev property from virtio-blk to virtio-scsi.

virtio-scsi: handle ctrl virtqueue in main loop

Simplify TMF handling now that there is no longer a single AioContext where all
requests are processed.

virtio-scsi: only expose cmd vqs via iothread-vq-mapping

Make the user interface more intuitive.

Stefan Hajnoczi (13):
  scsi-disk: drop unused SCSIDiskState->bh field
  dma: use current AioContext for dma_blk_io()
  scsi: track per-SCSIRequest AioContext
  scsi: introduce requests_lock
  virtio-scsi: introduce event and ctrl virtqueue locks
  virtio-scsi: protect events_dropped field
  virtio-scsi: perform TMFs in appropriate AioContexts
  virtio-blk: extract cleanup_iothread_vq_mapping() function
  virtio-blk: tidy up iothread_vq_mapping functions
  virtio: extract iothread-vq-mapping.h API
  virtio-scsi: add iothread-vq-mapping parameter
  virtio-scsi: handle ctrl virtqueue in main loop
  virtio-scsi: only expose cmd vqs via iothread-vq-mapping

 include/hw/scsi/scsi.h                  |   8 +-
 include/hw/virtio/iothread-vq-mapping.h |  45 ++
 include/hw/virtio/virtio-scsi.h         |  15 +-
 include/system/dma.h                    |   3 +-
 hw/block/virtio-blk.c                   | 132 +-----
 hw/ide/core.c                           |   3 +-
 hw/ide/macio.c                          |   3 +-
 hw/scsi/scsi-bus.c                      | 121 ++++--
 hw/scsi/scsi-disk.c                     |  24 +-
 hw/scsi/virtio-scsi-dataplane.c         | 103 +++--
 hw/scsi/virtio-scsi.c                   | 542 ++++++++++++++----------
 hw/virtio/iothread-vq-mapping.c         | 131 ++++++
 system/dma-helpers.c                    |   8 +-
 hw/virtio/meson.build                   |   1 +
 14 files changed, 683 insertions(+), 456 deletions(-)
 create mode 100644 include/hw/virtio/iothread-vq-mapping.h
 create mode 100644 hw/virtio/iothread-vq-mapping.c

Comments

Peter Krempa March 11, 2025, 3:21 p.m. UTC | #1
On Tue, Mar 11, 2025 at 21:26:03 +0800, Stefan Hajnoczi wrote:
> v4:
> - Squash fixup commit properly this time >_< [Peter]
> v3:
> - Use vq_aio_context[VIRTIO_SCSI_VQ_NUM_FIXED] as the AioContext for the Block
>   Backend [Kevin]
> v2:
> - Only expose cmd vqs via iothread-vq-mapping [Kevin, Peter]
> 
> Implement --device virtio-scsi-pci,iothread-vq-mapping= support so that
> virtqueues can be assigned to different IOThreads. This improves SMP guest
> scalability where I/O-intensive applications can become bottlenecked on a
> single IOThread.
> 
> The following benchmark results show the effect of iothread-vq-mapping. fio
> randread 4k iodepth=64 results from a 4 vCPU guest with an Intel P4800X SSD:
> iothreads IOPS
> ------------------------------
> 1         189576
> 2         312698
> 4         346744

I've modified my libvirt patches to take only the command queues into
account same as with virtio-blk.

After learning how 'fio' works I was able to set multiple iothreads on
fire based on the mapping.

Tested-by: Peter Krempa <pkrempa@redhat.com>
Kevin Wolf March 11, 2025, 6:10 p.m. UTC | #2
Am 11.03.2025 um 14:26 hat Stefan Hajnoczi geschrieben:
> v4:
> - Squash fixup commit properly this time >_< [Peter]
> v3:
> - Use vq_aio_context[VIRTIO_SCSI_VQ_NUM_FIXED] as the AioContext for the Block
>   Backend [Kevin]
> v2:
> - Only expose cmd vqs via iothread-vq-mapping [Kevin, Peter]
> 
> Implement --device virtio-scsi-pci,iothread-vq-mapping= support so that
> virtqueues can be assigned to different IOThreads. This improves SMP guest
> scalability where I/O-intensive applications can become bottlenecked on a
> single IOThread.
> 
> The following benchmark results show the effect of iothread-vq-mapping. fio
> randread 4k iodepth=64 results from a 4 vCPU guest with an Intel P4800X SSD:
> iothreads IOPS
> ------------------------------
> 1         189576
> 2         312698
> 4         346744
> 
> The virtio-scsi device model and core SCSI emulation currently assume that
> requests are processed in a single AioContext. This patch series goes about
> modifying this as follows:
> 
> scsi-disk: drop unused SCSIDiskState->bh field
> dma: use current AioContext for dma_blk_io()
> 
> Make dma-helpers.c support the QEMU multi-queue block layer by using
> qemu_get_current_aio_context().
> 
> scsi: track per-SCSIRequest AioContext
> scsi: introduce requests_lock
> 
> Make the core SCSI emulation code support processing requests in multiple
> AioContexts by protecting the per-SCSIDevice requests list.
> 
> virtio-scsi: introduce event and ctrl virtqueue locks
> virtio-scsi: protect events_dropped field
> virtio-scsi: perform TMFs in appropriate AioContexts
> 
> Make the virtio-scsi emulation code support processing requests in multiple
> AioContexts. The event and ctrl virtqueues can interact with multiple
> AioContexts. Especially the SCSI Task Management Functions (TMFs) handled by
> the ctrl virtqueue need to be made thread-safe.
> 
> virtio-blk: extract cleanup_iothread_vq_mapping() function
> virtio-blk: tidy up iothread_vq_mapping functions
> virtio: extract iothread-vq-mapping.h API
> virtio-scsi: add iothread-vq-mapping parameter
> 
> Port over the iothread-vq-mapping qdev property from virtio-blk to virtio-scsi.
> 
> virtio-scsi: handle ctrl virtqueue in main loop
> 
> Simplify TMF handling now that there is no longer a single AioContext where all
> requests are processed.
> 
> virtio-scsi: only expose cmd vqs via iothread-vq-mapping
> 
> Make the user interface more intuitive.
> 
> Stefan Hajnoczi (13):
>   scsi-disk: drop unused SCSIDiskState->bh field
>   dma: use current AioContext for dma_blk_io()
>   scsi: track per-SCSIRequest AioContext
>   scsi: introduce requests_lock
>   virtio-scsi: introduce event and ctrl virtqueue locks
>   virtio-scsi: protect events_dropped field
>   virtio-scsi: perform TMFs in appropriate AioContexts
>   virtio-blk: extract cleanup_iothread_vq_mapping() function
>   virtio-blk: tidy up iothread_vq_mapping functions
>   virtio: extract iothread-vq-mapping.h API
>   virtio-scsi: add iothread-vq-mapping parameter
>   virtio-scsi: handle ctrl virtqueue in main loop
>   virtio-scsi: only expose cmd vqs via iothread-vq-mapping
> 
>  include/hw/scsi/scsi.h                  |   8 +-
>  include/hw/virtio/iothread-vq-mapping.h |  45 ++
>  include/hw/virtio/virtio-scsi.h         |  15 +-
>  include/system/dma.h                    |   3 +-
>  hw/block/virtio-blk.c                   | 132 +-----
>  hw/ide/core.c                           |   3 +-
>  hw/ide/macio.c                          |   3 +-
>  hw/scsi/scsi-bus.c                      | 121 ++++--
>  hw/scsi/scsi-disk.c                     |  24 +-
>  hw/scsi/virtio-scsi-dataplane.c         | 103 +++--
>  hw/scsi/virtio-scsi.c                   | 542 ++++++++++++++----------
>  hw/virtio/iothread-vq-mapping.c         | 131 ++++++
>  system/dma-helpers.c                    |   8 +-
>  hw/virtio/meson.build                   |   1 +
>  14 files changed, 683 insertions(+), 456 deletions(-)
>  create mode 100644 include/hw/virtio/iothread-vq-mapping.h
>  create mode 100644 hw/virtio/iothread-vq-mapping.c

Thanks, applied to the block branch.

Kevin