virtio, vhost: fixes, features, performance
new iommu device vhost guest memory access using vmap (just meta-data for now) minor fixes Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Note: due to code driver changes the driver-core tree, the following patch is needed when merging tree with commit92ce7e83b4("driver_find_device: Unify the match function with class_find_device()") in the driver-core tree: From: Nathan Chancellor <natechancellor@gmail.com> Subject: [PATCH] iommu/virtio: Constify data parameter in viommu_match_node After commit92ce7e83b4("driver_find_device: Unify the match function with class_find_device()") in the driver-core tree. Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- drivers/iommu/virtio-iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c index 4620dd221ffd..433f4d2ee956 100644 --- a/drivers/iommu/virtio-iommu.c +++ b/drivers/iommu/virtio-iommu.c @@ -839,7 +839,7 @@ static void viommu_put_resv_regions(struct device *dev, struct list_head *head) static struct iommu_ops viommu_ops; static struct virtio_driver virtio_iommu_drv; -static int viommu_match_node(struct device *dev, void *data) +static int viommu_match_node(struct device *dev, const void *data) { return dev->parent->fwnode == data; } -----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJdJ5qUAAoJECgfDbjSjVRpQs0H/2qWcIG1zjGKyh9KWrfgOusG /QIqeP50d7SC6oqdyd00tzmExqO1xdGLPFzYixdOsU817te1gHBP4Rfmzo01jZRd CUzZNnZQ2JRsDshiA6G2ui+wn1/a/cB3RPN4rT1mquDYS53QmsRGDQDnpp84TXMV aocB8TS6halbRzKMq3VmaWHIvzNXnt4dwQR542+PyeLLn9bUx2QwWj2ON3QwxixK dVRZow3GwLGBhKTA/Z1Z/Bta4fEfOKjUGP2XWgvL6zOr+nZR4eQ8w5WXVJYzR+d6 1JCfqTxleweT2k6Tu5VwtTNlQkxn/XvQAeisppOiEE6NnPjubyI9wMQIvL7bkpo= =uJbC -----END PGP SIGNATURE----- Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost Pull virtio, vhost updates from Michael Tsirkin: "Fixes, features, performance: - new iommu device - vhost guest memory access using vmap (just meta-data for now) - minor fixes" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: virtio-mmio: add error check for platform_get_irq scsi: virtio_scsi: Use struct_size() helper iommu/virtio: Add event queue iommu/virtio: Add probe request iommu: Add virtio-iommu driver PCI: OF: Initialize dev->fwnode appropriately of: Allow the iommu-map property to omit untranslated devices dt-bindings: virtio: Add virtio-pci-iommu node dt-bindings: virtio-mmio: Add IOMMU description vhost: fix clang build warning vhost: access vq metadata through kernel virtual address vhost: factor out setting vring addr and num vhost: introduce helpers to get the size of metadata area vhost: rename vq_iotlb_prefetch() to vq_meta_prefetch() vhost: fine grain userspace memory accessors vhost: generalize adding used elem
This commit is contained in:
commit
3a1d5384b7
15 changed files with 2228 additions and 131 deletions
|
|
@ -43,5 +43,6 @@
|
|||
#define VIRTIO_ID_INPUT 18 /* virtio input */
|
||||
#define VIRTIO_ID_VSOCK 19 /* virtio vsock transport */
|
||||
#define VIRTIO_ID_CRYPTO 20 /* virtio crypto */
|
||||
#define VIRTIO_ID_IOMMU 23 /* virtio IOMMU */
|
||||
|
||||
#endif /* _LINUX_VIRTIO_IDS_H */
|
||||
|
|
|
|||
161
include/uapi/linux/virtio_iommu.h
Normal file
161
include/uapi/linux/virtio_iommu.h
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
/* SPDX-License-Identifier: BSD-3-Clause */
|
||||
/*
|
||||
* Virtio-iommu definition v0.9
|
||||
*
|
||||
* Copyright (C) 2018 Arm Ltd.
|
||||
*/
|
||||
#ifndef _UAPI_LINUX_VIRTIO_IOMMU_H
|
||||
#define _UAPI_LINUX_VIRTIO_IOMMU_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Feature bits */
|
||||
#define VIRTIO_IOMMU_F_INPUT_RANGE 0
|
||||
#define VIRTIO_IOMMU_F_DOMAIN_BITS 1
|
||||
#define VIRTIO_IOMMU_F_MAP_UNMAP 2
|
||||
#define VIRTIO_IOMMU_F_BYPASS 3
|
||||
#define VIRTIO_IOMMU_F_PROBE 4
|
||||
|
||||
struct virtio_iommu_range {
|
||||
__u64 start;
|
||||
__u64 end;
|
||||
};
|
||||
|
||||
struct virtio_iommu_config {
|
||||
/* Supported page sizes */
|
||||
__u64 page_size_mask;
|
||||
/* Supported IOVA range */
|
||||
struct virtio_iommu_range input_range;
|
||||
/* Max domain ID size */
|
||||
__u8 domain_bits;
|
||||
__u8 padding[3];
|
||||
/* Probe buffer size */
|
||||
__u32 probe_size;
|
||||
};
|
||||
|
||||
/* Request types */
|
||||
#define VIRTIO_IOMMU_T_ATTACH 0x01
|
||||
#define VIRTIO_IOMMU_T_DETACH 0x02
|
||||
#define VIRTIO_IOMMU_T_MAP 0x03
|
||||
#define VIRTIO_IOMMU_T_UNMAP 0x04
|
||||
#define VIRTIO_IOMMU_T_PROBE 0x05
|
||||
|
||||
/* Status types */
|
||||
#define VIRTIO_IOMMU_S_OK 0x00
|
||||
#define VIRTIO_IOMMU_S_IOERR 0x01
|
||||
#define VIRTIO_IOMMU_S_UNSUPP 0x02
|
||||
#define VIRTIO_IOMMU_S_DEVERR 0x03
|
||||
#define VIRTIO_IOMMU_S_INVAL 0x04
|
||||
#define VIRTIO_IOMMU_S_RANGE 0x05
|
||||
#define VIRTIO_IOMMU_S_NOENT 0x06
|
||||
#define VIRTIO_IOMMU_S_FAULT 0x07
|
||||
|
||||
struct virtio_iommu_req_head {
|
||||
__u8 type;
|
||||
__u8 reserved[3];
|
||||
};
|
||||
|
||||
struct virtio_iommu_req_tail {
|
||||
__u8 status;
|
||||
__u8 reserved[3];
|
||||
};
|
||||
|
||||
struct virtio_iommu_req_attach {
|
||||
struct virtio_iommu_req_head head;
|
||||
__le32 domain;
|
||||
__le32 endpoint;
|
||||
__u8 reserved[8];
|
||||
struct virtio_iommu_req_tail tail;
|
||||
};
|
||||
|
||||
struct virtio_iommu_req_detach {
|
||||
struct virtio_iommu_req_head head;
|
||||
__le32 domain;
|
||||
__le32 endpoint;
|
||||
__u8 reserved[8];
|
||||
struct virtio_iommu_req_tail tail;
|
||||
};
|
||||
|
||||
#define VIRTIO_IOMMU_MAP_F_READ (1 << 0)
|
||||
#define VIRTIO_IOMMU_MAP_F_WRITE (1 << 1)
|
||||
#define VIRTIO_IOMMU_MAP_F_EXEC (1 << 2)
|
||||
#define VIRTIO_IOMMU_MAP_F_MMIO (1 << 3)
|
||||
|
||||
#define VIRTIO_IOMMU_MAP_F_MASK (VIRTIO_IOMMU_MAP_F_READ | \
|
||||
VIRTIO_IOMMU_MAP_F_WRITE | \
|
||||
VIRTIO_IOMMU_MAP_F_EXEC | \
|
||||
VIRTIO_IOMMU_MAP_F_MMIO)
|
||||
|
||||
struct virtio_iommu_req_map {
|
||||
struct virtio_iommu_req_head head;
|
||||
__le32 domain;
|
||||
__le64 virt_start;
|
||||
__le64 virt_end;
|
||||
__le64 phys_start;
|
||||
__le32 flags;
|
||||
struct virtio_iommu_req_tail tail;
|
||||
};
|
||||
|
||||
struct virtio_iommu_req_unmap {
|
||||
struct virtio_iommu_req_head head;
|
||||
__le32 domain;
|
||||
__le64 virt_start;
|
||||
__le64 virt_end;
|
||||
__u8 reserved[4];
|
||||
struct virtio_iommu_req_tail tail;
|
||||
};
|
||||
|
||||
#define VIRTIO_IOMMU_PROBE_T_NONE 0
|
||||
#define VIRTIO_IOMMU_PROBE_T_RESV_MEM 1
|
||||
|
||||
#define VIRTIO_IOMMU_PROBE_T_MASK 0xfff
|
||||
|
||||
struct virtio_iommu_probe_property {
|
||||
__le16 type;
|
||||
__le16 length;
|
||||
};
|
||||
|
||||
#define VIRTIO_IOMMU_RESV_MEM_T_RESERVED 0
|
||||
#define VIRTIO_IOMMU_RESV_MEM_T_MSI 1
|
||||
|
||||
struct virtio_iommu_probe_resv_mem {
|
||||
struct virtio_iommu_probe_property head;
|
||||
__u8 subtype;
|
||||
__u8 reserved[3];
|
||||
__le64 start;
|
||||
__le64 end;
|
||||
};
|
||||
|
||||
struct virtio_iommu_req_probe {
|
||||
struct virtio_iommu_req_head head;
|
||||
__le32 endpoint;
|
||||
__u8 reserved[64];
|
||||
|
||||
__u8 properties[];
|
||||
|
||||
/*
|
||||
* Tail follows the variable-length properties array. No padding,
|
||||
* property lengths are all aligned on 8 bytes.
|
||||
*/
|
||||
};
|
||||
|
||||
/* Fault types */
|
||||
#define VIRTIO_IOMMU_FAULT_R_UNKNOWN 0
|
||||
#define VIRTIO_IOMMU_FAULT_R_DOMAIN 1
|
||||
#define VIRTIO_IOMMU_FAULT_R_MAPPING 2
|
||||
|
||||
#define VIRTIO_IOMMU_FAULT_F_READ (1 << 0)
|
||||
#define VIRTIO_IOMMU_FAULT_F_WRITE (1 << 1)
|
||||
#define VIRTIO_IOMMU_FAULT_F_EXEC (1 << 2)
|
||||
#define VIRTIO_IOMMU_FAULT_F_ADDRESS (1 << 8)
|
||||
|
||||
struct virtio_iommu_fault {
|
||||
__u8 reason;
|
||||
__u8 reserved[3];
|
||||
__le32 flags;
|
||||
__le32 endpoint;
|
||||
__u8 reserved2[4];
|
||||
__le64 address;
|
||||
};
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue