aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/include/asm/futex.h13
-rw-r--r--arch/arm/include/asm/topology.h2
-rw-r--r--arch/arm/mm/fault.c2
-rw-r--r--arch/arm/mm/highmem.c3
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
23void init_cpu_topology(void); 23void init_cpu_topology(void);
24void store_cpu_topology(unsigned int cpuid); 24void 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}
125EXPORT_SYMBOL(__kunmap_atomic); 127EXPORT_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);