mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Nicolin Chen <nicolinc@nvidia.com>
To: <jgg@nvidia.com>, <kevin.tian@intel.com>, <will@kernel.org>
Cc: <joro@8bytes.org>, <suravee.suthikulpanit@amd.com>,
	<robin.murphy@arm.com>, <dwmw2@infradead.org>,
	<baolu.lu@linux.intel.com>, <shuah@kernel.org>,
	<linux-kernel@vger.kernel.org>, <iommu@lists.linux.dev>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-kselftest@vger.kernel.org>, <eric.auger@redhat.com>,
	<jean-philippe@linaro.org>, <mdf@kernel.org>,
	<mshavit@google.com>, <shameerali.kolothum.thodi@huawei.com>,
	<smostafa@google.com>, <yi.l.liu@intel.com>, <aik@amd.com>,
	<patches@lists.linux.dev>
Subject: [PATCH v3 10/11] Documentation: userspace-api: iommufd: Update vIOMMU
Date: Wed, 9 Oct 2024 09:38:10 -0700	[thread overview]
Message-ID: <0b56b2a4e38e8f4cf3a96c4fb2ccbbf4b5c67da8.1728491453.git.nicolinc@nvidia.com> (raw)
In-Reply-To: <cover.1728491453.git.nicolinc@nvidia.com>

With the introduction of the new object and its infrastructure, update the
doc to reflect that and add a new graph.

Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
---
 Documentation/userspace-api/iommufd.rst | 66 ++++++++++++++++++++++++-
 1 file changed, 65 insertions(+), 1 deletion(-)

diff --git a/Documentation/userspace-api/iommufd.rst b/Documentation/userspace-api/iommufd.rst
index 2deba93bf159..37eb1adda57b 100644
--- a/Documentation/userspace-api/iommufd.rst
+++ b/Documentation/userspace-api/iommufd.rst
@@ -63,6 +63,37 @@ Following IOMMUFD objects are exposed to userspace:
   space usually has mappings from guest-level I/O virtual addresses to guest-
   level physical addresses.
 
+ - IOMMUFD_OBJ_VIOMMU, representing a slice of the physical IOMMU instance,
+   passed to or shared with a VM. It may be some HW-accelerated virtualization
+   features and some SW resources used by the VM. For examples:
+   * Security namespace for guest owned ID, e.g. guest-controlled cache tags
+   * Access to a sharable nesting parent pagetable across physical IOMMUs
+   * Virtualization of various platforms IDs, e.g. RIDs and others
+   * Delivery of paravirtualized invalidation
+   * Direct assigned invalidation queues
+   * Direct assigned interrupts
+   * Non-affiliated event reporting
+   Such a vIOMMU object generally has the access to a nesting parent pagetable
+   to support some HW-accelerated virtualization features. So, a vIOMMU object
+   must be created given a nesting parent HWPT_PAGING object, and then it would
+   encapsulate that HWPT_PAGING object. Therefore, a vIOMMU object can be used
+   to allocate an HWPT_NESTED object in place of the encapsulated HWPT_PAGING.
+
+   .. note::
+
+      The name "vIOMMU" isn't necessarily identical to a virtualized IOMMU in a
+      VM. A VM can have one giant virtualized IOMMU running on a machine having
+      multiple physical IOMMUs, in which case the VMM will dispatch the requests
+      or configurations from this single virtualized IOMMU instance to multiple
+      vIOMMU objects created for individual slices of different physical IOMMUs.
+      In other words, a vIOMMU object is always a representation of one physical
+      IOMMU, not necessarily of a virtualized IOMMU. For VMMs that want the full
+      virtualization features from physical IOMMUs, it is suggested to build the
+      same number of virtualized IOMMUs as the number of physical IOMMUs, so the
+      passed-through devices would be connected to their own virtualized IOMMUs
+      backed by corresponding vIOMMU objects, in which case a guest OS would do
+      the "dispatch" naturally instead of VMM trappings.
+
 All user-visible objects are destroyed via the IOMMU_DESTROY uAPI.
 
 The diagrams below show relationships between user-visible objects and kernel
@@ -101,6 +132,25 @@ creating the objects and links::
            |------------>|iommu_domain|<----|iommu_domain|<----|device|
                          |____________|     |____________|     |______|
 
