kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/6] iommufd: Add nesting infrastructure (part 2/2)
@ 2023-11-17 13:07 Yi Liu
  2023-11-17 13:07 ` [PATCH v6 1/6] iommu: Add cache_invalidate_user op Yi Liu
                   ` (7 more replies)
  0 siblings, 8 replies; 93+ messages in thread
From: Yi Liu @ 2023-11-17 13:07 UTC (permalink / raw)
  To: joro, alex.williamson, jgg, kevin.tian, robin.murphy, baolu.lu
  Cc: cohuck, eric.auger, nicolinc, kvm, mjrosato, chao.p.peng,
	yi.l.liu, yi.y.sun, peterx, jasowang, shameerali.kolothum.thodi,
	lulu, suravee.suthikulpanit, iommu, linux-kernel, linux-kselftest,
	zhenzhong.duan, joao.m.martins, xin.zeng, yan.y.zhao

Nested translation is a hardware feature that is supported by many modern
IOMMU hardwares. It has two stages (stage-1, stage-2) address translation
to get access to the physical address. stage-1 translation table is owned
by userspace (e.g. by a guest OS), while stage-2 is owned by kernel. Changes
to stage-1 translation table should be followed by an IOTLB invalidation.

Take Intel VT-d as an example, the stage-1 translation table is I/O page
table. As the below diagram shows, guest I/O page table pointer in GPA
(guest physical address) is passed to host and be used to perform the stage-1
address translation. Along with it, modifications to present mappings in the
guest I/O page table should be followed with an IOTLB invalidation.

    .-------------.  .---------------------------.
    |   vIOMMU    |  | Guest I/O page table      |
    |             |  '---------------------------'
    .----------------/
    | PASID Entry |--- PASID cache flush --+
    '-------------'                        |
    |             |                        V
    |             |           I/O page table pointer in GPA
    '-------------'
Guest
------| Shadow |---------------------------|--------
      v        v                           v
Host
    .-------------.  .------------------------.
    |   pIOMMU    |  |  FS for GIOVA->GPA     |
    |             |  '------------------------'
    .----------------/  |
    | PASID Entry |     V (Nested xlate)
    '----------------\.----------------------------------.
    |             |   | SS for GPA->HPA, unmanaged domain|
    |             |   '----------------------------------'
    '-------------'
Where:
 - FS = First stage page tables
 - SS = Second stage page tables
<Intel VT-d Nested translation>

This series adds the cache invalidation path for the userspace to invalidate
cache after modifying the stage-1 page table. This is based on the first part
of nesting [1]

Complete code can be found in [2], QEMU could can be found in [3].

At last, this is a team work together with Nicolin Chen, Lu Baolu. Thanks
them for the help. ^_^. Look forward to your feedbacks.

[1] https://lore.kernel.org/linux-iommu/20231026044216.64964-1-yi.l.liu@intel.com/ - merged
[2] https://github.com/yiliu1765/iommufd/tree/iommufd_nesting
[3] https://github.com/yiliu1765/qemu/tree/zhenzhong/wip/iommufd_nesting_rfcv1

Change log:

v6:
 - No much change, just rebase on top of 6.7-rc1 as part 1/2 is merged

v5: https://lore.kernel.org/linux-iommu/20231020092426.13907-1-yi.l.liu@intel.com/#t
 - Split the iommufd nesting series into two parts of alloc_user and
   invalidation (Jason)
 - Split IOMMUFD_OBJ_HW_PAGETABLE to IOMMUFD_OBJ_HWPT_PAGING/_NESTED, and
   do the same with the structures/alloc()/abort()/destroy(). Reworked the
   selftest accordingly too. (Jason)
 - Move hwpt/data_type into struct iommu_user_data from standalone op
   arguments. (Jason)
 - Rename hwpt_type to be data_type, the HWPT_TYPE to be HWPT_ALLOC_DATA,
   _TYPE_DEFAULT to be _ALLOC_DATA_NONE (Jason, Kevin)
 - Rename iommu_copy_user_data() to iommu_copy_struct_from_user() (Kevin)
 - Add macro to the iommu_copy_struct_from_user() to calculate min_size
   (Jason)
 - Fix two bugs spotted by ZhaoYan

v4: https://lore.kernel.org/linux-iommu/20230921075138.124099-1-yi.l.liu@intel.com/
 - Separate HWPT alloc/destroy/abort functions between user-managed HWPTs
   and kernel-managed HWPTs
 - Rework invalidate uAPI to be a multi-request array-based design
 - Add a struct iommu_user_data_array and a helper for driver to sanitize
   and copy the entry data from user space invalidation array
 - Add a patch fixing TEST_LENGTH() in selftest program
 - Drop IOMMU_RESV_IOVA_RANGES patches
 - Update kdoc and inline comments
 - Drop the code to add IOMMU_RESV_SW_MSI to kernel-managed HWPT in nested translation,
   this does not change the rule that resv regions should only be added to the
   kernel-managed HWPT. The IOMMU_RESV_SW_MSI stuff will be added in later series
   as it is needed only by SMMU so far.

