4.14.109-rt58-rc1 stable review patch.
If anyone has any objections, please let me know.

------------------

From: Sebastian Andrzej Siewior <[email protected]>

[ Upstream commit 3afdfe419c33c1655d0763e070350aad44416594 ]

In v4.16-RT I noticed a number of warnings from task_fpsimd_load(). The
code disables BH and expects that it is not preemptible. On -RT the
task remains preemptible but remains the same CPU. This may corrupt the
content of the SIMD registers if the task is preempted during
saving/restoring those registers.

Add preempt_disable()/enable() to enfore the required semantic on -RT.

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
[[email protected]: ignored sve-related changes]
Signed-off-by: Tom Zanussi <[email protected]>

 Conflicts:
        arch/arm64/kernel/fpsimd.c
---
 arch/arm64/kernel/fpsimd.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 5d547deb6996..049641a458f3 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -172,6 +172,7 @@ void fpsimd_flush_thread(void)
        if (!system_supports_fpsimd())
                return;
 
+       preempt_disable();
        local_bh_disable();
 
        memset(&current->thread.fpsimd_state, 0, sizeof(struct fpsimd_state));
@@ -179,6 +180,7 @@ void fpsimd_flush_thread(void)
        set_thread_flag(TIF_FOREIGN_FPSTATE);
 
        local_bh_enable();
+       preempt_enable();
 }
 
 /*
@@ -190,12 +192,14 @@ void fpsimd_preserve_current_state(void)
        if (!system_supports_fpsimd())
                return;
 
+       preempt_disable();
        local_bh_disable();
 
        if (!test_thread_flag(TIF_FOREIGN_FPSTATE))
                fpsimd_save_state(&current->thread.fpsimd_state);
 
        local_bh_enable();
+       preempt_enable();
 }
 
 /*
@@ -208,6 +212,7 @@ void fpsimd_restore_current_state(void)
        if (!system_supports_fpsimd())
                return;
 
+       preempt_disable();
        local_bh_disable();
 
        if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE)) {
@@ -219,6 +224,7 @@ void fpsimd_restore_current_state(void)
        }
 
        local_bh_enable();
+       preempt_enable();
 }
 
 /*
@@ -231,6 +237,7 @@ void fpsimd_update_current_state(struct fpsimd_state *state)
        if (!system_supports_fpsimd())
                return;
 
+       preempt_disable();
        local_bh_disable();
 
        fpsimd_load_state(state);
@@ -242,6 +249,7 @@ void fpsimd_update_current_state(struct fpsimd_state *state)
        }
 
        local_bh_enable();
+       preempt_enable();
 }
 
 /*
@@ -281,6 +289,7 @@ void kernel_neon_begin(void)
 
        BUG_ON(!may_use_simd());
 
+       preempt_disable();
        local_bh_disable();
 
        __this_cpu_write(kernel_neon_busy, true);
@@ -295,6 +304,7 @@ void kernel_neon_begin(void)
        preempt_disable();
 
        local_bh_enable();
+       preempt_enable();
 }
 EXPORT_SYMBOL(kernel_neon_begin);
 
-- 
2.14.1

Reply via email to