+  _______________________________________________________________________
+ |                      iommufd (with vIOMMU)                            |
+ |                                                                       |
+ |                             [5]                                       |
+ |                        _____________                                  |
+ |                       |             |                                 |
+ |        [1]            |    vIOMMU   |          [4]             [2]    |
+ |  ________________     |             |     _____________     ________  |
+ | |                |    |     [3]     |    |             |   |        | |
+ | |      IOAS      |<---|(HWPT_PAGING)|<---| HWPT_NESTED |<--| DEVICE | |
+ | |________________|    |_____________|    |_____________|   |________| |
+ |         |                    |                  |               |     |
+ |_________|____________________|__________________|_______________|_____|
+           |                    |                  |               |
+           |              ______v_____       ______v_____       ___v__
+           | PFN storage |  (paging)  |     |  (nested)  |     |struct|
+           |------------>|iommu_domain|<----|iommu_domain|<----|device|
+                         |____________|     |____________|     |______|
+
 1. IOMMUFD_OBJ_IOAS is created via the IOMMU_IOAS_ALLOC uAPI. An iommufd can
    hold multiple IOAS objects. IOAS is the most generic object and does not
    expose interfaces that are specific to single IOMMU drivers. All operations
@@ -132,7 +182,8 @@ creating the objects and links::
      flag is set.
 
 4. IOMMUFD_OBJ_HWPT_NESTED can be only manually created via the IOMMU_HWPT_ALLOC
-   uAPI, provided an hwpt_id via @pt_id to associate the new HWPT_NESTED object
+   uAPI, provided an hwpt_id or a viommu_id of a vIOMMU object encapsulating a
+   nesting parent HWPT_PAGING via @pt_id to associate the new HWPT_NESTED object
    to the corresponding HWPT_PAGING object. The associating HWPT_PAGING object
    must be a nesting parent manually allocated via the same uAPI previously with
    an IOMMU_HWPT_ALLOC_NEST_PARENT flag, otherwise the allocation will fail. The
@@ -149,6 +200,18 @@ creating the objects and links::
       created via the same IOMMU_HWPT_ALLOC uAPI. The difference is at the type
       of the object passed in via the @pt_id field of struct iommufd_hwpt_alloc.
 