v3: https://lore.kernel.org/linux-iommu/20230724110406.107212-1-yi.l.liu@intel.com/
 - Add new uAPI things in alphabetical order
 - Pass in "enum iommu_hwpt_type hwpt_type" to op->domain_alloc_user for
   sanity, replacing the previous op->domain_alloc_user_data_len solution
 - Return ERR_PTR from domain_alloc_user instead of NULL
 - Only add IOMMU_RESV_SW_MSI to kernel-managed HWPT in nested translation (Kevin)
 - Add IOMMU_RESV_IOVA_RANGES to report resv iova ranges to userspace hence
   userspace is able to exclude the ranges in the stage-1 HWPT (e.g. guest I/O
   page table). (Kevin)
 - Add selftest coverage for the new IOMMU_RESV_IOVA_RANGES ioctl
 - Minor changes per Kevin's inputs

v2: https://lore.kernel.org/linux-iommu/20230511143844.22693-1-yi.l.liu@intel.com/
 - Add union iommu_domain_user_data to include all user data structures to avoid
   passing void * in kernel APIs.
 - Add iommu op to return user data length for user domain allocation
 - Rename struct iommu_hwpt_alloc::data_type to be hwpt_type
 - Store the invalidation data length in iommu_domain_ops::cache_invalidate_user_data_len
 - Convert cache_invalidate_user op to be int instead of void
 - Remove @data_type in struct iommu_hwpt_invalidate
 - Remove out_hwpt_type_bitmap in struct iommu_hw_info hence drop patch 08 of v1

v1: https://lore.kernel.org/linux-iommu/20230309080910.607396-1-yi.l.liu@intel.com/

Thanks,
	Yi Liu

Lu Baolu (1):
  iommu: Add cache_invalidate_user op

Nicolin Chen (4):
  iommu: Add iommu_copy_struct_from_user_array helper
  iommufd/selftest: Add mock_domain_cache_invalidate_user support
  iommufd/selftest: Add IOMMU_TEST_OP_MD_CHECK_IOTLB test op
  iommufd/selftest: Add coverage for IOMMU_HWPT_INVALIDATE ioctl

Yi Liu (1):
  iommufd: Add IOMMU_HWPT_INVALIDATE

 drivers/iommu/iommufd/hw_pagetable.c          | 35 ++++++++
 drivers/iommu/iommufd/iommufd_private.h       |  9 ++
 drivers/iommu/iommufd/iommufd_test.h          | 22 +++++
 drivers/iommu/iommufd/main.c                  |  3 +
 drivers/iommu/iommufd/selftest.c              | 69 +++++++++++++++
 include/linux/iommu.h                         | 84 +++++++++++++++++++
 include/uapi/linux/iommufd.h                  | 35 ++++++++
 tools/testing/selftests/iommu/iommufd.c       | 75 +++++++++++++++++
 tools/testing/selftests/iommu/iommufd_utils.h | 63 ++++++++++++++
 9 files changed, 395 insertions(+)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 93+ messages in thread

end of thread, other threads:[~2024-01-08  8:37 UTC | newest]

