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

Reply via email to