From: Chao Gao <chao.gao@intel.com>
To: x86@kernel.org, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org, tglx@linutronix.de, dave.hansen@intel.com,
seanjc@google.com, pbonzini@redhat.com
Cc: peterz@infradead.org, rick.p.edgecombe@intel.com,
weijiang.yang@intel.com, john.allen@amd.com, bp@alien8.de,
chang.seok.bae@intel.com, xin3.li@intel.com,
Chao Gao <chao.gao@intel.com>,
Aruna Ramakrishna <aruna.ramakrishna@oracle.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Eric Biggers <ebiggers@google.com>,
"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@redhat.com>,
Kees Cook <kees@kernel.org>, Maxim Levitsky <mlevitsk@redhat.com>,
Mitchell Levy <levymitchell0@gmail.com>,
Nikolay Borisov <nik.borisov@suse.com>,
Oleg Nesterov <oleg@redhat.com>,
Samuel Holland <samuel.holland@sifive.com>,
Sohil Mehta <sohil.mehta@intel.com>,
Stanislav Spassov <stanspas@amazon.de>,
Uros Bizjak <ubizjak@gmail.com>,
Vignesh Balasubramanian <vigbalas@amd.com>,
Zhao Liu <zhao1.liu@intel.com>
Subject: [PATCH v7 0/6] Introduce CET supervisor state support
Date: Mon, 12 May 2025 01:57:03 -0700 [thread overview]
Message-ID: <20250512085735.564475-1-chao.gao@intel.com> (raw)
Dear maintainers and reviewers,
I kindly request your consideration for merging this series. Most of
patches have received Reviewed-by/Acked-by tags.
Thanks Chang, Rick, Xin, Sean and Dave for their help with this series.
== Changelog ==
v6->v7:
- Collect reviews from Rick
- Tweak __fpstate_reset() to handle guest fpstate rather than adding a
guest-specific reset function (Sean & Dave)
- Fold xfd initialization into __fpstate_reset() (Sean)
- v6: https://lore.kernel.org/all/20250506093740.2864458-1-chao.gao@intel.com/
== Background ==
CET defines two register states: CET user, which includes user-mode control
registers, and CET supervisor, which consists of shadow-stack pointers for
privilege levels 0-2.
Current kernel disables shadow stacks in kernel mode, making the CET
supervisor state unused and eliminating the need for context switching.
== Problem ==
To virtualize CET for guests, KVM must accurately emulate hardware
behavior. A key challenge arises because there is no CPUID flag to indicate
that shadow stack is supported only in user mode. Therefore, KVM cannot
assume guests will not enable shadow stacks in kernel mode and must
preserve the CET supervisor state of vCPUs.
== Solution ==
An initial proposal to manually save and restore CET supervisor states
using raw RDMSR/WRMSR in KVM was rejected due to performance concerns and
its impact on KVM's ABI. Instead, leveraging the kernel's FPU
infrastructure for context switching was favored [1].
The main question then became whether to enable the CET supervisor state
globally for all processes or restrict it to vCPU processes. This decision
involves a trade-off between a 24-byte XSTATE buffer waste for all non-vCPU
processes and approximately 100 lines of code complexity in the kernel [2].
The agreed approach is to first try this optimal solution [3], i.e.,
restricting the CET supervisor state to guest FPUs only and eliminating
unnecessary space waste.
Key changes in this series are:
1) Fix existing issue regarding enabling guest supervisor states support.
2) Add default features and size for guest FPUs.
3) Add infrastructure to support guest-only features.
4) Add CET supervisor state as the first guest-only feature.
With the series in place, guest FPUs have xstate_bv[12] == xcomp_bv[12] == 1
and CET supervisor state is saved/reloaded when xsaves/xrstors executes on
guest FPUs. non-guest FPUs have xstate_bv[12] == xcomp_bv[12] == 0, then
CET supervisor state is not saved/restored.
== Performance ==
We measured context-switching performance with the benchmark [4] in following
three cases.
case 1: the baseline. i.e., this series isn't applied
case 2: baseline + this series. CET-S space is allocated for guest fpu only.
case 3: baseline + allocate CET-S space for all tasks. Hardware init
optimization avoids writing out CET-S space on each XSAVES.
The performance differences in the three cases are very small and fall within the
run-to-run variation.
[1]: https://lore.kernel.org/kvm/ZM1jV3UPL0AMpVDI@google.com/
[2]: https://lore.kernel.org/kvm/1c2fd06e-2e97-4724-80ab-8695aa4334e7@intel.com/
[3]: https://lore.kernel.org/kvm/2597a87b-1248-b8ce-ce60-94074bc67ea4@intel.com/
[4]: https://github.com/antonblanchard/will-it-scale/blob/master/tests/context_switch1.c
Chao Gao (4):
x86/fpu/xstate: Differentiate default features for host and guest FPUs
x86/fpu: Initialize guest FPU permissions from guest defaults
x86/fpu: Initialize guest fpstate and FPU pseudo container from guest
defaults
x86/fpu: Remove xfd argument from __fpstate_reset()
Yang Weijiang (2):
x86/fpu/xstate: Introduce "guest-only" supervisor xfeature set
x86/fpu/xstate: Add CET supervisor xfeature support as a guest-only
feature
arch/x86/include/asm/fpu/types.h | 49 +++++++++++++++++++++++++++----
arch/x86/include/asm/fpu/xstate.h | 9 ++++--
arch/x86/kernel/fpu/core.c | 49 ++++++++++++++++++++++---------
arch/x86/kernel/fpu/init.c | 1 +
arch/x86/kernel/fpu/xstate.c | 40 ++++++++++++++++++++-----
arch/x86/kernel/fpu/xstate.h | 5 ++++
6 files changed, 123 insertions(+), 30 deletions(-)
--
2.47.1
next reply other threads:[~2025-05-12 8:57 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-12 8:57 Chao Gao [this message]
2025-05-12 8:57 ` [PATCH v7 1/6] x86/fpu/xstate: Differentiate default features for host and guest FPUs Chao Gao
2025-05-21 16:49 ` Sean Christopherson
2025-05-22 14:44 ` Chao Gao
2025-05-12 8:57 ` [PATCH v7 2/6] x86/fpu: Initialize guest FPU permissions from guest defaults Chao Gao
2025-05-12 8:57 ` [PATCH v7 3/6] x86/fpu: Initialize guest fpstate and FPU pseudo container " Chao Gao
2025-05-12 14:13 ` Sean Christopherson
2025-05-12 15:21 ` Chao Gao
2025-05-12 8:57 ` [PATCH v7 4/6] x86/fpu: Remove xfd argument from __fpstate_reset() Chao Gao
2025-05-12 8:57 ` [PATCH v7 5/6] x86/fpu/xstate: Introduce "guest-only" supervisor xfeature set Chao Gao
2025-05-12 8:57 ` [PATCH v7 6/6] x86/fpu/xstate: Add CET supervisor xfeature support as a guest-only feature Chao Gao
2025-05-15 15:41 ` [PATCH v7 0/6] Introduce CET supervisor state support Ingo Molnar
2025-05-16 15:19 ` Dave Hansen
2025-05-16 15:20 ` Dave Hansen
2025-05-21 0:22 ` Chao Gao
2025-05-21 16:59 ` Sean Christopherson
2025-05-22 7:51 ` Peter Zijlstra
2025-05-16 7:51 ` Uros Bizjak
2025-05-16 9:02 ` Chao Gao
2025-05-16 15:15 ` Dave Hansen
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=20250512085735.564475-1-chao.gao@intel.com \
--to=chao.gao@intel.com \
--cc=aruna.ramakrishna@oracle.com \
--cc=bp@alien8.de \
--cc=chang.seok.bae@intel.com \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=ebiggers@google.com \
--cc=hpa@zytor.com \
--cc=john.allen@amd.com \
--cc=kees@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=levymitchell0@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=mlevitsk@redhat.com \
--cc=nik.borisov@suse.com \
--cc=oleg@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=rick.p.edgecombe@intel.com \
--cc=samuel.holland@sifive.com \
--cc=seanjc@google.com \
--cc=sohil.mehta@intel.com \
--cc=stanspas@amazon.de \
--cc=tglx@linutronix.de \
--cc=ubizjak@gmail.com \
--cc=vigbalas@amd.com \
--cc=weijiang.yang@intel.com \
--cc=x86@kernel.org \
--cc=xin3.li@intel.com \
--cc=zhao1.liu@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
all inboxes | Powered by JetHome®