[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC v2 14/22] vfio/pci: add iommu_context notifier for pasid bind/unbin
From: |
Liu Yi L |
Subject: |
[RFC v2 14/22] vfio/pci: add iommu_context notifier for pasid bind/unbind |
Date: |
Thu, 24 Oct 2019 08:34:35 -0400 |
This patch adds notifier for pasid bind/unbind. VFIO registers this
notifier to listen to the dual-stage translation (a.k.a. nested
translation) configuration changes and propagate to host. Thus vIOMMU
is able to set its translation structures to host.
Cc: Kevin Tian <address@hidden>
Cc: Jacob Pan <address@hidden>
Cc: Peter Xu <address@hidden>
Cc: Eric Auger <address@hidden>
Cc: Yi Sun <address@hidden>
Cc: David Gibson <address@hidden>
Signed-off-by: Liu Yi L <address@hidden>
---
hw/vfio/pci.c | 39 +++++++++++++++++++++++++++++++++++++++
include/hw/iommu/iommu.h | 11 +++++++++++
2 files changed, 50 insertions(+)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 8721ff6..012b8ed 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2767,6 +2767,41 @@ static void
vfio_iommu_pasid_free_notify(IOMMUCTXNotifier *n,
pasid_req->free_result = ret;
}
+static void vfio_iommu_pasid_bind_notify(IOMMUCTXNotifier *n,
+ IOMMUCTXEventData *event_data)
+{
+#ifdef __linux__
+ VFIOIOMMUContext *giommu_ctx = container_of(n, VFIOIOMMUContext, n);
+ VFIOContainer *container = giommu_ctx->container;
+ IOMMUCTXPASIDBindData *pasid_bind =
+ (IOMMUCTXPASIDBindData *) event_data->data;
+ struct vfio_iommu_type1_bind *bind;
+ struct iommu_gpasid_bind_data *bind_data;
+ unsigned long argsz;
+
+ argsz = sizeof(*bind) + sizeof(*bind_data);
+ bind = g_malloc0(argsz);
+ bind->argsz = argsz;
+ bind->bind_type = VFIO_IOMMU_BIND_GUEST_PASID;
+ bind_data = (struct iommu_gpasid_bind_data *) &bind->data;
+ *bind_data = *pasid_bind->data;
+
+ if (pasid_bind->flag & IOMMU_CTX_BIND_PASID) {
+ if (ioctl(container->fd, VFIO_IOMMU_BIND, bind) != 0) {
+ error_report("%s: pasid (%llu:%llu) bind failed: %d", __func__,
+ bind_data->gpasid, bind_data->hpasid, -errno);
+ }
+ } else if (pasid_bind->flag & IOMMU_CTX_UNBIND_PASID) {
+ if (ioctl(container->fd, VFIO_IOMMU_UNBIND, bind) != 0) {
+ error_report("%s: pasid (%llu:%llu) unbind failed: %d", __func__,
+ bind_data->gpasid, bind_data->hpasid, -errno);
+ }
+ }
+
+ g_free(bind);
+#endif
+}
+
static void vfio_realize(PCIDevice *pdev, Error **errp)
{
VFIOPCIDevice *vdev = PCI_VFIO(pdev);
@@ -3079,6 +3114,10 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
iommu_context,
vfio_iommu_pasid_free_notify,
IOMMU_CTX_EVENT_PASID_FREE);
+ vfio_register_iommu_ctx_notifier(vdev,
+ iommu_context,
+ vfio_iommu_pasid_bind_notify,
+ IOMMU_CTX_EVENT_PASID_BIND);
}
return;
diff --git a/include/hw/iommu/iommu.h b/include/hw/iommu/iommu.h
index 4352afd..4f21aa1 100644
--- a/include/hw/iommu/iommu.h
+++ b/include/hw/iommu/iommu.h
@@ -33,6 +33,7 @@ typedef struct IOMMUContext IOMMUContext;
enum IOMMUCTXEvent {
IOMMU_CTX_EVENT_PASID_ALLOC,
IOMMU_CTX_EVENT_PASID_FREE,
+ IOMMU_CTX_EVENT_PASID_BIND,
IOMMU_CTX_EVENT_NUM,
};
typedef enum IOMMUCTXEvent IOMMUCTXEvent;
@@ -50,6 +51,16 @@ union IOMMUCTXPASIDReqDesc {
};
typedef union IOMMUCTXPASIDReqDesc IOMMUCTXPASIDReqDesc;
+struct IOMMUCTXPASIDBindData {
+#define IOMMU_CTX_BIND_PASID (1 << 0)
+#define IOMMU_CTX_UNBIND_PASID (1 << 1)
+ uint32_t flag;
+#ifdef __linux__
+ struct iommu_gpasid_bind_data *data;
+#endif
+};
+typedef struct IOMMUCTXPASIDBindData IOMMUCTXPASIDBindData;
+
struct IOMMUCTXEventData {
IOMMUCTXEvent event;
uint64_t length;
--
2.7.4
- [RFC v2 09/22] vfio/pci: add iommu_context notifier for pasid alloc/free, (continued)
- [RFC v2 09/22] vfio/pci: add iommu_context notifier for pasid alloc/free, Liu Yi L, 2019/10/24
- [RFC v2 10/22] intel_iommu: add virtual command capability support, Liu Yi L, 2019/10/24
- [RFC v2 05/22] vfio/common: add iommu_ctx_notifier in container, Liu Yi L, 2019/10/24
- [RFC v2 03/22] intel_iommu: modify x-scalable-mode to be string option, Liu Yi L, 2019/10/24
- [RFC v2 04/22] hw/iommu: introduce IOMMUContext, Liu Yi L, 2019/10/24
- [RFC v2 07/22] hw/pci: introduce pci_device_iommu_context(), Liu Yi L, 2019/10/24
- [RFC v2 08/22] intel_iommu: provide get_iommu_context() callback, Liu Yi L, 2019/10/24
- [RFC v2 02/22] header update VFIO/IOMMU vSVA APIs against 5.4.0-rc3+, Liu Yi L, 2019/10/24
- [RFC v2 11/22] intel_iommu: process pasid cache invalidation, Liu Yi L, 2019/10/24
- [RFC v2 12/22] intel_iommu: add present bit check for pasid table entries, Liu Yi L, 2019/10/24
- [RFC v2 14/22] vfio/pci: add iommu_context notifier for pasid bind/unbind,
Liu Yi L <=
- [RFC v2 13/22] intel_iommu: add PASID cache management infrastructure, Liu Yi L, 2019/10/24
- [RFC v2 15/22] intel_iommu: bind/unbind guest page table to host, Liu Yi L, 2019/10/24
- [RFC v2 17/22] intel_iommu: replay pasid binds after context cache invalidation, Liu Yi L, 2019/10/24
- [RFC v2 16/22] intel_iommu: replay guest pasid bindings to host, Liu Yi L, 2019/10/24
- [RFC v2 18/22] intel_iommu: do not passdown pasid bind for PASID #0, Liu Yi L, 2019/10/24
- [RFC v2 19/22] vfio/pci: add iommu_context notifier for PASID-based iotlb flush, Liu Yi L, 2019/10/24
- [RFC v2 20/22] intel_iommu: process PASID-based iotlb invalidation, Liu Yi L, 2019/10/24
- [RFC v2 21/22] intel_iommu: propagate PASID-based iotlb invalidation to host, Liu Yi L, 2019/10/24
- [RFC v2 22/22] intel_iommu: process PASID-based Device-TLB invalidation, Liu Yi L, 2019/10/24
- Re: [RFC v2 00/22] intel_iommu: expose Shared Virtual Addressing to VM, no-reply, 2019/10/25