[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC v3.1 06/22] vfio/pci: init HostIOMMUContext per-container
From: |
Liu Yi L |
Subject: |
[RFC v3.1 06/22] vfio/pci: init HostIOMMUContext per-container |
Date: |
Sat, 22 Feb 2020 00:07:07 -0800 |
After confirming dual stage DMA translation support with kernel by
checking VFIO_TYPE1_NESTING_IOMMU, VFIO inits HostIOMMUContet instance
and exposes it to PCI layer. Thus vIOMMU emualtors may make use of
such capability by leveraging the ops provided by HostIOMMUContext.
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>
Cc: Alex Williamson <address@hidden>
Signed-off-by: Liu Yi L <address@hidden>
---
hw/vfio/common.c | 11 +++++++++++
hw/vfio/pci.c | 21 +++++++++++++++++++++
include/hw/vfio/vfio-common.h | 2 ++
3 files changed, 34 insertions(+)
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
index be1a9e5..9ab62a6 100644
--- a/hw/vfio/common.c
+++ b/hw/vfio/common.c
@@ -1179,10 +1179,15 @@ static int vfio_get_iommu_type(VFIOContainer *container,
return -EINVAL;
}
+static struct HostIOMMUOps vfio_host_icx_ops = {
+/* To be added later */
+};
+
static int vfio_init_container(VFIOContainer *container, int group_fd,
Error **errp)
{
int iommu_type, ret;
+ uint64_t flags = 0;
iommu_type = vfio_get_iommu_type(container, errp);
if (iommu_type < 0) {
@@ -1210,6 +1215,11 @@ static int vfio_init_container(VFIOContainer *container,
int group_fd,
return -errno;
}
+ if (iommu_type == VFIO_TYPE1_NESTING_IOMMU) {
+ host_iommu_ctx_init(&container->host_icx,
+ flags, &vfio_host_icx_ops);
+ }
+
container->iommu_type = iommu_type;
return 0;
}
@@ -1456,6 +1466,7 @@ static void vfio_disconnect_container(VFIOGroup *group)
}
trace_vfio_disconnect_container(container->fd);
+ host_iommu_ctx_destroy(&container->host_icx);
close(container->fd);
g_free(container);
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 5e75a95..df79675 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2712,11 +2712,20 @@ static void vfio_unregister_req_notifier(VFIOPCIDevice
*vdev)
vdev->req_enabled = false;
}
+static HostIOMMUContext *vfio_host_dma_iommu(PCIDevice *pdev)
+{
+ VFIOPCIDevice *vdev = PCI_VFIO(pdev);
+ VFIOContainer *container = vdev->vbasedev.group->container;
+
+ return &container->host_icx;
+}
+
static void vfio_realize(PCIDevice *pdev, Error **errp)
{
VFIOPCIDevice *vdev = PCI_VFIO(pdev);
VFIODevice *vbasedev_iter;
VFIOGroup *group;
+ VFIOContainer *container;
char *tmp, *subsys, group_path[PATH_MAX], *group_name;
Error *err = NULL;
ssize_t len;
@@ -3028,6 +3037,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
vfio_register_req_notifier(vdev);
vfio_setup_resetfn_quirk(vdev);
+ container = vdev->vbasedev.group->container;
+ if (container->host_icx.ops) {
+ pci_device_setup_iommu(pdev, vfio_host_dma_iommu);
+ }
+
return;
out_deregister:
@@ -3072,9 +3086,16 @@ static void vfio_instance_finalize(Object *obj)
static void vfio_exitfn(PCIDevice *pdev)
{
VFIOPCIDevice *vdev = PCI_VFIO(pdev);
+ VFIOContainer *container;
vfio_unregister_req_notifier(vdev);
vfio_unregister_err_notifier(vdev);
+
+ container = vdev->vbasedev.group->container;
+ if (container->host_icx.ops) {
+ pci_device_unset_iommu(pdev);
+ }
+
pci_device_set_intx_routing_notifier(&vdev->pdev, NULL);
if (vdev->irqchip_change_notifier.notify) {
kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier);
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index fd56420..36abe04 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -26,6 +26,7 @@
#include "qemu/notify.h"
#include "ui/console.h"
#include "hw/display/ramfb.h"
+#include "hw/iommu/host_iommu_context.h"
#ifdef CONFIG_LINUX
#include <linux/vfio.h>
#endif
@@ -71,6 +72,7 @@ typedef struct VFIOContainer {
MemoryListener listener;
MemoryListener prereg_listener;
unsigned iommu_type;
+ HostIOMMUContext host_icx;
Error *error;
bool initialized;
unsigned long pgsizes;
--
2.7.4
- [RFC v3.1 00/22] intel_iommu: expose Shared Virtual Addressing to VMs, Liu Yi L, 2020/02/22
- [RFC v3.1 03/22] vfio: check VFIO_TYPE1_NESTING_IOMMU support, Liu Yi L, 2020/02/22
- [RFC v3.1 09/22] hw/pci: add pci_device_host_iommu_context(), Liu Yi L, 2020/02/22
- [RFC v3.1 13/22] vfio: add bind stage-1 page table support, Liu Yi L, 2020/02/22
- [RFC v3.1 06/22] vfio/pci: init HostIOMMUContext per-container,
Liu Yi L <=
- [RFC v3.1 01/22] scripts/update-linux-headers: Import iommu.h, Liu Yi L, 2020/02/22
- [RFC v3.1 05/22] hw/pci: add pci_device_setup_iommu, Liu Yi L, 2020/02/22
- [RFC v3.1 08/22] vfio/common: add pasid_alloc/free support, Liu Yi L, 2020/02/22
- [RFC v3.1 11/22] intel_iommu: process pasid cache invalidation, Liu Yi L, 2020/02/22
- [RFC v3.1 19/22] intel_iommu: process PASID-based iotlb invalidation, Liu Yi L, 2020/02/22
- [RFC v3.1 04/22] hw/iommu: introduce HostIOMMUContext, Liu Yi L, 2020/02/22
- [RFC v3.1 07/22] vfio: get nesting iommu cap info from Kernel, Liu Yi L, 2020/02/22
- [RFC v3.1 10/22] intel_iommu: add virtual command capability support, Liu Yi L, 2020/02/22
- [RFC v3.1 17/22] intel_iommu: do not pass down pasid bind for PASID #0, Liu Yi L, 2020/02/22
- [RFC v3.1 21/22] intel_iommu: process PASID-based Device-TLB invalidation, Liu Yi L, 2020/02/22