x86/p2m-pt: fix p2m_flags_to_access()
authorJan Beulich <jbeulich@suse.com>
Tue, 7 Sep 2021 12:24:49 +0000 (14:24 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 7 Sep 2021 12:24:49 +0000 (14:24 +0200)
commite70a9a043a5ce6d4025420f729bc473f711bf5d1
tree7debd55f02fdf21ec3334cfc342a93dca2e6cc94
parent5ae4120635ad3cbf6064268162b0fb2c44eb41e3
x86/p2m-pt: fix p2m_flags_to_access()

The initial if() was inverted, invalidating all output from this
function. Which in turn means the mirroring of P2M mappings into the
IOMMU didn't always work as intended: Mappings may have got updated when
there was no need to. There would not have been too few (un)mappings;
what saves us is that alongside the flags comparison MFNs also get
compared, with non-present entries always having an MFN of 0 or
INVALID_MFN while present entries always have MFNs different from these
two (0 in the table also meant to cover INVALID_MFN):

OLD NEW
P W access MFN P W access MFN
0 0 r 0 0 0 n 0
0 1 rw 0 0 1 n 0
1 0 n non-0 1 0 r non-0
1 1 n non-0 1 1 rw non-0

present <-> non-present transitions are fine because the MFNs differ.
present -> present transitions as well as non-present -> non-present
ones are potentially causing too many map/unmap operations, but never
too few, because in that case old (bogus) and new access differ.

Fixes: d1bb6c97c31e ("IOMMU: also pass p2m_access_t to p2m_get_iommu_flags())
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/mm/p2m-pt.c