[RFC PATCH kvmtool 00/15] Add virtio-iommu

Jean-Philippe Brucker
2017-04-07T19:24:40Z

Implement a virtio-iommu device and translate DMA traffic from vfio and virtio
devices. Virtio needed some rework to support scatter-gather accesses to vring
and buffers at page granularity. Patch 3 implements the actual virtio-iommu
device.

Adding --viommu on the command-line now inserts a virtual IOMMU in front
of all virtio and vfio devices:

	$ lkvm run -k Image --console virtio -p console=hvc0 \
	           --viommu --vfio 0 --vfio 4 --irqchip gicv3-its
	...
	[    2.998949] virtio_iommu virtio0: probe successful
	[    3.007739] virtio_iommu virtio1: probe successful
	...
	[    3.165023] iommu: Adding device 0000:00:00.0 to group 0
	[    3.536480] iommu: Adding device 10200.virtio to group 1
	[    3.553643] iommu: Adding device 10600.virtio to group 2
	[    3.570687] iommu: Adding device 10800.virtio to group 3
	[    3.627425] iommu: Adding device 10a00.virtio to group 4
	[    7.823689] iommu: Adding device 0000:00:01.0 to group 5
	...

Patches 13 and 14 add debug facilities. Some statistics are gathered for each
address space and can be queried via the debug builtin:

	$ lkvm debug -n guest-1210 --iommu stats
	iommu 0 "viommu-vfio"
	  kicks                 1255
	  requests              1256
	  ioas 1
	    maps                7
	    unmaps              4
	    resident            2101248
	  ioas 6
	    maps                623
	    unmaps              620
	    resident            16384
	iommu 1 "viommu-virtio"
	  kicks                 11426
	  requests              11431
	  ioas 2
	    maps                2836
	    unmaps              2835
	    resident            8192
	    accesses            2836
	...

This is based on the VFIO patchset[1], itself based on Andre's ITS work.
The VFIO bits have only been tested on a software model and are unlikely
to work on actual hardware, but I also tested virtio on an ARM Juno.

[1] http://www.spinics.net/lists/kvm/msg147624.html

Jean-Philippe Brucker (15):
  virtio: synchronize virtio-iommu headers with Linux
  FDT: (re)introduce a dynamic phandle allocator
  virtio: add virtio-iommu
  Add a simple IOMMU
  iommu: describe IOMMU topology in device-trees
  irq: register MSI doorbell addresses
  virtio: factor virtqueue initialization
  virtio: add vIOMMU instance for virtio devices
  virtio: access vring and buffers through IOMMU mappings
  virtio-pci: translate MSIs with the virtual IOMMU
  virtio: set VIRTIO_F_IOMMU_PLATFORM when necessary
  vfio: add support for virtual IOMMU
  virtio-iommu: debug via IPC
  virtio-iommu: implement basic debug commands
  virtio: use virtio-iommu when available

 Makefile                          |   3 +
 arm/gic.c                         |   4 +
 arm/include/arm-common/fdt-arch.h |   2 +-
 arm/pci.c                         |  49 ++-
 builtin-debug.c                   |   8 +-
 builtin-run.c                     |   2 +
 fdt.c                             |  35 ++
 include/kvm/builtin-debug.h       |   6 +
 include/kvm/devices.h             |   4 +
 include/kvm/fdt.h                 |  20 +
 include/kvm/iommu.h               | 105 +++++
 include/kvm/irq.h                 |   3 +
 include/kvm/kvm-config.h          |   1 +
 include/kvm/vfio.h                |   2 +
 include/kvm/virtio-iommu.h        |  15 +
 include/kvm/virtio-mmio.h         |   1 +
 include/kvm/virtio-pci.h          |   2 +
 include/kvm/virtio.h              | 137 +++++-
 include/linux/virtio_config.h     |  74 ++++
 include/linux/virtio_ids.h        |   4 +
 include/linux/virtio_iommu.h      | 142 ++++++
 iommu.c                           | 240 ++++++++++
 irq.c                             |  35 ++
 kvm-ipc.c                         |  43 +-
 mips/include/kvm/fdt-arch.h       |   2 +-
 powerpc/include/kvm/fdt-arch.h    |   2 +-
 vfio.c                            | 281 +++++++++++-
 virtio/9p.c                       |   7 +-
 virtio/balloon.c                  |   7 +-
 virtio/blk.c                      |  10 +-
 virtio/console.c                  |   7 +-
 virtio/core.c                     | 240 ++++++++--
 virtio/iommu.c                    | 902 ++++++++++++++++++++++++++++++++++++++
 virtio/mmio.c                     |  44 +-
 virtio/net.c                      |   8 +-
 virtio/pci.c                      |  61 ++-
 virtio/rng.c                      |   6 +-
 virtio/scsi.c                     |   6 +-
 x86/include/kvm/fdt-arch.h        |   2 +-
 39 files changed, 2389 insertions(+), 133 deletions(-)
 create mode 100644 fdt.c
 create mode 100644 include/kvm/iommu.h
 create mode 100644 include/kvm/virtio-iommu.h
 create mode 100644 include/linux/virtio_config.h
 create mode 100644 include/linux/virtio_iommu.h
 create mode 100644 iommu.c
 create mode 100644 virtio/iommu.c

--
2.12.1