Messages in this thread | | | From | Jann Horn <> | Date | Fri, 26 Mar 2021 17:34:14 +0100 | Subject | Re: [PATCH v4 14/22] x86/fpu/xstate: Expand the xstate buffer on the first use of dynamic user state |
| |
On Sun, Feb 21, 2021 at 7:56 PM Chang S. Bae <chang.seok.bae@intel.com> wrote: > Intel's Extended Feature Disable (XFD) feature is an extension of the XSAVE > architecture. XFD allows the kernel to enable a feature state in XCR0 and > to receive a #NM trap when a task uses instructions accessing that state. > In this way, Linux can defer allocating the large XSAVE buffer until tasks > need it. > > XFD introduces two MSRs: IA32_XFD to enable/disable the feature and > IA32_XFD_ERR to assist the #NM trap handler. Both use the same > state-component bitmap format, used by XCR0. > > Use this hardware capability to find the right time to expand the xstate > buffer. Introduce two sets of helper functions for that: > > 1. The first set is primarily for interacting with the XFD hardware: > xdisable_setbits() > xdisable_getbits() > xdisable_switch() > > 2. The second set is for managing the first-use status and handling #NM > trap: > xfirstuse_enabled() > xfirstuse_not_detected() > > The #NM handler induces the xstate buffer expansion to save the first-used > states. [...] > diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c > index 7f5aec758f0e..821a7f408ad4 100644 > --- a/arch/x86/kernel/traps.c > +++ b/arch/x86/kernel/traps.c [...] > +static __always_inline bool handle_xfirstuse_event(struct fpu *fpu) > +{ > + bool handled = false; > + u64 event_mask; [...] > + if (alloc_xstate_buffer(fpu, event_mask)) > + return handled; [...] > +} > + > DEFINE_IDTENTRY(exc_device_not_available) > { > unsigned long cr0 = read_cr0(); > > + if (handle_xfirstuse_event(¤t->thread.fpu)) > + return;
What happens if handle_xfirstuse_event() fails because vmalloc() failed in alloc_xstate_buffer()? I think that should probably kill the task with something like force_sig() - but as far as I can tell, at the moment, it will instead end up at die(), which should only be used for kernel bugs.
> + > #ifdef CONFIG_MATH_EMULATION > if (!boot_cpu_has(X86_FEATURE_FPU) && (cr0 & X86_CR0_EM)) { > struct math_emu_info info = { }; > -- > 2.17.1 > >
| |