38 lines
1.2 KiB
Diff
38 lines
1.2 KiB
Diff
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
|
|
Date: Mon, 11 May 2015 17:52:14 +0200
|
|
Subject: sched/preempt, futex: Disable preemption in UP futex_atomic_op_inuser() explicitly
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.1/patches-4.1.3-rt3.tar.xz
|
|
|
|
Let's explicitly disable/enable preemption in the !CONFIG_SMP version
|
|
of futex_atomic_cmpxchg_inatomic, to prepare for pagefault_disable() not
|
|
touching preemption anymore. This is needed for this function to be
|
|
callable from both, atomic and non-atomic context.
|
|
|
|
Otherwise we might break mutual exclusion when relying on a get_user()/
|
|
put_user() implementation.
|
|
|
|
[upstream commit f3dae07e442a8131a5485b6a38db2aa22a7a48cf]
|
|
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
|
|
---
|
|
include/asm-generic/futex.h | 2 ++
|
|
1 file changed, 2 insertions(+)
|
|
|
|
--- a/include/asm-generic/futex.h
|
|
+++ b/include/asm-generic/futex.h
|
|
@@ -107,6 +107,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval,
|
|
{
|
|
u32 val;
|
|
|
|
+ preempt_disable();
|
|
if (unlikely(get_user(val, uaddr) != 0))
|
|
return -EFAULT;
|
|
|
|
@@ -114,6 +115,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval,
|
|
return -EFAULT;
|
|
|
|
*uval = val;
|
|
+ preempt_enable();
|
|
|
|
return 0;
|
|
}
|