[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <b639e14b57a08f3a8931e44ed26101867414b4be.1554737688.git.tom.zanussi@linux.intel.com>
Date: Mon, 8 Apr 2019 14:14:03 -0500
From: Tom Zanussi <zanussi@...nel.org>
To: linux-kernel@...r.kernel.org, linux-rt-users@...r.kernel.org
Cc: rostedt@...dmis.org, tglx@...utronix.de, C.Emde@...dl.org,
jkacur@...hat.com, bigeasy@...utronix.de,
daniel.wagner@...mens.com, julia@...com, amartin@...dia.com
Subject: [PATCH 01/13] arm64: fpsimd: use preemp_disable in addition to local_bh_disable()
4.14.109-rt58-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@...utronix.de>
[ 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 <bigeasy@...utronix.de>
[tom.zanussi@...ux.intel.com: ignored sve-related changes]
Signed-off-by: Tom Zanussi <tom.zanussi@...ux.intel.com>
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(¤t->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(¤t->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
Powered by blists - more mailing lists