]> xenbits.xensource.com Git - xen.git/commit
iommu/amd: atomically update IRTE
authorRoger Pau Monné <roger.pau@citrix.com>
Mon, 17 Feb 2025 12:20:38 +0000 (13:20 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 17 Feb 2025 12:20:38 +0000 (13:20 +0100)
commit457b9e11fa131f3a9f376aed3e00f0d16d6ea7c7
treefb02ec5bc14e60ca6aa08ef059c8aa0d01254bcf
parent49c3324f3737fbdfdbfeab7a682f3c4665a732ce
iommu/amd: atomically update IRTE

Either when using a 32bit Interrupt Remapping Entry or a 128bit one update
the entry atomically, by using cmpxchg unconditionally as IOMMU depends on
it.  No longer disable the entry by setting RemapEn = 0 ahead of updating
it.  As a consequence of not toggling RemapEn ahead of the update the
Interrupt Remapping Table needs to be flushed after the entry update.

This avoids a window where the IRTE has RemapEn = 0, which can lead to
IO_PAGE_FAULT if the underlying interrupt source is not masked.

There's no guidance in AMD-Vi specification about how IRTE update should be
performed as opposed to DTE updating which has specific guidance.  However
DTE updating claims that reads will always be at least 128bits in size, and
hence for the purposes here assume that reads and caching of the IRTE
entries in either 32 or 128 bit format will be done atomically from
the IOMMU.

Note that as part of introducing a new raw128 field in the IRTE struct, the
current raw field is renamed to raw64 to explicitly contain the size in the
field name.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: b953a99da98d63a7c827248abc450d4e8e015ab6
master date: 2025-01-27 13:05:11 +0100
xen/drivers/passthrough/amd/iommu_intr.c