From: Borislav Petkov <bp@suse.de>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Dave Hansen <dave.hansen@intel.com>,
Ingo Molnar <mingo@kernel.org>,
Andy Lutomirski <luto@amacapital.net>,
Linus Torvalds <torvalds@linux-foundation.org>,
Pekka Riikonen <priikone@iki.fi>, Rik van Riel <riel@redhat.com>,
Suresh Siddha <sbsiddha@gmail.com>,
LKML <linux-kernel@vger.kernel.org>,
"Yu, Fenghua" <fenghua.yu@intel.com>,
Quentin Casasnovas <quentin.casasnovas@oracle.com>,
"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH RFC 0/2] x86/fpu: avoid "xstate_fault" in xsave_user/xrestore_user
Date: Mon, 16 Mar 2015 15:36:05 +0100 [thread overview]
Message-ID: <20150316143605.GL22995@pd.tnic> (raw)
In-Reply-To: <20150315164948.GA28149@redhat.com>
On Sun, Mar 15, 2015 at 05:49:48PM +0100, Oleg Nesterov wrote:
> Hello.
>
> Another a bit off-topic change, but I'd like to finish the discussion
> with Quentin.
>
> And almost cosmetic. But I added the RFC tag to make it clear that this
> needs a review from someone who understands gcc-asm better. In particular
> I am worried if that dummy "=m" (*buf) is actually correct.
>
>
> And I agree with Quentin, user_insn/check_insn can be improved to allow
> clobbers, more flexible "output", etc. But imo they already can make this
> code look a bit better, and "xstate_fault" must die eventually.
FWIW, I did poke at that but there's still something wrong with my macros, will
take a look when I get a chance:
---
arch/x86/include/asm/xsave.h | 130 +++++++++++++++++++++++++++----------------
1 file changed, 82 insertions(+), 48 deletions(-)
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h
index c9a6d68b8d62..a35e9d49843d 100644
--- a/arch/x86/include/asm/xsave.h
+++ b/arch/x86/include/asm/xsave.h
@@ -67,6 +67,51 @@ extern int init_fpu(struct task_struct *child);
_ASM_EXTABLE(1b, 3b) \
: [err] "=r" (err)
+#define XSTATE_OP(op, st, lmask, hmask, err) \
+ asm volatile("1:" op "\n\t" \
+ "2:\n\t" \
+ ".pushsection .fixup,\"ax\"\n\t" \
+ "3: movl $-1,%[err]\n\t" \
+ "jmp 2b\n\t" \
+ ".popsection\n\t" \
+ _ASM_EXTABLE(1b, 3b) \
+ : [err] "=r" (err) \
+ : "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \
+ : "memory")
+
+/*
+ * 661 and alt_end_marker labels below are defined in ALTERNATIVE*
+ * and we're reusing them here so as not to clutter this macro
+ * unnecessarily.
+ */
+#define XSTATE_XSAVE(st, lmask, hmask, err) \
+ asm volatile(ALTERNATIVE_2(XSAVE, \
+ XSAVEOPT, X86_FEATURE_XSAVEOPT, \
+ XSAVES, X86_FEATURE_XSAVES) \
+ "\n" \
+ ".pushsection .fixup,\"ax\"\n" \
+ "3: movl $-1, %[err]\n" \
+ "jmp " alt_end_marker "b\n" \
+ ".popsection\n" \
+ _ASM_EXTABLE(661b, 3b) \
+ : [err] "=r" (err) \
+ : "D" (st), "a" (lmask), "d" (hmask) \
+ : "memory")
+
+#define XSTATE_XRESTORE(st, lmask, hmask, err) \
+ asm volatile(ALTERNATIVE(XRSTOR, \
+ XRSTORS, X86_FEATURE_XSAVES) \
+ "\n" \
+ ".pushsection .fixup,\"ax\"\n" \
+ "3: movl $-1, %[err]\n" \
+ "jmp 663b\n" \
+ ".popsection\n" \
+ _ASM_EXTABLE(661b, 3b) \
+ : [err] "=r" (err) \
+ : "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \
+ : "memory")
+
+
/*
* This function is called only during boot time when x86 caps are not set
* up and alternative can not be used yet.
@@ -77,20 +122,11 @@ static inline int xsave_state_booting(struct xsave_struct *fx, u64 mask)
u32 hmask = mask >> 32;
int err = 0;
- WARN_ON(system_state != SYSTEM_BOOTING);
-
- if (boot_cpu_has(X86_FEATURE_XSAVES))
- asm volatile("1:"XSAVES"\n\t"
- "2:\n\t"
- xstate_fault
- : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
- : "memory");
+ if (static_cpu_has_safe(X86_FEATURE_XSAVES))
+ XSTATE_OP(XSAVES, fx, lmask, hmask, err);
else
- asm volatile("1:"XSAVE"\n\t"
- "2:\n\t"
- xstate_fault
- : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
- : "memory");
+ XSTATE_OP(XSAVE, fx, lmask, hmask, err);
+
return err;
}
...
To be continued...
--
Regards/Gruss,
Boris.
ECO tip #101: Trim your mails when you reply.
--
next prev parent reply other threads:[~2015-03-16 14:37 UTC|newest]
Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-04 18:30 Oops with tip/x86/fpu Dave Hansen
2015-03-04 19:06 ` Oleg Nesterov
2015-03-04 19:12 ` Dave Hansen
2015-03-04 20:06 ` Borislav Petkov
2015-03-05 15:14 ` Oleg Nesterov
[not found] ` <20150305182203.GA4203@redhat.com>
2015-03-05 18:34 ` Dave Hansen
2015-03-05 18:46 ` Oleg Nesterov
2015-03-05 18:41 ` Dave Hansen
2015-03-26 22:37 ` Yu, Fenghua
2015-03-26 22:43 ` Dave Hansen
2015-03-26 22:48 ` Yu, Fenghua
2015-03-27 7:30 ` Quentin Casasnovas
2015-03-27 19:06 ` Oleg Nesterov
2015-03-05 8:38 ` Quentin Casasnovas
2015-03-05 15:13 ` Oleg Nesterov
2015-03-05 18:42 ` Borislav Petkov
2015-03-05 22:16 ` Dave Hansen
2015-03-05 19:51 ` [PATCH 0/1] x86/fpu: math_state_restore() should not blindly disable irqs Oleg Nesterov
2015-03-05 19:51 ` [PATCH 1/1] " Oleg Nesterov
2015-03-05 20:11 ` Ingo Molnar
2015-03-05 21:25 ` Oleg Nesterov
2015-03-06 7:58 ` Ingo Molnar
2015-03-06 13:26 ` Oleg Nesterov
2015-03-06 13:39 ` Oleg Nesterov
2015-03-06 13:46 ` Ingo Molnar
2015-03-06 14:01 ` Oleg Nesterov
2015-03-06 14:17 ` Oleg Nesterov
2015-03-06 15:00 ` David Vrabel
2015-03-06 15:36 ` Oleg Nesterov
2015-03-06 16:15 ` David Vrabel
2015-03-06 16:31 ` Oleg Nesterov
2015-03-06 17:33 ` Linus Torvalds
2015-03-06 18:15 ` Oleg Nesterov
2015-03-06 19:23 ` Andy Lutomirski
2015-03-06 22:00 ` Linus Torvalds
2015-03-06 22:28 ` Andy Lutomirski
2015-03-07 10:36 ` Ingo Molnar
2015-03-07 20:11 ` Linus Torvalds
2015-03-08 8:55 ` Ingo Molnar
2015-03-08 11:38 ` Ingo Molnar
2015-03-08 13:59 ` Andy Lutomirski
2015-03-08 14:38 ` Andy Lutomirski
2015-03-07 10:32 ` Ingo Molnar
2015-03-07 15:38 ` [PATCH 0/1] x86/fpu: x86/fpu: avoid math_state_restore() without used_math() in __restore_xstate_sig() Oleg Nesterov
2015-03-07 15:38 ` [PATCH 1/1] " Oleg Nesterov
2015-03-09 14:07 ` Borislav Petkov
2015-03-09 14:34 ` Oleg Nesterov
2015-03-09 15:18 ` Borislav Petkov
2015-03-09 16:24 ` Oleg Nesterov
2015-03-09 16:53 ` Borislav Petkov
2015-03-09 17:05 ` Oleg Nesterov
2015-03-09 17:23 ` Borislav Petkov
2015-03-16 12:07 ` [tip:x86/urgent] x86/fpu: Avoid " tip-bot for Oleg Nesterov
2015-03-05 20:35 ` [PATCH 0/1] x86/fpu: math_state_restore() should not blindly disable irqs Oleg Nesterov
2015-03-09 17:10 ` [PATCH] x86/fpu: drop_fpu() should not assume that tsk == current Oleg Nesterov
2015-03-09 17:36 ` Rik van Riel
2015-03-09 17:48 ` Borislav Petkov
2015-03-09 18:06 ` Oleg Nesterov
2015-03-09 18:10 ` Borislav Petkov
2015-03-16 12:07 ` [tip:x86/urgent] x86/fpu: Drop_fpu() should not assume that tsk equals current tip-bot for Oleg Nesterov
2015-03-11 17:33 ` [PATCH 0/4] x86/fpu: avoid math_state_restore() on kthread exec Oleg Nesterov
2015-03-11 17:34 ` [PATCH 1/4] x86/fpu: document user_fpu_begin() Oleg Nesterov
2015-03-13 9:47 ` Borislav Petkov
2015-03-13 14:34 ` Oleg Nesterov
2015-03-23 12:20 ` [tip:x86/fpu] x86/fpu: Document user_fpu_begin() tip-bot for Oleg Nesterov
2015-03-11 17:34 ` [PATCH 2/4] x86/fpu: introduce restore_init_xstate() Oleg Nesterov
2015-03-13 10:34 ` Borislav Petkov
2015-03-13 14:39 ` Oleg Nesterov
2015-03-13 15:20 ` Borislav Petkov
2015-03-16 19:05 ` Rik van Riel
2015-03-23 12:20 ` [tip:x86/fpu] x86/fpu: Introduce restore_init_xstate() tip-bot for Oleg Nesterov
2015-03-11 17:34 ` [PATCH 3/4] x86/fpu: use restore_init_xstate() instead of math_state_restore() on kthread exec Oleg Nesterov
2015-03-13 10:48 ` Borislav Petkov
2015-03-13 14:45 ` Oleg Nesterov
2015-03-13 15:51 ` Borislav Petkov
2015-03-23 12:21 ` [tip:x86/fpu] x86/fpu: Use " tip-bot for Oleg Nesterov
2015-03-11 17:35 ` [PATCH 4/4] x86/fpu: don't abuse drop_init_fpu() in flush_thread() Oleg Nesterov
2015-03-13 10:52 ` Borislav Petkov
2015-03-13 14:55 ` Oleg Nesterov
2015-03-13 16:19 ` Borislav Petkov
2015-03-13 16:26 ` Oleg Nesterov
2015-03-13 19:27 ` Borislav Petkov
2015-03-14 14:48 ` Oleg Nesterov
2015-03-15 17:36 ` Borislav Petkov
2015-03-15 18:16 ` Oleg Nesterov
2015-03-15 18:50 ` Borislav Petkov
2015-03-15 20:04 ` Oleg Nesterov
2015-03-15 20:38 ` Borislav Petkov
2015-03-16 9:35 ` Borislav Petkov
2015-03-16 10:28 ` Ingo Molnar
2015-03-16 14:39 ` Oleg Nesterov
2015-03-16 15:26 ` Borislav Petkov
2015-03-16 15:34 ` Andy Lutomirski
2015-03-16 15:35 ` Borislav Petkov
2015-03-13 17:30 ` [PATCH v2 " Oleg Nesterov
2015-03-14 10:55 ` Borislav Petkov
2015-03-14 10:57 ` [PATCH] x86/fpu: Fold __drop_fpu() into its sole user Borislav Petkov
2015-03-14 15:15 ` Oleg Nesterov
2015-03-16 10:27 ` Ingo Molnar
2015-03-23 12:21 ` [tip:x86/fpu] x86/fpu: Don't abuse drop_init_fpu() in flush_thread() tip-bot for Oleg Nesterov
2015-03-13 18:26 ` [PATCH 0/1] x86/cpu: don't allocate fpu->state for swapper/0 Oleg Nesterov
2015-03-13 18:27 ` [PATCH 1/1] " Oleg Nesterov
2015-03-16 10:18 ` Borislav Petkov
2015-03-23 12:22 ` [tip:x86/fpu] x86/fpu: Don't " tip-bot for Oleg Nesterov
2015-03-14 11:16 ` [PATCH 0/1] x86/cpu: don't " Borislav Petkov
2015-03-14 15:13 ` [PATCH 0/1] x86/cpu: kill eager_fpu_init_bp() Oleg Nesterov
2015-03-14 15:13 ` [PATCH 1/1] " Oleg Nesterov
2015-03-16 12:44 ` Borislav Petkov
2015-03-23 12:22 ` [tip:x86/fpu] x86/fpu: Kill eager_fpu_init_bp() tip-bot for Oleg Nesterov
2015-03-15 16:49 ` [PATCH RFC 0/2] x86/fpu: avoid "xstate_fault" in xsave_user/xrestore_user Oleg Nesterov
2015-03-15 16:50 ` [PATCH RFC 1/2] x86: introduce __user_insn() and __check_insn() Oleg Nesterov
2015-03-15 16:50 ` [PATCH RFC 2/2] x86/fpu: change xsave_user() and xrestore_user() to use __user_insn() Oleg Nesterov
2015-03-16 22:43 ` Quentin Casasnovas
2015-03-17 9:35 ` Borislav Petkov
2015-03-16 14:36 ` Borislav Petkov [this message]
2015-03-16 14:57 ` [PATCH RFC 0/2] x86/fpu: avoid "xstate_fault" in xsave_user/xrestore_user Oleg Nesterov
2015-03-16 17:58 ` Borislav Petkov
2015-03-16 22:37 ` Quentin Casasnovas
2015-03-17 9:47 ` Borislav Petkov
2015-03-17 10:00 ` Quentin Casasnovas
2015-03-17 11:20 ` Borislav Petkov
2015-03-17 11:36 ` Quentin Casasnovas
2015-03-17 12:07 ` Borislav Petkov
2015-03-18 9:06 ` Quentin Casasnovas
2015-03-18 9:53 ` Borislav Petkov
2015-03-17 10:07 ` Quentin Casasnovas
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=20150316143605.GL22995@pd.tnic \
--to=bp@suse.de \
--cc=dave.hansen@intel.com \
--cc=fenghua.yu@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=priikone@iki.fi \
--cc=quentin.casasnovas@oracle.com \
--cc=riel@redhat.com \
--cc=sbsiddha@gmail.com \
--cc=torvalds@linux-foundation.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.