43 lines
1.4 KiB
Diff
43 lines
1.4 KiB
Diff
From: Paul Burton <paul.burton@imgtec.com>
|
|
Date: Thu, 21 Apr 2016 12:43:57 +0100
|
|
Subject: [1/2] MIPS: Disable preemption during prctl(PR_SET_FP_MODE, ...)
|
|
Origin: https://patchwork.linux-mips.org/patch/13144/
|
|
|
|
Whilst a PR_SET_FP_MODE prctl is performed there are decisions made
|
|
based upon whether the task is executing on the current CPU. This may
|
|
change if we're preempted, so disable preemption to avoid such changes
|
|
for the lifetime of the mode switch.
|
|
|
|
Signed-off-by: Paul Burton <paul.burton@imgtec.com>
|
|
Fixes: 9791554b45a2 ("MIPS,prctl: add PR_[GS]ET_FP_MODE prctl options for MIPS")
|
|
Cc: stable <stable@vger.kernel.org> # v4.0+
|
|
---
|
|
arch/mips/kernel/process.c | 4 ++++
|
|
1 file changed, 4 insertions(+)
|
|
|
|
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
|
|
index 92880ce..ce55ea0 100644
|
|
--- a/arch/mips/kernel/process.c
|
|
+++ b/arch/mips/kernel/process.c
|
|
@@ -601,6 +601,9 @@ int mips_set_process_fp_mode(struct task_struct *task, unsigned int value)
|
|
if (!(value & PR_FP_MODE_FR) && cpu_has_fpu && cpu_has_mips_r6)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ /* Proceed with the mode switch */
|
|
+ preempt_disable();
|
|
+
|
|
/* Save FP & vector context, then disable FPU & MSA */
|
|
if (task->signal == current->signal)
|
|
lose_fpu(1);
|
|
@@ -659,6 +662,7 @@ int mips_set_process_fp_mode(struct task_struct *task, unsigned int value)
|
|
|
|
/* Allow threads to use FP again */
|
|
atomic_set(&task->mm->context.fp_mode_switching, 0);
|
|
+ preempt_enable();
|
|
|
|
return 0;
|
|
}
|
|
--
|
|
2.8.1
|
|
|