RE: [PATCH 2/3] iommu/vt-d: Clear Present bit before tearing down PASID entry

From: Tian, Kevin

Date: Wed Jan 14 2026 - 02:32:28 EST


> From: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
> Sent: Tuesday, January 13, 2026 11:01 AM
>
> The Intel VT-d Scalable Mode PASID table entry consists of 512 bits (64
> bytes). When tearing down an entry, the current implementation zeros the
> entire 64-byte structure immediately.
>
> However, the IOMMU hardware may fetch these 64 bytes using multiple
> internal transactions (e.g., four 128-bit bursts). If a hardware fetch
> occurs simultaneously with the CPU zeroing the entry, the hardware could
> observe a "torn" entry — where some chunks are zeroed and others still
> contain old data — leading to unpredictable behavior or spurious faults.
>
> Follow the "Guidance to Software for Invalidations" in the VT-d spec
> (Section 6.5.3.3) by implementing a proper ownership handshake:
>
> 1. Clear only the 'Present' (P) bit of the PASID entry. This tells the
> hardware that the entry is no longer valid.
> 2. Execute the required invalidation sequence (PASID cache, IOTLB, and
> Device-TLB flush) to ensure the hardware has released all cached
> references to the entry.
> 3. Only after the flushes are complete, zero out the remaining fields of
> the PASID entry.
>
> Additionally, add an explicit clflush in intel_pasid_clear_entry() to
> ensure that the cleared entry is visible to the IOMMU on systems where
> memory coherency (ecap_coherent) is not supported.
>

better split the clflush part into a separate patch