diff options
author | Anders Roxell <anders.roxell@linaro.org> | 2015-03-24 14:24:16 +0100 |
---|---|---|
committer | Anders Roxell <anders.roxell@linaro.org> | 2015-03-24 14:24:16 +0100 |
commit | 2c35669b82364f6e44cb5a21d45498646715d25a (patch) | |
tree | ac7dbee40aa4332260ff3da2047f141766b42c7a /arch/arm | |
parent | 82fc0deb5fb5067c5207ace309b4e3af3eeec17b (diff) | |
parent | 68bb25c3df8a94edccb57e52c4d5f43a693817a4 (diff) |
Merge tag 'v3.14.36-rt34-lno1' into linux-linaro-lsk-v3.14-rt
Linux 3.14.36-rt34
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/include/asm/cmpxchg.h | 2 | ||||
-rw-r--r-- | arch/arm/include/asm/futex.h | 4 | ||||
-rw-r--r-- | arch/arm/mm/fault.c | 6 |
3 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/include/asm/cmpxchg.h b/arch/arm/include/asm/cmpxchg.h index df2fbba7efc8..30b1a4010b89 100644 --- a/arch/arm/include/asm/cmpxchg.h +++ b/arch/arm/include/asm/cmpxchg.h @@ -127,6 +127,8 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size #else /* min ARCH >= ARMv6 */ +#define __HAVE_ARCH_CMPXCHG 1 + extern void __bad_cmpxchg(volatile void *ptr, int size); /* diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 2aff798fbef4..54d26a98ff84 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h @@ -90,6 +90,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) return -EFAULT; + preempt_disable_rt(); + __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" "1: " TUSER(ldr) " %1, [%4]\n" " teq %1, %2\n" @@ -101,6 +103,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, : "cc", "memory"); *uval = val; + + preempt_enable_rt(); return ret; } diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index 77a7fe6cbd4a..12903cb4b40c 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c @@ -431,6 +431,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, if (addr < TASK_SIZE) return do_page_fault(addr, fsr, regs); + if (interrupts_enabled(regs)) + local_irq_enable(); + if (user_mode(regs)) goto bad_area; @@ -507,6 +510,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, static int do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) { + if (interrupts_enabled(regs)) + local_irq_enable(); + do_bad_area(addr, fsr, regs); return 0; } |