>-----Original Message----- >From: Eric Auger <eric.au...@redhat.com> >Subject: Re: [PATCH v2 15/19] intel_iommu: Replay pasid binds after context >cache invalidation > > > >On 6/20/25 9:18 AM, Zhenzhong Duan wrote: >> From: Yi Liu <yi.l....@intel.com> >> >> This replays guest pasid attachments after context cache invalidation. >> This is a behavior to ensure safety. Actually, programmer should issue >> pasid cache invalidation with proper granularity after issuing a context >> cache invalidation. >so is it mandated to do the invalidation twice?
Yes, because we don't have a way to know if pasid cache invalidation following context cache invalidation is duplicate one from guest. It depends on if we want to support a guest with such flaw, if no need to support, we can drop this patch. >> >> Signed-off-by: Yi Liu <yi.l....@intel.com> >> Signed-off-by: Yi Sun <yi.y....@linux.intel.com> >> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com> >> --- >> hw/i386/intel_iommu_internal.h | 1 + >> hw/i386/intel_iommu.c | 51 >++++++++++++++++++++++++++++++++-- >> hw/i386/trace-events | 1 + >> 3 files changed, 51 insertions(+), 2 deletions(-) >> >> diff --git a/hw/i386/intel_iommu_internal.h >b/hw/i386/intel_iommu_internal.h >> index 92a533db54..b3e4aa23f1 100644 >> --- a/hw/i386/intel_iommu_internal.h >> +++ b/hw/i386/intel_iommu_internal.h >> @@ -575,6 +575,7 @@ typedef enum VTDPCInvType { >> VTD_PASID_CACHE_FORCE_RESET = 0, >> /* pasid cache invalidation rely on guest PASID entry */ >> VTD_PASID_CACHE_GLOBAL_INV, /* pasid cache global invalidation >*/ >> + VTD_PASID_CACHE_DEVSI, /* pasid cache device selective >invalidation */ >> VTD_PASID_CACHE_DOMSI, /* pasid cache domain selective >invalidation */ >> VTD_PASID_CACHE_PASIDSI, /* pasid cache pasid selective >invalidation */ >> } VTDPCInvType; >> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c >> index 1c94a0033c..621b07aa02 100644 >> --- a/hw/i386/intel_iommu.c >> +++ b/hw/i386/intel_iommu.c >> @@ -92,6 +92,10 @@ static void >vtd_address_space_refresh_all(IntelIOMMUState *s); >> static void vtd_address_space_unmap(VTDAddressSpace *as, >IOMMUNotifier *n); >> >> static void vtd_pasid_cache_reset_locked(IntelIOMMUState *s); >> +static void vtd_pasid_cache_sync(IntelIOMMUState *s, >> + VTDPASIDCacheInfo *pc_info); >> +static void vtd_pasid_cache_devsi(IntelIOMMUState *s, >> + PCIBus *bus, uint16_t devfn); >> >> static void vtd_panic_require_caching_mode(void) >> { >> @@ -2437,6 +2441,8 @@ static void >vtd_iommu_replay_all(IntelIOMMUState *s) >> >> static void vtd_context_global_invalidate(IntelIOMMUState *s) >> { >> + VTDPASIDCacheInfo pc_info = { .error_happened = false, }; >> + >> trace_vtd_inv_desc_cc_global(); >> /* Protects context cache */ >> vtd_iommu_lock(s); >> @@ -2454,6 +2460,9 @@ static void >vtd_context_global_invalidate(IntelIOMMUState *s) >> * VT-d emulation codes. >> */ >> vtd_iommu_replay_all(s); >> + >> + pc_info.type = VTD_PASID_CACHE_GLOBAL_INV; >> + vtd_pasid_cache_sync(s, &pc_info); >> } >> >> #ifdef CONFIG_IOMMUFD >> @@ -2696,6 +2705,21 @@ static void >vtd_context_device_invalidate(IntelIOMMUState *s, >> * happened. >> */ >> vtd_address_space_sync(vtd_as); >> + /* >> + * Per spec, context flush should also followed with PASID >be followed >> + * cache and iotlb flush. Regards to a device selective >regarding to? >> + * context cache invalidation: >> + * if (emaulted_device) >emulated Will fix above three. Thanks Zhenzhong