lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
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