Thread overview: 93+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-17 13:07 [PATCH v6 0/6] iommufd: Add nesting infrastructure (part 2/2) Yi Liu
2023-11-17 13:07 ` [PATCH v6 1/6] iommu: Add cache_invalidate_user op Yi Liu
2023-11-20  7:53   ` Tian, Kevin
2023-12-06 18:32   ` Jason Gunthorpe
2023-12-06 18:43     ` Nicolin Chen
2023-12-06 18:50       ` Jason Gunthorpe
2023-12-07  6:53         ` Yi Liu
2024-01-08  7:32   ` Binbin Wu
2023-11-17 13:07 ` [PATCH v6 2/6] iommufd: Add IOMMU_HWPT_INVALIDATE Yi Liu
2023-11-20  8:09   ` Tian, Kevin
2023-11-20  8:29     ` Yi Liu
2023-11-20  8:34       ` Tian, Kevin
2023-11-20 17:36         ` Nicolin Chen
2023-11-21  2:50           ` Tian, Kevin
2023-11-21  5:24             ` Nicolin Chen
2023-11-24  2:36               ` Tian, Kevin
2023-11-27 19:53                 ` Nicolin Chen
2023-11-28  6:01                   ` Yi Liu
2023-11-29  0:54                     ` Nicolin Chen
2023-11-28  8:03                   ` Tian, Kevin
2023-11-29  0:51                     ` Nicolin Chen
2023-11-29  0:57                       ` Jason Gunthorpe
2023-11-29  1:09                         ` Nicolin Chen
2023-11-29 19:58                           ` Jason Gunthorpe
2023-11-29 22:07                             ` Nicolin Chen
2023-11-30  0:08                               ` Jason Gunthorpe
2023-11-30 20:41                                 ` Nicolin Chen
2023-12-01  0:45                                   ` Jason Gunthorpe
2023-12-01  4:29                                     ` Nicolin Chen
2023-12-01 12:55                                       ` Jason Gunthorpe
2023-12-01 19:58                                         ` Nicolin Chen
2023-12-01 20:43                                           ` Jason Gunthorpe
2023-12-01 22:12                                             ` Nicolin Chen
2023-12-04 14:48                                               ` Jason Gunthorpe
2023-12-05 17:33                                                 ` Nicolin Chen
2023-12-06 12:48                                                   ` Jason Gunthorpe
2023-12-01  3:51                         ` Yi Liu
2023-12-01  4:50                           ` Nicolin Chen
2023-12-01  5:19                             ` Tian, Kevin
2023-12-01  7:05                               ` Yi Liu
2023-12-01  7:10                                 ` Tian, Kevin
2023-12-01  9:08                                   ` Yi Liu
2023-11-21  5:02   ` Baolu Lu
2023-11-21  5:19     ` Nicolin Chen
2023-11-28  5:54       ` Yi Liu
2023-12-06 18:33   ` Jason Gunthorpe
2023-12-07  6:59   ` Yi Liu
2023-12-07  9:04     ` Tian, Kevin
2023-12-07 14:42       ` Jason Gunthorpe
2023-12-11  7:53         ` Yi Liu
2023-12-11 13:21           ` Jason Gunthorpe
2023-12-12 13:45             ` Liu, Yi L
2023-12-12 14:40               ` Jason Gunthorpe
2023-12-13 13:47                 ` Liu, Yi L
2023-12-13 14:11                   ` Jason Gunthorpe
2023-12-11  7:49       ` Yi Liu
2023-11-17 13:07 ` [PATCH v6 3/6] iommu: Add iommu_copy_struct_from_user_array helper Yi Liu
2023-11-20  8:17   ` Tian, Kevin
2023-11-20 17:25     ` Nicolin Chen
2023-11-21  2:48       ` Tian, Kevin
2024-01-08  8:37   ` Binbin Wu
2023-11-17 13:07 ` [PATCH v6 4/6] iommufd/selftest: Add mock_domain_cache_invalidate_user support Yi Liu
2023-12-06 18:16   ` Jason Gunthorpe
2023-12-11 11:21     ` Yi Liu
2023-11-17 13:07 ` [PATCH v6 5/6] iommufd/selftest: Add IOMMU_TEST_OP_MD_CHECK_IOTLB test op Yi Liu
2023-11-17 13:07 ` [PATCH v6 6/6] iommufd/selftest: Add coverage for IOMMU_HWPT_INVALIDATE ioctl Yi Liu
2023-12-06 18:19   ` Jason Gunthorpe
2023-12-11 11:28     ` Yi Liu
2023-12-11 13:06       ` Jason Gunthorpe
2023-12-09  1:47 ` [PATCH v6 0/6] iommufd: Add nesting infrastructure (part 2/2) Jason Gunthorpe
2023-12-11  2:29   ` Tian, Kevin
2023-12-11 12:36     ` Yi Liu
2023-12-11 13:05       ` Jason Gunthorpe
2023-12-11 15:34         ` Suthikulpanit, Suravee
2023-12-11 16:06           ` Jason Gunthorpe
2023-12-11 12:35   ` Yi Liu
2023-12-11 13:20     ` Jason Gunthorpe
2023-12-11 20:11       ` Nicolin Chen
2023-12-11 21:48         ` Jason Gunthorpe
2023-12-11 17:35   ` Suthikulpanit, Suravee
2023-12-11 17:45     ` Jason Gunthorpe
2023-12-11 21:27   ` Nicolin Chen
2023-12-11 21:57     ` Jason Gunthorpe
2023-12-12  7:30       ` Nicolin Chen
2023-12-12 14:44         ` Jason Gunthorpe
2023-12-12 19:13           ` Nicolin Chen
2023-12-12 19:21             ` Jason Gunthorpe
2023-12-12 20:05               ` Nicolin Chen
2023-12-13 12:40                 ` Jason Gunthorpe
2023-12-13 19:54                   ` Nicolin Chen
     [not found] ` <CGME20231217215720eucas1p2a590aca62ce8eb5ba81df6bc8b1a785d@eucas1p2.samsung.com>
2023-12-17 11:21   ` Joel Granados
2023-12-19  9:26     ` Yi Liu
2023-12-20 11:23       ` Joel Granados

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).