From: Dave Hansen <dave.hansen@linux.intel.com>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
linux-kernel@vger.kernel.org
Cc: x86@kernel.org, "Andy Lutomirski" <luto@kernel.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Radim Krčmář" <rkrcmar@redhat.com>,
kvm@vger.kernel.org, "Jason A. Donenfeld" <Jason@zx2c4.com>,
"Rik van Riel" <riel@surriel.com>
Subject: Re: [PATCH 08/11] x86/fpu: Always store the registers in copy_fpstate_to_sigframe()
Date: Fri, 12 Oct 2018 11:15:51 -0700 [thread overview]
Message-ID: <53f013ca-d6ff-2387-f9b0-d6c6df66d082@linux.intel.com> (raw)
In-Reply-To: <20181004140547.13014-9-bigeasy@linutronix.de>
On 10/04/2018 07:05 AM, Sebastian Andrzej Siewior wrote:
> From: Rik van Riel <riel@surriel.com>
>
> copy_fpstate_to_sigframe() has two callers and both invoke the function only if
> fpu->initialized is set. So the check in the function for ->initialized makes
> no sense. It might be a relict from the lazy-FPU time: If the FPU registers
> were "loaded" then we could save them directly. Otherwise (the FPU
> registers are not up to date) they are saved in the FPU struct and
> it could be used for memcpy().
>
> Since the registers always loaded at this point, save them and copy
> later.
> This code is extracted from an earlier version of the patchset while
> there still was lazy-FPU on x86. This is a preparation for loading the
> FPU registers on return to userland.
Could you make a pass through all the changelogs at at least make sure
they look sane and consistent? The text width and paragraph spacing
here looks rather cobbled together.
> ---
> arch/x86/include/asm/fpu/internal.h | 45 ----------------------------
> arch/x86/kernel/fpu/signal.c | 46 +++++++----------------------
> 2 files changed, 11 insertions(+), 80 deletions(-)
The diffstat here is really nice.
> diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
> index 4ecaf4d22954e..df8816be3efdd 100644
> --- a/arch/x86/include/asm/fpu/internal.h
> +++ b/arch/x86/include/asm/fpu/internal.h
> @@ -126,22 +126,6 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu);
> _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_fprestore) \
> : output : input)
>
> -static inline int copy_fregs_to_user(struct fregs_state __user *fx)
> -{
> - return user_insn(fnsave %[fx]; fwait, [fx] "=m" (*fx), "m" (*fx));
> -}
> -
> -static inline int copy_fxregs_to_user(struct fxregs_state __user *fx)
> -{
> - if (IS_ENABLED(CONFIG_X86_32))
> - return user_insn(fxsave %[fx], [fx] "=m" (*fx), "m" (*fx));
> - else if (IS_ENABLED(CONFIG_AS_FXSAVEQ))
> - return user_insn(fxsaveq %[fx], [fx] "=m" (*fx), "m" (*fx));
> -
> - /* See comment in copy_fxregs_to_kernel() below. */
> - return user_insn(rex64/fxsave (%[fx]), "=m" (*fx), [fx] "R" (fx));
> -}
> -
> static inline void copy_kernel_to_fxregs(struct fxregs_state *fx)
> {
> if (IS_ENABLED(CONFIG_X86_32)) {
> @@ -352,35 +336,6 @@ static inline void copy_kernel_to_xregs(struct xregs_state *xstate, u64 mask)
> XSTATE_XRESTORE(xstate, lmask, hmask);
> }
>
> -/*
> - * Save xstate to user space xsave area.
> - *
> - * We don't use modified optimization because xrstor/xrstors might track
> - * a different application.
> - *
> - * We don't use compacted format xsave area for
> - * backward compatibility for old applications which don't understand
> - * compacted format of xsave area.
> - */
> -static inline int copy_xregs_to_user(struct xregs_state __user *buf)
> -{
> - int err;
> -
> - /*
> - * Clear the xsave header first, so that reserved fields are
> - * initialized to zero.
> - */
> - err = __clear_user(&buf->header, sizeof(buf->header));
> - if (unlikely(err))
> - return -EFAULT;
> -
> - stac();
> - XSTATE_OP(XSAVE, buf, -1, -1, err);
> - clac();
> -
> - return err;
> -}
> -
> /*
> * Restore xstate from user space xsave area.
> */
> diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c
> index 23f1691670b66..c8f5ff58578ed 100644
> --- a/arch/x86/kernel/fpu/signal.c
> +++ b/arch/x86/kernel/fpu/signal.c
> @@ -117,23 +117,6 @@ static inline int save_xstate_epilog(void __user *buf, int ia32_frame)
>
> return err;
> }
> -
> -static inline int copy_fpregs_to_sigframe(struct xregs_state __user *buf)
> -{
> - int err;
> -
> - if (use_xsave())
> - err = copy_xregs_to_user(buf);
> - else if (use_fxsr())
> - err = copy_fxregs_to_user((struct fxregs_state __user *) buf);
> - else
> - err = copy_fregs_to_user((struct fregs_state __user *) buf);
> -
> - if (unlikely(err) && __clear_user(buf, fpu_user_xstate_size))
> - err = -EFAULT;
> - return err;
> -}
> -
> /*
> * Save the fpu, extended register state to the user signal frame.
> *
> @@ -172,27 +155,20 @@ int copy_fpstate_to_sigframe(void __user *buf, void __user *buf_fx, int size)
> sizeof(struct user_i387_ia32_struct), NULL,
> (struct _fpstate_32 __user *) buf) ? -1 : 1;
>
> - if (fpu->initialized || using_compacted_format()) {
> - /* Save the live register state to the user directly. */
> - if (copy_fpregs_to_sigframe(buf_fx))
> - return -1;
> - /* Update the thread's fxstate to save the fsave header. */
> - if (ia32_fxstate)
> - copy_fxregs_to_kernel(fpu);
> + /* Update the thread's fxstate to save the fsave header. */
> + if (ia32_fxstate) {
> + copy_fxregs_to_kernel(fpu);
> } else {
> - /*
> - * It is a *bug* if kernel uses compacted-format for xsave
> - * area and we copy it out directly to a signal frame. It
> - * should have been handled above by saving the registers
> - * directly.
> - */
> - if (boot_cpu_has(X86_FEATURE_XSAVES)) {
> - WARN_ONCE(1, "x86/fpu: saving compacted-format xsave area to a signal frame!\n");
> - return -1;
> - }
> + copy_fpregs_to_fpstate(fpu);
> + fpregs_deactivate(fpu);
> + }
Could you add a high-level comment for this if{}else{} block that says
something like:
/* Save the registers to the fpstate. */
I also think it's worthwhile to explain the asymmetry between the
ia32_fxstate case and the other branch. Why don't we
fpregs_deactivate() in the ia32_fxstate path, for instance?
> + if (using_compacted_format()) {
> + copy_xstate_to_user(buf_fx, xsave, 0, size);
> + } else {
> fpstate_sanitize_xstate(fpu);
> - if (__copy_to_user(buf_fx, xsave, fpu_user_xstate_size))
> + size = fpu_user_xstate_size;
> + if (__copy_to_user(buf_fx, xsave, size))
> return -1;
> }
This seems unnecessary. Why are you updating 'size' like this?
next prev parent reply other threads:[~2018-10-12 18:15 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-04 14:05 [PATCH 00/11 v3] x86: load FPU registers on return to userland Sebastian Andrzej Siewior
2018-10-04 14:05 ` [PATCH 01/11] x86/entry: remove _TIF_ALLWORK_MASK Sebastian Andrzej Siewior
2018-10-11 16:27 ` Borislav Petkov
2018-10-04 14:05 ` [PATCH 02/11] x86/fpu: add (__)make_fpregs_active helpers Sebastian Andrzej Siewior
2018-10-04 14:05 ` [PATCH 03/11] x86/fpu: make __raw_xsave_addr() use feature number instead of mask Sebastian Andrzej Siewior
2018-10-11 17:30 ` Christophe de Dinechin
2018-10-18 11:19 ` Sebastian Andrzej Siewior
2018-10-12 15:52 ` Dave Hansen
2018-10-18 11:17 ` Sebastian Andrzej Siewior
2018-10-18 11:21 ` Sebastian Andrzej Siewior
2018-10-17 10:01 ` Borislav Petkov
2018-10-18 11:48 ` Sebastian Andrzej Siewior
2018-10-04 14:05 ` [PATCH 04/11] x86/fpu: eager switch PKRU state Sebastian Andrzej Siewior
2018-10-12 17:51 ` Dave Hansen
2018-10-12 18:09 ` Andy Lutomirski
2018-10-12 19:44 ` Dave Hansen
2018-10-18 16:13 ` Sebastian Andrzej Siewior
2018-10-18 17:50 ` Dave Hansen
2018-10-04 14:05 ` [PATCH 05/11] x86/fpu: set PKRU state for kernel threads Sebastian Andrzej Siewior
2018-10-12 17:54 ` Dave Hansen
2018-10-12 18:02 ` Andy Lutomirski
2018-10-18 16:26 ` Sebastian Andrzej Siewior
2018-10-18 16:48 ` Andy Lutomirski
2018-10-18 17:47 ` Dave Hansen
2018-10-18 18:25 ` Sebastian Andrzej Siewior
2018-10-18 20:46 ` Andy Lutomirski
2018-10-18 20:56 ` Dave Hansen
2018-10-18 21:24 ` Sebastian Andrzej Siewior
2018-10-18 21:58 ` Andy Lutomirski
2018-10-19 7:44 ` Paolo Bonzini
2018-10-19 16:59 ` Andy Lutomirski
2018-10-19 17:01 ` Dave Hansen
2018-10-19 17:37 ` Andy Lutomirski
2018-10-19 18:26 ` Dave Hansen
2018-10-04 14:05 ` [PATCH 06/11] x86/pkeys: make init_pkru_value static Sebastian Andrzej Siewior
2018-10-12 17:55 ` Dave Hansen
2018-10-04 14:05 ` [PATCH 07/11] x86/pkeys: Drop the preempt-disable section Sebastian Andrzej Siewior
2018-10-12 17:58 ` Dave Hansen
2018-10-12 18:07 ` Andy Lutomirski
2018-10-12 20:26 ` Sebastian Andrzej Siewior
2018-10-04 14:05 ` [PATCH 08/11] x86/fpu: Always store the registers in copy_fpstate_to_sigframe() Sebastian Andrzej Siewior
2018-10-11 17:50 ` Christophe de Dinechin
2018-10-11 21:18 ` Andy Lutomirski
2018-10-12 18:15 ` Dave Hansen [this message]
2018-11-02 14:42 ` Sebastian Andrzej Siewior
2018-10-04 14:05 ` [PATCH 09/11] x86/entry: add TIF_LOAD_FPU Sebastian Andrzej Siewior
2018-10-04 14:05 ` [PATCH 10/11] x86/fpu: prepare copy_fpstate_to_sigframe for TIF_LOAD_FPU Sebastian Andrzej Siewior
2018-10-12 19:40 ` Dave Hansen
2018-10-15 15:24 ` Borislav Petkov
2018-11-02 15:44 ` Sebastian Andrzej Siewior
2018-11-02 22:55 ` Sebastian Andrzej Siewior
2018-10-04 14:05 ` [PATCH 11/11] x86/fpu: defer FPU state load until return to userspace Sebastian Andrzej Siewior
2018-10-04 16:14 ` Andy Lutomirski
2018-10-12 20:25 ` Sebastian Andrzej Siewior
2018-10-04 16:45 ` [PATCH 00/11 v3] x86: load FPU registers on return to userland Rik van Riel
2018-10-04 16:50 ` Andy Lutomirski
2018-10-05 11:55 ` Sebastian Andrzej Siewior
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=53f013ca-d6ff-2387-f9b0-d6c6df66d082@linux.intel.com \
--to=dave.hansen@linux.intel.com \
--cc=Jason@zx2c4.com \
--cc=bigeasy@linutronix.de \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=pbonzini@redhat.com \
--cc=riel@surriel.com \
--cc=rkrcmar@redhat.com \
--cc=x86@kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).