qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Liu Yi L <yi.l.liu@intel.com>
To: qemu-devel@nongnu.org, alex.williamson@redhat.com, peterx@redhat.com
Cc: kevin.tian@intel.com, yi.l.liu@intel.com,
	Yi Sun <yi.y.sun@linux.intel.com>,
	kvm@vger.kernel.org, mst@redhat.com, jun.j.tian@intel.com,
	eric.auger@redhat.com, yi.y.sun@intel.com,
	Jacob Pan <jacob.jun.pan@linux.intel.com>,
	pbonzini@redhat.com, david@gibson.dropbear.id.au
Subject: [RFC v3.1 06/22] vfio/pci: init HostIOMMUContext per-container
Date: Sat, 22 Feb 2020 00:07:07 -0800	[thread overview]
Message-ID: <1582358843-51931-7-git-send-email-yi.l.liu@intel.com> (raw)
In-Reply-To: <1582358843-51931-1-git-send-email-yi.l.liu@intel.com>

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 <kevin.tian@intel.com>
Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Eric Auger <eric.auger@redhat.com>
Cc: Yi Sun <yi.y.sun@linux.intel.com>
Cc: David Gibson <david@gibson.dropbear.id.au>
Cc: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Liu Yi L <yi.l.liu@intel.com>
---
 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



  parent reply	other threads:[~2020-02-22  8:10 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-22  8:07 [RFC v3.1 00/22] intel_iommu: expose Shared Virtual Addressing to VMs Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 01/22] scripts/update-linux-headers: Import iommu.h Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 02/22] header file update VFIO/IOMMU vSVA APIs Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 03/22] vfio: check VFIO_TYPE1_NESTING_IOMMU support Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 04/22] hw/iommu: introduce HostIOMMUContext Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 05/22] hw/pci: add pci_device_setup_iommu Liu Yi L
2020-02-22  8:07 ` Liu Yi L [this message]
2020-02-22  8:07 ` [RFC v3.1 07/22] vfio: get nesting iommu cap info from Kernel Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 08/22] vfio/common: add pasid_alloc/free support Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 09/22] hw/pci: add pci_device_host_iommu_context() Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 10/22] intel_iommu: add virtual command capability support Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 11/22] intel_iommu: process pasid cache invalidation Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 12/22] intel_iommu: add PASID cache management infrastructure Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 13/22] vfio: add bind stage-1 page table support Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 14/22] intel_iommu: bind/unbind guest page table to host Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 15/22] intel_iommu: replay guest pasid bindings " Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 16/22] intel_iommu: replay pasid binds after context cache invalidation Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 17/22] intel_iommu: do not pass down pasid bind for PASID #0 Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 18/22] vfio/common: add support for flush iommu stage-1 cache Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 19/22] intel_iommu: process PASID-based iotlb invalidation Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 20/22] intel_iommu: propagate PASID-based iotlb invalidation to host Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 21/22] intel_iommu: process PASID-based Device-TLB invalidation Liu Yi L
2020-02-22  8:07 ` [RFC v3.1 22/22] intel_iommu: modify x-scalable-mode to be string option Liu Yi L
2020-02-22  8:21 ` [RFC v3.1 00/22] intel_iommu: expose Shared Virtual Addressing to VMs no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1582358843-51931-7-git-send-email-yi.l.liu@intel.com \
    --to=yi.l.liu@intel.com \
    --cc=alex.williamson@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=eric.auger@redhat.com \
    --cc=jacob.jun.pan@linux.intel.com \
    --cc=jun.j.tian@intel.com \
    --cc=kevin.tian@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yi.y.sun@intel.com \
    --cc=yi.y.sun@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).