mirror of
https://github.com/mii443/qemu.git
synced 2025-12-03 11:08:25 +00:00
vhost_net: device IOTLB support
This patches implements Device IOTLB support for vhost kernel. This is done through: 1) switch to use dma helpers when map/unmap vrings from vhost codes 2) introduce a set of VhostOps to: - setting up device IOTLB request callback - processing device IOTLB request - processing device IOTLB invalidation 2) kernel support for Device IOTLB API: - allow vhost-net to query the IOMMU IOTLB entry through eventfd - enable the ability for qemu to update a specified mapping of vhost - through ioctl. - enable the ability to invalidate a specified range of iova for the device IOTLB of vhost through ioctl. In x86/intel_iommu case this is triggered through iommu memory region notifier from device IOTLB invalidation descriptor processing routine. With all the above, kernel vhost_net can co-operate with userspace IOMMU. For vhost-user, the support could be easily done on top by implementing the VhostOps. Cc: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
committed by
Michael S. Tsirkin
parent
1448c133e1
commit
c471ad0e9b
@@ -11,6 +11,8 @@
|
||||
#ifndef VHOST_BACKEND_H
|
||||
#define VHOST_BACKEND_H
|
||||
|
||||
#include "exec/memory.h"
|
||||
|
||||
typedef enum VhostBackendType {
|
||||
VHOST_BACKEND_TYPE_NONE = 0,
|
||||
VHOST_BACKEND_TYPE_KERNEL = 1,
|
||||
@@ -77,6 +79,14 @@ typedef bool (*vhost_backend_can_merge_op)(struct vhost_dev *dev,
|
||||
typedef int (*vhost_vsock_set_guest_cid_op)(struct vhost_dev *dev,
|
||||
uint64_t guest_cid);
|
||||
typedef int (*vhost_vsock_set_running_op)(struct vhost_dev *dev, int start);
|
||||
typedef void (*vhost_set_iotlb_callback_op)(struct vhost_dev *dev,
|
||||
int enabled);
|
||||
typedef int (*vhost_update_device_iotlb_op)(struct vhost_dev *dev,
|
||||
uint64_t iova, uint64_t uaddr,
|
||||
uint64_t len,
|
||||
IOMMUAccessFlags perm);
|
||||
typedef int (*vhost_invalidate_device_iotlb_op)(struct vhost_dev *dev,
|
||||
uint64_t iova, uint64_t len);
|
||||
|
||||
typedef struct VhostOps {
|
||||
VhostBackendType backend_type;
|
||||
@@ -109,6 +119,9 @@ typedef struct VhostOps {
|
||||
vhost_backend_can_merge_op vhost_backend_can_merge;
|
||||
vhost_vsock_set_guest_cid_op vhost_vsock_set_guest_cid;
|
||||
vhost_vsock_set_running_op vhost_vsock_set_running;
|
||||
vhost_set_iotlb_callback_op vhost_set_iotlb_callback;
|
||||
vhost_update_device_iotlb_op vhost_update_device_iotlb;
|
||||
vhost_invalidate_device_iotlb_op vhost_invalidate_device_iotlb;
|
||||
} VhostOps;
|
||||
|
||||
extern const VhostOps user_ops;
|
||||
|
||||
Reference in New Issue
Block a user