Commit-ID:  e6da8bb6f9abb2628381904b24163c770e630bac
Gitweb:     https://git.kernel.org/tip/e6da8bb6f9abb2628381904b24163c770e630bac
Author:     Thomas Gleixner <t...@linutronix.de>
AuthorDate: Sun, 25 Nov 2018 19:33:51 +0100
Committer:  Thomas Gleixner <t...@linutronix.de>
CommitDate: Wed, 28 Nov 2018 11:57:12 +0100

x86/speculation: Split out TIF update

The update of the TIF_SSBD flag and the conditional speculation control MSR
update is done in the ssb_prctl_set() function directly. The upcoming prctl
support for controlling indirect branch speculation via STIBP needs the
same mechanism.

Split the code out and make it reusable. Reword the comment about updates
for other tasks.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
Reviewed-by: Ingo Molnar <mi...@kernel.org>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Andy Lutomirski <l...@kernel.org>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Jiri Kosina <jkos...@suse.cz>
Cc: Tom Lendacky <thomas.lenda...@amd.com>
Cc: Josh Poimboeuf <jpoim...@redhat.com>
Cc: Andrea Arcangeli <aarca...@redhat.com>
Cc: David Woodhouse <d...@amazon.co.uk>
Cc: Tim Chen <tim.c.c...@linux.intel.com>
Cc: Andi Kleen <a...@linux.intel.com>
Cc: Dave Hansen <dave.han...@intel.com>
Cc: Casey Schaufler <casey.schauf...@intel.com>
Cc: Asit Mallick <asit.k.mall...@intel.com>
Cc: Arjan van de Ven <ar...@linux.intel.com>
Cc: Jon Masters <j...@redhat.com>
Cc: Waiman Long <longman9...@gmail.com>
Cc: Greg KH <gre...@linuxfoundation.org>
Cc: Dave Stewart <david.c.stew...@intel.com>
Cc: Kees Cook <keesc...@chromium.org>
Cc: sta...@vger.kernel.org
Link: https://lkml.kernel.org/r/20181125185005.652305...@linutronix.de

---
 arch/x86/kernel/cpu/bugs.c | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
index 7c946a9af947..3b65a53d2c33 100644
--- a/arch/x86/kernel/cpu/bugs.c
+++ b/arch/x86/kernel/cpu/bugs.c
@@ -702,10 +702,29 @@ static void ssb_select_mitigation(void)
 #undef pr_fmt
 #define pr_fmt(fmt)     "Speculation prctl: " fmt
 
-static int ssb_prctl_set(struct task_struct *task, unsigned long ctrl)
+static void task_update_spec_tif(struct task_struct *tsk, int tifbit, bool on)
 {
        bool update;
 
+       if (on)
+               update = !test_and_set_tsk_thread_flag(tsk, tifbit);
+       else
+               update = test_and_clear_tsk_thread_flag(tsk, tifbit);
+
+       /*
+        * Immediately update the speculation control MSRs for the current
+        * task, but for a non-current task delay setting the CPU
+        * mitigation until it is scheduled next.
+        *
+        * This can only happen for SECCOMP mitigation. For PRCTL it's
+        * always the current task.
+        */
+       if (tsk == current && update)
+               speculation_ctrl_update_current();
+}
+
+static int ssb_prctl_set(struct task_struct *task, unsigned long ctrl)
+{
        if (ssb_mode != SPEC_STORE_BYPASS_PRCTL &&
            ssb_mode != SPEC_STORE_BYPASS_SECCOMP)
                return -ENXIO;
@@ -716,28 +735,20 @@ static int ssb_prctl_set(struct task_struct *task, 
unsigned long ctrl)
                if (task_spec_ssb_force_disable(task))
                        return -EPERM;
                task_clear_spec_ssb_disable(task);
-               update = test_and_clear_tsk_thread_flag(task, TIF_SSBD);
+               task_update_spec_tif(task, TIF_SSBD, false);
                break;
        case PR_SPEC_DISABLE:
                task_set_spec_ssb_disable(task);
-               update = !test_and_set_tsk_thread_flag(task, TIF_SSBD);
+               task_update_spec_tif(task, TIF_SSBD, true);
                break;
        case PR_SPEC_FORCE_DISABLE:
                task_set_spec_ssb_disable(task);
                task_set_spec_ssb_force_disable(task);
-               update = !test_and_set_tsk_thread_flag(task, TIF_SSBD);
+               task_update_spec_tif(task, TIF_SSBD, true);
                break;
        default:
                return -ERANGE;
        }
-
-       /*
-        * If being set on non-current task, delay setting the CPU
-        * mitigation until it is next scheduled.
-        */
-       if (task == current && update)
-               speculation_ctrl_update_current();
-
        return 0;
 }
 

Reply via email to