diff options
Diffstat (limited to 'arch/arm')
| -rw-r--r-- | arch/arm/include/asm/futex.h | 13 | ||||
| -rw-r--r-- | arch/arm/include/asm/topology.h | 2 | ||||
| -rw-r--r-- | arch/arm/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/arm/mm/highmem.c | 3 |
4 files changed, 16 insertions, 4 deletions
diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 4e78065a16aa..5eed82809d82 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h | |||
| @@ -93,6 +93,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | |||
| 93 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) | 93 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) |
| 94 | return -EFAULT; | 94 | return -EFAULT; |
| 95 | 95 | ||
| 96 | preempt_disable(); | ||
| 96 | __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" | 97 | __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" |
| 97 | "1: " TUSER(ldr) " %1, [%4]\n" | 98 | "1: " TUSER(ldr) " %1, [%4]\n" |
| 98 | " teq %1, %2\n" | 99 | " teq %1, %2\n" |
| @@ -104,6 +105,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | |||
| 104 | : "cc", "memory"); | 105 | : "cc", "memory"); |
| 105 | 106 | ||
| 106 | *uval = val; | 107 | *uval = val; |
| 108 | preempt_enable(); | ||
| 109 | |||
| 107 | return ret; | 110 | return ret; |
| 108 | } | 111 | } |
| 109 | 112 | ||
| @@ -124,7 +127,10 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) | |||
| 124 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) | 127 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) |
| 125 | return -EFAULT; | 128 | return -EFAULT; |
| 126 | 129 | ||
| 127 | pagefault_disable(); /* implies preempt_disable() */ | 130 | #ifndef CONFIG_SMP |
| 131 | preempt_disable(); | ||
| 132 | #endif | ||
| 133 | pagefault_disable(); | ||
| 128 | 134 | ||
| 129 | switch (op) { | 135 | switch (op) { |
| 130 | case FUTEX_OP_SET: | 136 | case FUTEX_OP_SET: |
| @@ -146,7 +152,10 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) | |||
| 146 | ret = -ENOSYS; | 152 | ret = -ENOSYS; |
| 147 | } | 153 | } |
| 148 | 154 | ||
| 149 | pagefault_enable(); /* subsumes preempt_enable() */ | 155 | pagefault_enable(); |
| 156 | #ifndef CONFIG_SMP | ||
| 157 | preempt_enable(); | ||
| 158 | #endif | ||
| 150 | 159 | ||
| 151 | if (!ret) { | 160 | if (!ret) { |
| 152 | switch (cmp) { | 161 | switch (cmp) { |
diff --git a/arch/arm/include/asm/topology.h b/arch/arm/include/asm/topology.h index 2fe85fff5cca..370f7a732900 100644 --- a/arch/arm/include/asm/topology.h +++ b/arch/arm/include/asm/topology.h | |||
| @@ -18,7 +18,7 @@ extern struct cputopo_arm cpu_topology[NR_CPUS]; | |||
| 18 | #define topology_physical_package_id(cpu) (cpu_topology[cpu].socket_id) | 18 | #define topology_physical_package_id(cpu) (cpu_topology[cpu].socket_id) |
| 19 | #define topology_core_id(cpu) (cpu_topology[cpu].core_id) | 19 | #define topology_core_id(cpu) (cpu_topology[cpu].core_id) |
| 20 | #define topology_core_cpumask(cpu) (&cpu_topology[cpu].core_sibling) | 20 | #define topology_core_cpumask(cpu) (&cpu_topology[cpu].core_sibling) |
| 21 | #define topology_thread_cpumask(cpu) (&cpu_topology[cpu].thread_sibling) | 21 | #define topology_sibling_cpumask(cpu) (&cpu_topology[cpu].thread_sibling) |
| 22 | 22 | ||
| 23 | void init_cpu_topology(void); | 23 | void init_cpu_topology(void); |
| 24 | void store_cpu_topology(unsigned int cpuid); | 24 | void store_cpu_topology(unsigned int cpuid); |
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index 6333d9c17875..0d629b8f973f 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c | |||
| @@ -276,7 +276,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
| 276 | * If we're in an interrupt or have no user | 276 | * If we're in an interrupt or have no user |
| 277 | * context, we must not take the fault.. | 277 | * context, we must not take the fault.. |
| 278 | */ | 278 | */ |
| 279 | if (in_atomic() || !mm) | 279 | if (faulthandler_disabled() || !mm) |
| 280 | goto no_context; | 280 | goto no_context; |
| 281 | 281 | ||
| 282 | if (user_mode(regs)) | 282 | if (user_mode(regs)) |
diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index b98895d9fe57..ee8dfa793989 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c | |||
| @@ -59,6 +59,7 @@ void *kmap_atomic(struct page *page) | |||
| 59 | void *kmap; | 59 | void *kmap; |
| 60 | int type; | 60 | int type; |
| 61 | 61 | ||
| 62 | preempt_disable(); | ||
| 62 | pagefault_disable(); | 63 | pagefault_disable(); |
| 63 | if (!PageHighMem(page)) | 64 | if (!PageHighMem(page)) |
| 64 | return page_address(page); | 65 | return page_address(page); |
| @@ -121,6 +122,7 @@ void __kunmap_atomic(void *kvaddr) | |||
| 121 | kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); | 122 | kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); |
| 122 | } | 123 | } |
| 123 | pagefault_enable(); | 124 | pagefault_enable(); |
| 125 | preempt_enable(); | ||
| 124 | } | 126 | } |
| 125 | EXPORT_SYMBOL(__kunmap_atomic); | 127 | EXPORT_SYMBOL(__kunmap_atomic); |
| 126 | 128 | ||
| @@ -130,6 +132,7 @@ void *kmap_atomic_pfn(unsigned long pfn) | |||
| 130 | int idx, type; | 132 | int idx, type; |
| 131 | struct page *page = pfn_to_page(pfn); | 133 | struct page *page = pfn_to_page(pfn); |
| 132 | 134 | ||
| 135 | preempt_disable(); | ||
| 133 | pagefault_disable(); | 136 | pagefault_disable(); |
| 134 | if (!PageHighMem(page)) | 137 | if (!PageHighMem(page)) |
| 135 | return page_address(page); | 138 | return page_address(page); |
