vhost: new device IOTLB API
authorJason Wang <jasowang@redhat.com>
Thu, 23 Jun 2016 06:04:32 +0000 (02:04 -0400)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 2 Aug 2016 13:53:54 +0000 (16:53 +0300)
commit6b1e6cc7855b09a0a9bfa1d9f30172ba366f161c
tree7c6203c14e5d7a1a3fe015eb18f442a4279cc5d6
parentb2fbd8b0737803f527bc7671a14bd6736d78b5d7
vhost: new device IOTLB API

This patch tries to implement an device IOTLB for vhost. This could be
used with userspace(qemu) implementation of DMA remapping
to emulate an IOMMU for the guest.

The idea is simple, cache the translation in a software device IOTLB
(which is implemented as an interval tree) in vhost and use vhost_net
file descriptor for reporting IOTLB miss and IOTLB
update/invalidation. When vhost meets an IOTLB miss, the fault
address, size and access can be read from the file. After userspace
finishes the translation, it writes the translated address to the
vhost_net file to update the device IOTLB.

When device IOTLB is enabled by setting VIRTIO_F_IOMMU_PLATFORM all vq
addresses set by ioctl are treated as iova instead of virtual address and
the accessing can only be done through IOTLB instead of direct userspace
memory access. Before each round or vq processing, all vq metadata is
prefetched in device IOTLB to make sure no translation fault happens
during vq processing.

In most cases, virtqueues are contiguous even in virtual address space.
The IOTLB translation for virtqueue itself may make it a little
slower. We might add fast path cache on top of this patch.

Signed-off-by: Jason Wang <jasowang@redhat.com>
[mst: use virtio feature bit: VHOST_F_DEVICE_IOTLB -> VIRTIO_F_IOMMU_PLATFORM ]
[mst: fix build warnings ]
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
[ weiyj.lk: missing unlock on error ]
Signed-off-by: Wei Yongjun <weiyj.lk@gmail.com>
drivers/vhost/net.c
drivers/vhost/vhost.c
drivers/vhost/vhost.h
include/uapi/linux/vhost.h