[PATCH 0/6] x86/mtrr: fix handling with PAT but without MTRR

From: Juergen Gross
Date: Tue Feb 07 2023 - 02:29:15 EST


This series tries to fix the rather special case of PAT being available
without having MTRRs (either due to CONFIG_MTRR being not set, or
because the feature has been disabled e.g. by a hypervisor).

The main use cases are Xen PV guests and SEV-SNP guests running under
Hyper-V.

Patch 2 seems to be a little hacky, as it special cases only
memtype_reserve() and memtype_free(), but OTOH this doesn't seem to
be worse than in previous days, where PAT was disabled when MTRRs
haven't been available.

My tests with Xen didn't show any problems, but I'm rather sure I
couldn't cover all corner cases.

The only cleaner solution I could think of would be to introduce MTRR
read-only access. It would theoretically be possible to get the actual
MTRR contents for the variable MTRRs from Xen, but I'm not sure this
is really the way to go.

For the SEV-SNP case with Hyper-V I guess such a read-only mode could
be rather simple, but I'm really not sure this would cover all needed
corner cases (I'd basically say always "WB" in that case).

I have added more cleanup which has been discussed when looking into
the most recent failures.

Juergen Gross (6):
x86/mtrr: make mtrr_enabled() non-static
x86/pat: check for MTRRs enabled in memtype_reserve()
x86/mtrr: revert commit 90b926e68f50
x86/mtrr: don't let mtrr_type_lookup() return MTRR_TYPE_INVALID
x86/mm: only check uniform after calling mtrr_type_lookup()
x86/mtrr: drop sanity check in mtrr_type_lookup_fixed()

arch/x86/include/asm/mtrr.h | 13 +++++++++++--
arch/x86/include/uapi/asm/mtrr.h | 6 +++---
arch/x86/kernel/cpu/mtrr/generic.c | 10 +++-------
arch/x86/kernel/cpu/mtrr/mtrr.c | 2 +-
arch/x86/mm/pat/memtype.c | 13 ++++++++-----
arch/x86/mm/pgtable.c | 6 ++----
6 files changed, 28 insertions(+), 22 deletions(-)

--
2.35.3