+5. IOMMUFD_OBJ_VIOMMU can be only manually created via the IOMMU_VIOMMU_ALLOC
+   uAPI, provided a dev_id (for the device's physical IOMMU to back the vIOMMU)
+   and an hwpt_id (to associate the vIOMMU to a nesting parent HWPT_PAGING). The
+   iommufd core will link the vIOMMU object to the struct iommu_device that the
+   struct device is behind. And an IOMMU driver can implement a viommu_alloc op
+   to allocate its own vIOMMU data structure embedding the core-level structure
+   iommufd_viommu and some driver-specific data. If necessary, the driver can
+   also configure its HW virtualization feature for that vIOMMU (and thus for
+   the VM). Successful completion of this operation sets up the linkages between
+   the vIOMMU object and the HWPT_PAGING, then this vIOMMU object can be used
+   as a nesting parent object to allocate an HWPT_NESTED object described above.
+
 A device can only bind to an iommufd due to DMA ownership claim and attach to at
 most one IOAS object (no support of PASID yet).
 
@@ -161,6 +224,7 @@ User visible objects are backed by following datastructures:
 - iommufd_device for IOMMUFD_OBJ_DEVICE.
 - iommufd_hwpt_paging for IOMMUFD_OBJ_HWPT_PAGING.
 - iommufd_hwpt_nested for IOMMUFD_OBJ_HWPT_NESTED.
+- iommufd_viommu for IOMMUFD_OBJ_VIOMMU.
 
 Several terminologies when looking at these datastructures:
 
-- 
2.43.0


  parent reply	other threads:[~2024-10-09 16:39 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-09 16:38 [PATCH v3 00/11] cover-letter: iommufd: Add vIOMMU infrastructure (Part-1) Nicolin Chen
2024-10-09 16:38 ` [PATCH v3 01/11] iommufd: Move struct iommufd_object to public iommufd header Nicolin Chen
2024-10-09 16:38 ` [PATCH v3 02/11] iommufd: Rename _iommufd_object_alloc to iommufd_object_alloc_elm Nicolin Chen
2024-10-17 14:14   ` Jason Gunthorpe
2024-10-17 15:37     ` Jason Gunthorpe
2024-10-17 16:12       ` Nicolin Chen
2024-10-17 16:35         ` Jason Gunthorpe
2024-10-17 16:48           ` Nicolin Chen
2024-10-17 16:54             ` Jason Gunthorpe
2024-10-21  1:26       ` Alexey Kardashevskiy
2024-10-21 18:21         ` Nicolin Chen
2024-10-09 16:38 ` [PATCH v3 03/11] iommufd: Introduce IOMMUFD_OBJ_VIOMMU and its related struct Nicolin Chen
2024-10-12  3:23   ` Zhangfei Gao
2024-10-12  4:49     ` Nicolin Chen
2024-10-12 10:18       ` Zhangfei Gao
2024-10-14  7:58         ` Zhangfei Gao
2024-10-14 15:46           ` Nicolin Chen
2024-10-15  1:15             ` Zhangfei Gao
2024-10-15  2:01               ` Nicolin Chen
2024-10-15 18:44                 ` Nicolin Chen
2024-10-16  1:56                   ` Zhangfei Gao
2024-10-16  6:51                     ` Nicolin Chen
2024-10-16  7:08                       ` Zhangfei Gao
2024-10-17 16:33   ` Jason Gunthorpe
2024-10-17 17:01     ` Nicolin Chen
2024-10-17 17:07       ` Jason Gunthorpe
2024-10-09 16:38 ` [PATCH v3 04/11] iommufd/viommu: Add IOMMU_VIOMMU_ALLOC ioctl Nicolin Chen
2024-10-16  6:38   ` Nicolin Chen
2024-10-17 16:40   ` Jason Gunthorpe
2024-10-21  8:11   ` Alexey Kardashevskiy
2024-10-21 12:19     ` Jason Gunthorpe
2024-10-21 23:41     ` Nicolin Chen
2024-10-09 16:38 ` [PATCH v3 05/11] iommu: Pass in a viommu pointer to domain_alloc_user op Nicolin Chen
2024-10-17 16:51   ` Jason Gunthorpe
2024-10-17 17:21     ` Nicolin Chen
2024-10-17 17:38       ` Jason Gunthorpe
2024-10-17 17:40         ` Nicolin Chen
2024-10-09 16:38 ` [PATCH v3 06/11] iommufd: Allow pt_id to carry viommu_id for IOMMU_HWPT_ALLOC Nicolin Chen
2024-10-17 17:06   ` Jason Gunthorpe
2024-10-09 16:38 ` [PATCH v3 07/11] iommufd/selftest: Add refcount to mock_iommu_device Nicolin Chen
2024-10-17 17:13   ` Jason Gunthorpe
2024-10-09 16:38 ` [PATCH v3 08/11] iommufd/selftest: Add IOMMU_VIOMMU_TYPE_SELFTEST Nicolin Chen
2024-10-17 17:15   ` Jason Gunthorpe
2024-10-17 17:25     ` Nicolin Chen
2024-10-09 16:38 ` [PATCH v3 09/11] iommufd/selftest: Add IOMMU_VIOMMU_ALLOC test coverage Nicolin Chen
2024-10-21  8:30   ` Alexey Kardashevskiy
2024-10-21 18:25     ` Nicolin Chen
2024-10-09 16:38 ` Nicolin Chen [this message]
2024-10-17 19:12   ` [PATCH v3 10/11] Documentation: userspace-api: iommufd: Update vIOMMU Jason Gunthorpe
2024-10-09 16:38 ` [PATCH v3 11/11] iommu/arm-smmu-v3: Add IOMMU_VIOMMU_TYPE_ARM_SMMUV3 support Nicolin Chen
2024-10-17 16:28   ` Nicolin Chen
2024-10-17 16:41     ` Jason Gunthorpe
2024-10-17 16:43       ` Nicolin Chen
2024-10-17 16:48         ` Jason Gunthorpe
2024-10-17 18:40   ` Jason Gunthorpe
2024-10-17 18:48     ` Nicolin Chen
2024-10-09 16:38 ` [PATCH v3 00/16] cover-letter: iommufd: Add vIOMMU infrastructure (Part-2: vDEVICE) Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 01/16] iommufd/viommu: Introduce IOMMUFD_OBJ_VDEVICE and its related struct Nicolin Chen
2024-10-17 18:45     ` Jason Gunthorpe
2024-10-20  1:35       ` Nicolin Chen
2024-10-21 12:21         ` Jason Gunthorpe
2024-10-21 16:42           ` Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 02/16] iommufd/viommu: Add a default_viommu_ops for IOMMU_VIOMMU_TYPE_DEFAULT Nicolin Chen
2024-10-17 18:47     ` Jason Gunthorpe
2024-10-17 18:50       ` Nicolin Chen
2024-10-17 18:52         ` Jason Gunthorpe
2024-10-09 16:38   ` [PATCH v3 03/16] iommufd/viommu: Add IOMMU_VDEVICE_ALLOC ioctl Nicolin Chen
2024-10-17 18:52     ` Jason Gunthorpe
2024-10-20  1:42       ` Nicolin Chen
2024-10-21 12:22         ` Jason Gunthorpe
2024-10-21 16:42           ` Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 04/16] iommufd/selftest: Add IOMMU_VDEVICE_ALLOC test coverage Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 05/16] iommu/viommu: Add cache_invalidate for IOMMU_VIOMMU_TYPE_DEFAULT Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 06/16] iommufd/hw_pagetable: Allow viommu->ops->cache_invalidate for hwpt_nested Nicolin Chen
2024-10-17 18:54     ` Jason Gunthorpe
2024-10-09 16:38   ` [PATCH v3 07/16] iommufd: Allow hwpt_id to carry viommu_id for IOMMU_HWPT_INVALIDATE Nicolin Chen
2024-10-17 19:08     ` Jason Gunthorpe
2024-10-09 16:38   ` [PATCH v3 08/16] iommu: Add iommu_copy_struct_from_full_user_array helper Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 09/16] iommufd/viommu: Add vdev_to_dev helper Nicolin Chen
2024-10-17 19:09     ` Jason Gunthorpe
2024-10-09 16:38   ` [PATCH v3 10/16] iommufd/selftest: Add mock_viommu_cache_invalidate Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 11/16] iommufd/selftest: Add IOMMU_TEST_OP_DEV_CHECK_CACHE test command Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 12/16] iommufd/selftest: Add vIOMMU coverage for IOMMU_HWPT_INVALIDATE ioctl Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 13/16] Documentation: userspace-api: iommufd: Update vDEVICE Nicolin Chen
2024-10-17 19:12     ` Jason Gunthorpe
2024-10-09 16:38   ` [PATCH v3 14/16] iommu/arm-smmu-v3: Add arm_vsmmu_cache_invalidate Nicolin Chen
2024-10-12  3:12     ` Zhangfei Gao
2024-10-12  4:56       ` Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 15/16] iommu/arm-smmu-v3: Allow ATS for IOMMU_DOMAIN_NESTED Nicolin Chen
2024-10-09 16:38   ` [PATCH v3 16/16] iommu/arm-smmu-v3: Update comments about ATS and bypass Nicolin Chen
2024-10-17 19:14   ` [PATCH v3 00/16] cover-letter: iommufd: Add vIOMMU infrastructure (Part-2: vDEVICE) Jason Gunthorpe
2024-10-17 19:19     ` Nicolin Chen

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=0b56b2a4e38e8f4cf3a96c4fb2ccbbf4b5c67da8.1728491453.git.nicolinc@nvidia.com \
    --to=nicolinc@nvidia.com \
    --cc=aik@amd.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=dwmw2@infradead.org \
    --cc=eric.auger@redhat.com \
    --cc=iommu@lists.linux.dev \
    --cc=jean-philippe@linaro.org \
    --cc=jgg@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=mdf@kernel.org \
    --cc=mshavit@google.com \
    --cc=patches@lists.linux.dev \
    --cc=robin.murphy@arm.com \
    --cc=shameerali.kolothum.thodi@huawei.com \
    --cc=shuah@kernel.org \
    --cc=smostafa@google.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=will@kernel.org \
    --cc=yi.l.liu@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

all inboxes | Powered by JetHome®