From: Sean Christopherson <seanjc@google.com>
To: Chao Gao <chao.gao@intel.com>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org, tglx@linutronix.de, dave.hansen@intel.com,
pbonzini@redhat.com, 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, Ingo Molnar <mingo@redhat.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
"H. Peter Anvin" <hpa@zytor.com>,
Samuel Holland <samuel.holland@sifive.com>,
Mitchell Levy <levymitchell0@gmail.com>,
Kees Cook <kees@kernel.org>,
Stanislav Spassov <stanspas@amazon.de>,
Eric Biggers <ebiggers@google.com>,
Nikolay Borisov <nik.borisov@suse.com>,
Oleg Nesterov <oleg@redhat.com>,
Vignesh Balasubramanian <vigbalas@amd.com>
Subject: Re: [PATCH v7 1/6] x86/fpu/xstate: Differentiate default features for host and guest FPUs
Date: Wed, 21 May 2025 09:49:48 -0700 [thread overview]
Message-ID: <aC4ELHF73K4KIY27@google.com> (raw)
In-Reply-To: <20250512085735.564475-2-chao.gao@intel.com>
On Mon, May 12, 2025, Chao Gao wrote:
> @@ -772,6 +776,21 @@ static void __init fpu__init_disable_system_xstate(unsigned int legacy_size)
> fpstate_reset(x86_task_fpu(current));
> }
>
> +static void __init init_default_features(u64 kernel_max_features, u64 user_max_features)
> +{
> + u64 kfeatures = kernel_max_features;
> + u64 ufeatures = user_max_features;
> +
> + /* Default feature sets should not include dynamic xfeatures. */
> + kfeatures &= ~XFEATURE_MASK_USER_DYNAMIC;
> + ufeatures &= ~XFEATURE_MASK_USER_DYNAMIC;
> +
> + fpu_kernel_cfg.default_features = kfeatures;
> + fpu_user_cfg.default_features = ufeatures;
> +
> + guest_default_cfg.features = kfeatures;
> +}
> +
> /*
> * Enable and initialize the xsave feature.
> * Called once per system bootup.
> @@ -854,12 +873,8 @@ void __init fpu__init_system_xstate(unsigned int legacy_size)
> fpu_user_cfg.max_features = fpu_kernel_cfg.max_features;
> fpu_user_cfg.max_features &= XFEATURE_MASK_USER_SUPPORTED;
>
> - /* Clean out dynamic features from default */
> - fpu_kernel_cfg.default_features = fpu_kernel_cfg.max_features;
> - fpu_kernel_cfg.default_features &= ~XFEATURE_MASK_USER_DYNAMIC;
> -
> - fpu_user_cfg.default_features = fpu_user_cfg.max_features;
> - fpu_user_cfg.default_features &= ~XFEATURE_MASK_USER_DYNAMIC;
> + /* Now, given maximum feature set, determine default values */
> + init_default_features(fpu_kernel_cfg.max_features, fpu_user_cfg.max_features);
Passing in max_features is rather odd. I assume the intent is to capture the
dependencies, but that falls apart by the end of series as the guest features
are initialized as:
guest_default_cfg.features = kfeatures | xfeatures_mask_guest_supervisor();
where xfeatures_mask_guest_supervisor() sneakily consumes fpu_kernel_cfg.max_features,
the very field this patch deliberately avoids consuming directly.
static inline u64 xfeatures_mask_guest_supervisor(void)
{
return fpu_kernel_cfg.max_features & XFEATURE_MASK_GUEST_SUPERVISOR;
}
Rather than providing a helper to initialize the defaults, what if we provide
helpers to provide the default *masks*? Then the dependencies on max_features
are super clear.
E.g. spread over multiple patches (completely untested)
diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
index be1cdfa9b00d..e52c7517df5f 100644
--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -780,27 +780,22 @@ static void __init fpu__init_disable_system_xstate(unsigned int legacy_size)
fpstate_reset(x86_task_fpu(current));
}
-static void __init init_default_features(u64 kernel_max_features, u64 user_max_features)
+static u64 __init host_default_mask(void)
{
- u64 kfeatures = kernel_max_features;
- u64 ufeatures = user_max_features;
-
/*
- * Default feature sets should not include dynamic and guest-only
- * xfeatures at all.
+ * Exclude dynamic features (require userspace opt-in) and features
+ * that are supported only for KVM guests.
*/
- kfeatures &= ~(XFEATURE_MASK_USER_DYNAMIC | XFEATURE_MASK_GUEST_SUPERVISOR);
- ufeatures &= ~XFEATURE_MASK_USER_DYNAMIC;
-
- fpu_kernel_cfg.default_features = kfeatures;
- fpu_user_cfg.default_features = ufeatures;
+ return ~((u64)XFEATURE_MASK_USER_DYNAMIC | XFEATURE_MASK_GUEST_SUPERVISOR);
+}
+static u64 __init guest_default_mask(void)
+{
/*
- * Ensure VCPU FPU container only reserves a space for guest-only
- * xfeatures. This distinction can save kernel memory by
- * maintaining a necessary amount of XSAVE buffer.
+ * Exclude dynamic features, which require userspace opt-in even for
+ * KVM guests.
*/
- guest_default_cfg.features = kfeatures | xfeatures_mask_guest_supervisor();
+ return ~(u64)XFEATURE_MASK_USER_DYNAMIC;
}
/*
@@ -886,7 +881,9 @@ void __init fpu__init_system_xstate(unsigned int legacy_size)
fpu_user_cfg.max_features &= XFEATURE_MASK_USER_SUPPORTED;
/* Now, given maximum feature set, determine default values */
- init_default_features(fpu_kernel_cfg.max_features, fpu_user_cfg.max_features);
+ fpu_kernel_cfg.default_features = fpu_kernel_cfg.max_features & host_default_mask();
+ fpu_user_cfg.default_features = fpu_user_cfg.max_features & host_default_mask();
+ guest_default_cfg.features = fpu_kernel_cfg.max_features & guest_default_mask();
/* Store it for paranoia check at the end */
xfeatures = fpu_kernel_cfg.max_features;
diff --git a/arch/x86/kernel/fpu/xstate.h b/arch/x86/kernel/fpu/xstate.h
index 9e496391b5f0..52ce19289989 100644
--- a/arch/x86/kernel/fpu/xstate.h
+++ b/arch/x86/kernel/fpu/xstate.h
@@ -62,11 +62,6 @@ static inline u64 xfeatures_mask_supervisor(void)
return fpu_kernel_cfg.max_features & XFEATURE_MASK_SUPERVISOR_SUPPORTED;
}
-static inline u64 xfeatures_mask_guest_supervisor(void)
-{
- return fpu_kernel_cfg.max_features & XFEATURE_MASK_GUEST_SUPERVISOR;
-}
-
static inline u64 xfeatures_mask_independent(void)
{
if (!cpu_feature_enabled(X86_FEATURE_ARCH_LBR))
next prev parent reply other threads:[~2025-05-21 16:49 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-12 8:57 [PATCH v7 0/6] Introduce CET supervisor state support Chao Gao
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 [this message]
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=aC4ELHF73K4KIY27@google.com \
--to=seanjc@google.com \
--cc=bp@alien8.de \
--cc=chang.seok.bae@intel.com \
--cc=chao.gao@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=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=stanspas@amazon.de \
--cc=tglx@linutronix.de \
--cc=vigbalas@amd.com \
--cc=weijiang.yang@intel.com \
--cc=x86@kernel.org \
--cc=xin3.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.