lkml.org 
[lkml]   [2023]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH v6 0/8] Add Intel VT-d nested translation (part 1/2)
    Date
    This is the first part to add Intel VT-d nested translation based on IOMMUFD
    nesting infrastructure. As the iommufd nesting infrastructure series[1],
    iommu core supports new ops to allocate domains with user data. For nesting,
    the user data is vendor-specific, IOMMU_HWPT_DATA_VTD_S1 is defined for
    the Intel VT-d stage-1 page table, it will be used in the stage-1 domain
    allocation path. struct iommu_hwpt_vtd_s1 is defined to pass user_data
    for the Intel VT-d stage-1 domain allocation. This series does not have
    the cache invalidation path, it would be added in part 2/2.

    The first Intel platform supporting nested translation is Sapphire
    Rapids which, unfortunately, has a hardware errata [2] requiring special
    treatment. This errata happens when a stage-1 page table page (either
    level) is located in a stage-2 read-only region. In that case the IOMMU
    hardware may ignore the stage-2 RO permission and still set the A/D bit
    in stage-1 page table entries during page table walking.

    A flag IOMMU_HW_INFO_VTD_ERRATA_772415_SPR17 is introduced to report
    this errata to userspace. With that restriction the user should either
    disable nested translation to favor RO stage-2 mappings or ensure no
    RO stage-2 mapping to enable nested translation.

    Intel-iommu driver is armed with necessary checks to prevent such mix
    in patch8 of this series.

    Qemu currently does add RO mappings though. The vfio agent in Qemu
    simply maps all valid regions in the GPA address space which certainly
    includes RO regions e.g. vbios.

    In reality we don't know a usage relying on DMA reads from the BIOS
    region. Hence finding a way to skip RO regions (e.g. via a discard manager)
    in Qemu might be an acceptable tradeoff. The actual change needs more
    discussion in Qemu community. For now we just hacked Qemu to test.

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

    [1] https://lore.kernel.org/linux-iommu/20231020091946.12173-1-yi.l.liu@intel.com/
    [2] https://www.intel.com/content/www/us/en/content-details/772415/content-details.html
    [3] https://github.com/yiliu1765/iommufd/tree/iommufd_nesting
    [4] https://github.com/yiliu1765/qemu/tree/zhenzhong/wip/iommufd_nesting_rfcv1

    Change log:

    v6:
    - Add Kevin's r-b for patch 1 and 8
    - Drop Kevin's r-b for patch 7
    - Address comments from Kevin
    - Split the VT-d nesting series into two parts 1/2 and 2/2

    v5: https://lore.kernel.org/linux-iommu/20230921075431.125239-1-yi.l.liu@intel.com/
    - Add Kevin's r-b for patch 2, 3 ,5 8, 10
    - Drop enforce_cache_coherency callback from the nested type domain ops (Kevin)
    - Remove duplicate agaw check in patch 04 (Kevin)
    - Remove duplicate domain_update_iommu_cap() in patch 06 (Kevin)
    - Check parent's force_snooping to set pgsnp in the pasid entry (Kevin)
    - uapi data structure check (Kevin)
    - Simplify the errata handling as user can allocate nested parent domain

    v4: https://lore.kernel.org/linux-iommu/20230724111335.107427-1-yi.l.liu@intel.com/
    - Remove ascii art tables (Jason)
    - Drop EMT (Tina, Jason)
    - Drop MTS and related definitions (Kevin)
    - Rename macro IOMMU_VTD_PGTBL_ to IOMMU_VTD_S1_ (Kevin)
    - Rename struct iommu_hwpt_intel_vtd_ to iommu_hwpt_vtd_ (Kevin)
    - Rename struct iommu_hwpt_intel_vtd to iommu_hwpt_vtd_s1 (Kevin)
    - Put the vendor specific hwpt alloc data structure before enuma iommu_hwpt_type (Kevin)
    - Do not trim the higher page levels of S2 domain in nested domain attachment as the
    S2 domain may have been used independently. (Kevin)
    - Remove the first-stage pgd check against the maximum address of s2_domain as hw
    can check it anyhow. It makes sense to check every pfns used in the stage-1 page
    table. But it cannot make it. So just leave it to hw. (Kevin)
    - Split the iotlb flush part into an order of uapi, helper and callback implementation (Kevin)
    - Change the policy of VT-d nesting errata, disallow RO mapping once a domain is used
    as parent domain of a nested domain. This removes the nested_users counting. (Kevin)
    - Minor fix for "make htmldocs"

    v3: https://lore.kernel.org/linux-iommu/20230511145110.27707-1-yi.l.liu@intel.com/
    - Further split the patches into an order of adding helpers for nested
    domain, iotlb flush, nested domain attachment and nested domain allocation
    callback, then report the hw_info to userspace.
    - Add batch support in cache invalidation from userspace
    - Disallow nested translation usage if RO mappings exists in stage-2 domain
    due to errata on readonly mappings on Sapphire Rapids platform.

    v2: https://lore.kernel.org/linux-iommu/20230309082207.612346-1-yi.l.liu@intel.com/
    - The iommufd infrastructure is split to be separate series.

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

    Regards,
    Yi Liu

    Lu Baolu (5):
    iommu/vt-d: Extend dmar_domain to support nested domain
    iommu/vt-d: Add helper for nested domain allocation
    iommu/vt-d: Add helper to setup pasid nested translation
    iommu/vt-d: Add nested domain allocation
    iommu/vt-d: Disallow read-only mappings to nest parent domain

    Yi Liu (3):
    iommufd: Add data structure for Intel VT-d stage-1 domain allocation
    iommu/vt-d: Make domain attach helpers to be extern
    iommu/vt-d: Set the nested domain to a device

    drivers/iommu/intel/Makefile | 2 +-
    drivers/iommu/intel/iommu.c | 63 +++++++++++++-------
    drivers/iommu/intel/iommu.h | 46 ++++++++++++--
    drivers/iommu/intel/nested.c | 109 ++++++++++++++++++++++++++++++++++
    drivers/iommu/intel/pasid.c | 112 +++++++++++++++++++++++++++++++++++
    drivers/iommu/intel/pasid.h | 2 +
    include/uapi/linux/iommufd.h | 42 ++++++++++++-
    7 files changed, 348 insertions(+), 28 deletions(-)
    create mode 100644 drivers/iommu/intel/nested.c

    --
    2.34.1

    \
     
     \ /
      Last update: 2023-10-20 11:36    [W:4.820 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site