All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Chang S. Bae" <chang.seok.bae@intel.com>
To: Andrei Vagin <avagin@google.com>,
	Thomas Gleixner <tglx@kernel.org>,
	"Ingo Molnar" <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>
Cc: <linux-kernel@vger.kernel.org>, <criu@lists.linux.dev>,
	Dave Hansen <dave.hansen@linux.intel.com>, <x86@kernel.org>,
	Alexander Mikhalitsyn <alexander@mihalicyn.com>,
	"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH 3/7] x86/fpu: Extract restore_from_ia32_fxstate() and clean up fpu__restore_sig()
Date: Mon, 14 Sep 2026 10:00:48 -0700	[thread overview]
Message-ID: <e3a39ad8-367e-4adb-805c-9fc6923769e0@intel.com> (raw)
In-Reply-To: <20260908043427.1842515-4-avagin@google.com>

On 9/7/2026 9:34 PM, Andrei Vagin wrote:
> Improve readability of the signal frame restoration code. Previously,

Note the tip- changelog style:
   https://docs.kernel.org/process/maintainer-tip.htm
   ... A good structure is to explain the context, the problem and the
   solution in separate paragraphs and this order. ...

This first sentence doesn't appear to be the context/problem itself.

> most of __fpu_restore_sig() was dedicated to handling the 32-bit compat
> fpstate, while the native direct path lived in restore_fpregs_from_user().
> Having the compat handling intermixed with the main flow made it tricky
> to quickly see what code was doing what.
> 
> Extract the 32-bit legacy/compat FPU restore handling into a separate
> helper function, restore_from_ia32_fxstate(), and inline the remainder
> of __fpu_restore_sig() directly into fpu__restore_sig().
> 
> The legacy 32-bit FP frame duplicates the FP state portion of the
> FX/XSAVE frame. For backward compatibility, the legacy FP frame is
> treated as the source of truth, and its state is folded into the
> FX/XSAVE state before restoring the registers.
> 
> Reviewed-by: Alexander Mikhalitsyn <alexander@mihalicyn.com>
> Signed-off-by: Andrei Vagin <avagin@google.com>

...


>   static inline unsigned int xstate_sigframe_size(struct fpstate *fpstate)
>   {
> @@ -450,10 +449,11 @@ static inline unsigned int xstate_sigframe_size(struct fpstate *fpstate)
>   bool fpu__restore_sig(void __user *buf, int ia32_frame)
>   {
>   	struct fpu *fpu = x86_task_fpu(current);
> -	void __user *buf_fx = buf;
> +	bool success = false, fx_only = false;
>   	bool ia32_fxstate = false;
> -	bool success = false;
> +	void __user *buf_fx = buf;
>   	unsigned int size;
> +	u64 xrestore_mask;
>   
>   	if (unlikely(!buf)) {
>   		fpu__clear_user_states(fpu);
> @@ -482,10 +482,29 @@ bool fpu__restore_sig(void __user *buf, int ia32_frame)
>   		success = !fpregs_soft_set(current, NULL, 0,
>   					   sizeof(struct user_i387_ia32_struct),
>   					   NULL, buf);
> +		goto out;
> +	}
> +
> +	if (use_xsave()) {
> +		struct _fpx_sw_bytes fx_sw_user;
> +
> +		if (!check_xstate_in_sigframe(buf_fx, &fx_sw_user))
> +			goto out;
> +
> +		fx_only = !fx_sw_user.magic1;
> +		xrestore_mask = fx_sw_user.xfeatures;
>   	} else {
> -		success = __fpu_restore_sig(buf, buf_fx, ia32_fxstate);
> +		xrestore_mask = XFEATURE_MASK_FPSSE;
> +	}
> +
> +	if (ia32_fxstate) {
> +		success = restore_from_ia32_fxstate(buf, buf_fx,
> +						    xrestore_mask, fx_only);
> +		goto out;
>   	}
>   
> +	/* Restore the FPU registers directly from user memory. */
> +	success = restore_fpregs_from_user(buf_fx, xrestore_mask, fx_only);

Nit: Just stylistic - maybe this could also be kept a bit simpler:

   if (ia32_fxstate)
       success = restore_from_ia32_fxstate();
   else
       success = restore_fpregs_from_user();

Overall, I think this refactoring makes the flow easier to follow with 
smaller pieces:

   Reviewed-by: Chang S. Bae <chang.seok.bae@intel.com>

Thanks,
Chang

  reply	other threads:[~2026-09-14 17:00 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-08  4:34 [PATCH v5 0/7] x86/fpu: Restore and reinforce signal frame portability Andrei Vagin
2026-09-08  4:34 ` [PATCH 1/7] x86/fpu: Document signal frame layout and portability Andrei Vagin
2026-09-16  4:53   ` Borislav Petkov
2026-09-16 15:31   ` Borislav Petkov
2026-09-08  4:34 ` [PATCH 2/7] x86/fpu: Clean up and rename variables in signal frame handling Andrei Vagin
2026-09-08  4:34 ` [PATCH 3/7] x86/fpu: Extract restore_from_ia32_fxstate() and clean up fpu__restore_sig() Andrei Vagin
2026-09-14 17:00   ` Chang S. Bae [this message]
2026-09-08  4:34 ` [PATCH 4/7] x86/fpu: Document reasoning of FX-only fallback Andrei Vagin
2026-09-08  4:34 ` [PATCH 5/7] x86/fpu: Fix potential underflow in xstate_calculate_size() Andrei Vagin
2026-09-08  4:34 ` [PATCH 6/7] x86/fpu: Pre-fault only required size of xstate buffer Andrei Vagin
2026-09-08  4:34 ` [PATCH 7/7] selftests/x86: Add tests for signal frame FPU portability Andrei Vagin
2026-09-14 17:03   ` Chang S. Bae
2026-09-14 17:05 ` [PATCH v5 0/7] x86/fpu: Restore and reinforce signal frame portability Chang S. Bae
  -- strict thread matches above, loose matches on Subject: below --
2026-09-16 23:23 [PATCH v6 " Andrei Vagin
2026-09-16 23:23 ` [PATCH 3/7] x86/fpu: Extract restore_from_ia32_fxstate() and clean up fpu__restore_sig() Andrei Vagin
2026-09-22  0:45   ` Borislav Petkov
2026-09-24  4:15 [PATCH v7 0/7] x86/fpu: Restore and reinforce signal frame portability Andrei Vagin
2026-09-24  4:15 ` [PATCH 3/7] x86/fpu: Extract restore_from_ia32_fxstate() and clean up fpu__restore_sig() Andrei Vagin
2026-09-24 21:01 [PATCH v8 0/7] x86/fpu: Restore and reinforce signal frame portability Andrei Vagin
2026-09-24 21:01 ` [PATCH 3/7] x86/fpu: Extract restore_from_ia32_fxstate() and clean up fpu__restore_sig() Andrei Vagin
2026-09-25 16:24 [PATCH v8.1 0/7] x86/fpu: Restore and reinforce signal frame portability Andrei Vagin
2026-09-25 16:24 ` [PATCH 3/7] x86/fpu: Extract restore_from_ia32_fxstate() and clean up fpu__restore_sig() Andrei Vagin

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=e3a39ad8-367e-4adb-805c-9fc6923769e0@intel.com \
    --to=chang.seok.bae@intel.com \
    --cc=alexander@mihalicyn.com \
    --cc=avagin@google.com \
    --cc=bp@alien8.de \
    --cc=criu@lists.linux.dev \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@kernel.org \
    --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 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.