lkml.org 
[lkml]   [2019]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 01/13] arm64: fpsimd: use preemp_disable in addition to local_bh_disable()
Date
4.14.109-rt58-rc1 stable review patch.
If anyone has any objections, please let me know.

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

From: Sebastian Andrzej Siewior <bigeasy@linutronix.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@linutronix.de>
[tom.zanussi@linux.intel.com: ignored sve-related changes]
Signed-off-by: Tom Zanussi <tom.zanussi@linux.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(&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
\
 
 \ /
  Last update: 2019-04-08 21:16    [W:0.137 / U:0.060 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site