From: Sean Christopherson <seanjc@google.com>
To: Paolo Bonzini <pbonzini@redhat.com>,
Sean Christopherson <seanjc@google.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Jarkko Sakkinen <jarkko@kernel.org>
Cc: kvm@vger.kernel.org, linux-sgx@vger.kernel.org,
linux-kernel@vger.kernel.org,
Maxim Levitsky <mlevitsk@redhat.com>,
Hou Wenlong <houwenlong.hwl@antgroup.com>,
Xiaoyao Li <xiaoyao.li@intel.com>,
Kechen Lu <kechenl@nvidia.com>,
Oliver Upton <oliver.upton@linux.dev>,
Binbin Wu <binbin.wu@linux.intel.com>,
Yang Weijiang <weijiang.yang@intel.com>,
Robert Hoo <robert.hoo.linux@gmail.com>
Subject: [PATCH v3 00/57] KVM: x86: CPUID overhaul, fixes, and caching
Date: Wed, 27 Nov 2024 17:33:27 -0800 [thread overview]
Message-ID: <20241128013424.4096668-1-seanjc@google.com> (raw)
The super short TL;DR: snapshot all X86_FEATURE_* flags that KVM cares
about so that all queries against guest capabilities are "fast", e.g. don't
require manual enabling or judgment calls as to where a feature needs to be
fast.
The guest_cpu_cap_* nomenclature follows the existing kvm_cpu_cap_*
except for a few (maybe just one?) cases where guest cpu_caps need APIs
that kvm_cpu_caps don't. In theory, the similar names will make this
approach more intuitive.
This series also adds more hardening, e.g. to assert at compile-time if a
feature flag is passed to the wrong word. It also sets the stage for even
more hardening in the future, as tracking all KVM-supported features allows
shoving known vs. used features into arrays at compile time, which can then
be checked for consistency irrespective of hardware support. E.g. allows
detecting if KVM is checking a feature without advertising it to userspace.
This extra hardening is future work; I have it mostly working, but it's ugly
and requires a runtime check to process the generated arrays.
There are *multiple* potentially breaking changes in this series (in for a
penny, in for a pound). However, I don't expect any fallout for real world
VMMs because the ABI changes either disallow things that couldn't possibly
have worked in the first place, or are following in the footsteps of other
behaviors, e.g. KVM advertises x2APIC, which is 100% dependent on an in-kernel
local APIC.
* Disallow stuffing CPUID-dependent guest CR4 features before setting guest
CPUID.
* Disallow KVM_CAP_X86_DISABLE_EXITS after vCPU creation
* Reject disabling of MWAIT/HLT interception when not allowed
* Advertise TSC_DEADLINE_TIMER in KVM_GET_SUPPORTED_CPUID.
* Advertise HYPERVISOR in KVM_GET_SUPPORTED_CPUID
Validated the flag rework by comparing the output of KVM_GET_SUPPORTED_CPUID
(and the emulated version) at the beginning and end of the series, on AMD
and Intel hosts that should support almost every feature known to KVM.
Maxim, I did my best to incorporate all of your feedback, and when we
disagreed, I tried to find an approach that I we can hopefully both live
with, at least until someone comes up with a better idea.
I _think_ the only suggestion that I "rejected" entirely is the existence
of ALIASED_1_EDX_F. I responded to the previous thread, definitely feel
free to continue the conversation there (or here).
If I missed something you care strongly about, please holler!
v3:
- Collect more reviews.
- Too many to list.
v2:
- Collect a few reviews (though I dropped several due to the patches changing
significantly).
- Incorporate KVM's support into the vCPU's cpu_caps. [Maxim]
- A massive pile of new patches.
Sean Christopherson (57):
KVM: x86: Use feature_bit() to clear CONSTANT_TSC when emulating CPUID
KVM: x86: Limit use of F() and SF() to
kvm_cpu_cap_{mask,init_kvm_defined}()
KVM: x86: Do all post-set CPUID processing during vCPU creation
KVM: x86: Explicitly do runtime CPUID updates "after" initial setup
KVM: x86: Account for KVM-reserved CR4 bits when passing through CR4
on VMX
KVM: selftests: Update x86's set_sregs_test to match KVM's CPUID
enforcement
KVM: selftests: Assert that vcpu->cpuid is non-NULL when getting CPUID
entries
KVM: selftests: Refresh vCPU CPUID cache in __vcpu_get_cpuid_entry()
KVM: selftests: Verify KVM stuffs runtime CPUID OS bits on CR4 writes
KVM: x86: Move __kvm_is_valid_cr4() definition to x86.h
KVM: x86/pmu: Drop now-redundant refresh() during init()
KVM: x86: Drop now-redundant MAXPHYADDR and GPA rsvd bits from vCPU
creation
KVM: x86: Disallow KVM_CAP_X86_DISABLE_EXITS after vCPU creation
KVM: x86: Reject disabling of MWAIT/HLT interception when not allowed
KVM: x86: Drop the now unused KVM_X86_DISABLE_VALID_EXITS
KVM: selftests: Fix a bad TEST_REQUIRE() in x86's KVM PV test
KVM: selftests: Update x86's KVM PV test to match KVM's disabling
exits behavior
KVM: x86: Zero out PV features cache when the CPUID leaf is not
present
KVM: x86: Don't update PV features caches when enabling enforcement
capability
KVM: x86: Do reverse CPUID sanity checks in __feature_leaf()
KVM: x86: Account for max supported CPUID leaf when getting raw host
CPUID
KVM: x86: Unpack F() CPUID feature flag macros to one flag per line of
code
KVM: x86: Rename kvm_cpu_cap_mask() to kvm_cpu_cap_init()
KVM: x86: Add a macro to init CPUID features that are 64-bit only
KVM: x86: Add a macro to precisely handle aliased 0x1.EDX CPUID
features
KVM: x86: Handle kernel- and KVM-defined CPUID words in a single
helper
KVM: x86: #undef SPEC_CTRL_SSBD in cpuid.c to avoid macro collisions
KVM: x86: Harden CPU capabilities processing against out-of-scope
features
KVM: x86: Add a macro to init CPUID features that ignore host kernel
support
KVM: x86: Add a macro to init CPUID features that KVM emulates in
software
KVM: x86: Swap incoming guest CPUID into vCPU before massaging in
KVM_SET_CPUID2
KVM: x86: Clear PV_UNHALT for !HLT-exiting only when userspace sets
CPUID
KVM: x86: Remove unnecessary caching of KVM's PV CPUID base
KVM: x86: Always operate on kvm_vcpu data in cpuid_entry2_find()
KVM: x86: Move kvm_find_cpuid_entry{,_index}() up near
cpuid_entry2_find()
KVM: x86: Remove all direct usage of cpuid_entry2_find()
KVM: x86: Advertise TSC_DEADLINE_TIMER in KVM_GET_SUPPORTED_CPUID
KVM: x86: Advertise HYPERVISOR in KVM_GET_SUPPORTED_CPUID
KVM: x86: Rename "governed features" helpers to use "guest_cpu_cap"
KVM: x86: Replace guts of "governed" features with comprehensive
cpu_caps
KVM: x86: Initialize guest cpu_caps based on guest CPUID
KVM: x86: Extract code for generating per-entry emulated CPUID
information
KVM: x86: Treat MONTIOR/MWAIT as a "partially emulated" feature
KVM: x86: Initialize guest cpu_caps based on KVM support
KVM: x86: Avoid double CPUID lookup when updating MWAIT at runtime
KVM: x86: Drop unnecessary check that cpuid_entry2_find() returns
right leaf
KVM: x86: Update OS{XSAVE,PKE} bits in guest CPUID irrespective of
host support
KVM: x86: Update guest cpu_caps at runtime for dynamic CPUID-based
features
KVM: x86: Shuffle code to prepare for dropping guest_cpuid_has()
KVM: x86: Replace (almost) all guest CPUID feature queries with
cpu_caps
KVM: x86: Drop superfluous host XSAVE check when adjusting guest
XSAVES caps
KVM: x86: Add a macro for features that are synthesized into
boot_cpu_data
KVM: x86: Pull CPUID capabilities from boot_cpu_data only as needed
KVM: x86: Rename "SF" macro to "SCATTERED_F"
KVM: x86: Explicitly track feature flags that require vendor enabling
KVM: x86: Explicitly track feature flags that are enabled at runtime
KVM: x86: Use only local variables (no bitmask) to init kvm_cpu_caps
Documentation/virt/kvm/api.rst | 10 +-
arch/x86/include/asm/kvm_host.h | 47 +-
arch/x86/kvm/cpuid.c | 967 ++++++++++++------
arch/x86/kvm/cpuid.h | 128 +--
arch/x86/kvm/governed_features.h | 22 -
arch/x86/kvm/hyperv.c | 2 +-
arch/x86/kvm/lapic.c | 4 +-
arch/x86/kvm/mmu.h | 2 +-
arch/x86/kvm/mmu/mmu.c | 4 +-
arch/x86/kvm/pmu.c | 1 -
arch/x86/kvm/reverse_cpuid.h | 23 +-
arch/x86/kvm/smm.c | 10 +-
arch/x86/kvm/svm/nested.c | 22 +-
arch/x86/kvm/svm/pmu.c | 8 +-
arch/x86/kvm/svm/sev.c | 21 +-
arch/x86/kvm/svm/svm.c | 46 +-
arch/x86/kvm/svm/svm.h | 4 +-
arch/x86/kvm/vmx/hyperv.h | 2 +-
arch/x86/kvm/vmx/nested.c | 18 +-
arch/x86/kvm/vmx/pmu_intel.c | 4 +-
arch/x86/kvm/vmx/sgx.c | 14 +-
arch/x86/kvm/vmx/vmx.c | 61 +-
arch/x86/kvm/x86.c | 153 ++-
arch/x86/kvm/x86.h | 6 +-
include/uapi/linux/kvm.h | 4 -
.../selftests/kvm/include/x86_64/processor.h | 18 +-
.../selftests/kvm/x86_64/kvm_pv_test.c | 38 +-
.../selftests/kvm/x86_64/set_sregs_test.c | 63 +-
28 files changed, 1017 insertions(+), 685 deletions(-)
delete mode 100644 arch/x86/kvm/governed_features.h
base-commit: 4d911c7abee56771b0219a9fbf0120d06bdc9c14
--
2.47.0.338.g60cca15819-goog
next reply other threads:[~2024-11-28 1:34 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-28 1:33 Sean Christopherson [this message]
2024-11-28 1:33 ` [PATCH v3 01/57] KVM: x86: Use feature_bit() to clear CONSTANT_TSC when emulating CPUID Sean Christopherson
2024-12-13 10:53 ` Vitaly Kuznetsov
2024-11-28 1:33 ` [PATCH v3 02/57] KVM: x86: Limit use of F() and SF() to kvm_cpu_cap_{mask,init_kvm_defined}() Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 03/57] KVM: x86: Do all post-set CPUID processing during vCPU creation Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 04/57] KVM: x86: Explicitly do runtime CPUID updates "after" initial setup Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 05/57] KVM: x86: Account for KVM-reserved CR4 bits when passing through CR4 on VMX Sean Christopherson
2024-12-13 1:30 ` Chao Gao
2024-11-28 1:33 ` [PATCH v3 06/57] KVM: selftests: Update x86's set_sregs_test to match KVM's CPUID enforcement Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 07/57] KVM: selftests: Assert that vcpu->cpuid is non-NULL when getting CPUID entries Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 08/57] KVM: selftests: Refresh vCPU CPUID cache in __vcpu_get_cpuid_entry() Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 09/57] KVM: selftests: Verify KVM stuffs runtime CPUID OS bits on CR4 writes Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 10/57] KVM: x86: Move __kvm_is_valid_cr4() definition to x86.h Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 11/57] KVM: x86/pmu: Drop now-redundant refresh() during init() Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 12/57] KVM: x86: Drop now-redundant MAXPHYADDR and GPA rsvd bits from vCPU creation Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 13/57] KVM: x86: Disallow KVM_CAP_X86_DISABLE_EXITS after " Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 14/57] KVM: x86: Reject disabling of MWAIT/HLT interception when not allowed Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 15/57] KVM: x86: Drop the now unused KVM_X86_DISABLE_VALID_EXITS Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 16/57] KVM: selftests: Fix a bad TEST_REQUIRE() in x86's KVM PV test Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 17/57] KVM: selftests: Update x86's KVM PV test to match KVM's disabling exits behavior Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 18/57] KVM: x86: Zero out PV features cache when the CPUID leaf is not present Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 19/57] KVM: x86: Don't update PV features caches when enabling enforcement capability Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 20/57] KVM: x86: Do reverse CPUID sanity checks in __feature_leaf() Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 21/57] KVM: x86: Account for max supported CPUID leaf when getting raw host CPUID Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 22/57] KVM: x86: Unpack F() CPUID feature flag macros to one flag per line of code Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 23/57] KVM: x86: Rename kvm_cpu_cap_mask() to kvm_cpu_cap_init() Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 24/57] KVM: x86: Add a macro to init CPUID features that are 64-bit only Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 25/57] KVM: x86: Add a macro to precisely handle aliased 0x1.EDX CPUID features Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 26/57] KVM: x86: Handle kernel- and KVM-defined CPUID words in a single helper Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 27/57] KVM: x86: #undef SPEC_CTRL_SSBD in cpuid.c to avoid macro collisions Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 28/57] KVM: x86: Harden CPU capabilities processing against out-of-scope features Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 29/57] KVM: x86: Add a macro to init CPUID features that ignore host kernel support Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 30/57] KVM: x86: Add a macro to init CPUID features that KVM emulates in software Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 31/57] KVM: x86: Swap incoming guest CPUID into vCPU before massaging in KVM_SET_CPUID2 Sean Christopherson
2024-11-28 1:33 ` [PATCH v3 32/57] KVM: x86: Clear PV_UNHALT for !HLT-exiting only when userspace sets CPUID Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 33/57] KVM: x86: Remove unnecessary caching of KVM's PV CPUID base Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 34/57] KVM: x86: Always operate on kvm_vcpu data in cpuid_entry2_find() Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 35/57] KVM: x86: Move kvm_find_cpuid_entry{,_index}() up near cpuid_entry2_find() Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 36/57] KVM: x86: Remove all direct usage of cpuid_entry2_find() Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 37/57] KVM: x86: Advertise TSC_DEADLINE_TIMER in KVM_GET_SUPPORTED_CPUID Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 38/57] KVM: x86: Advertise HYPERVISOR " Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 39/57] KVM: x86: Rename "governed features" helpers to use "guest_cpu_cap" Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 40/57] KVM: x86: Replace guts of "governed" features with comprehensive cpu_caps Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 41/57] KVM: x86: Initialize guest cpu_caps based on guest CPUID Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 42/57] KVM: x86: Extract code for generating per-entry emulated CPUID information Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 43/57] KVM: x86: Treat MONTIOR/MWAIT as a "partially emulated" feature Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 44/57] KVM: x86: Initialize guest cpu_caps based on KVM support Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 45/57] KVM: x86: Avoid double CPUID lookup when updating MWAIT at runtime Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 46/57] KVM: x86: Drop unnecessary check that cpuid_entry2_find() returns right leaf Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 47/57] KVM: x86: Update OS{XSAVE,PKE} bits in guest CPUID irrespective of host support Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 48/57] KVM: x86: Update guest cpu_caps at runtime for dynamic CPUID-based features Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 49/57] KVM: x86: Shuffle code to prepare for dropping guest_cpuid_has() Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 50/57] KVM: x86: Replace (almost) all guest CPUID feature queries with cpu_caps Sean Christopherson
2024-12-13 2:14 ` Chao Gao
2024-12-17 0:05 ` Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 51/57] KVM: x86: Drop superfluous host XSAVE check when adjusting guest XSAVES caps Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 52/57] KVM: x86: Add a macro for features that are synthesized into boot_cpu_data Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 53/57] KVM: x86: Pull CPUID capabilities from boot_cpu_data only as needed Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 54/57] KVM: x86: Rename "SF" macro to "SCATTERED_F" Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 55/57] KVM: x86: Explicitly track feature flags that require vendor enabling Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 56/57] KVM: x86: Explicitly track feature flags that are enabled at runtime Sean Christopherson
2024-11-28 1:34 ` [PATCH v3 57/57] KVM: x86: Use only local variables (no bitmask) to init kvm_cpu_caps Sean Christopherson
2024-12-18 1:15 ` Maxim Levitsky
2024-12-18 1:13 ` [PATCH v3 00/57] KVM: x86: CPUID overhaul, fixes, and caching Maxim Levitsky
2024-12-19 2:40 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241128013424.4096668-1-seanjc@google.com \
--to=seanjc@google.com \
--cc=binbin.wu@linux.intel.com \
--cc=houwenlong.hwl@antgroup.com \
--cc=jarkko@kernel.org \
--cc=kechenl@nvidia.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sgx@vger.kernel.org \
--cc=mlevitsk@redhat.com \
--cc=oliver.upton@linux.dev \
--cc=pbonzini@redhat.com \
--cc=robert.hoo.linux@gmail.com \
--cc=vkuznets@redhat.com \
--cc=weijiang.yang@intel.com \
--cc=xiaoyao.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox