diff options
author | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 09:08:05 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 09:08:18 -0400 |
commit | e060c38434b2caa78efe7cedaff4191040b65a15 (patch) | |
tree | 407361230bf6733f63d8e788e4b5e6566ee04818 /arch/parisc | |
parent | 10e4ac572eeffe5317019bd7330b6058a400dfc2 (diff) | |
parent | cc39c6a9bbdebfcf1a7dee64d83bf302bc38d941 (diff) |
Merge branch 'master' into for-next
Fast-forward merge with Linus to be able to merge patches
based on more recent version of the tree.
Diffstat (limited to 'arch/parisc')
-rw-r--r-- | arch/parisc/Kconfig | 1 | ||||
-rw-r--r-- | arch/parisc/include/asm/atomic.h | 20 | ||||
-rw-r--r-- | arch/parisc/include/asm/bitops.h | 11 | ||||
-rw-r--r-- | arch/parisc/include/asm/futex.h | 66 | ||||
-rw-r--r-- | arch/parisc/include/asm/mmu_context.h | 2 | ||||
-rw-r--r-- | arch/parisc/include/asm/ptrace.h | 1 | ||||
-rw-r--r-- | arch/parisc/include/asm/unistd.h | 3 | ||||
-rw-r--r-- | arch/parisc/kernel/parisc_ksyms.c | 2 | ||||
-rw-r--r-- | arch/parisc/kernel/smp.c | 2 | ||||
-rw-r--r-- | arch/parisc/kernel/syscall_table.S | 3 | ||||
-rw-r--r-- | arch/parisc/kernel/traps.c | 2 | ||||
-rw-r--r-- | arch/parisc/lib/bitops.c | 2 |
12 files changed, 79 insertions, 36 deletions
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 65adc86a230e..e077b0bf56ca 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -15,6 +15,7 @@ config PARISC | |||
15 | select HAVE_GENERIC_HARDIRQS | 15 | select HAVE_GENERIC_HARDIRQS |
16 | select GENERIC_IRQ_PROBE | 16 | select GENERIC_IRQ_PROBE |
17 | select IRQ_PER_CPU | 17 | select IRQ_PER_CPU |
18 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||
18 | 19 | ||
19 | help | 20 | help |
20 | The PA-RISC microprocessor is designed by Hewlett-Packard and used | 21 | The PA-RISC microprocessor is designed by Hewlett-Packard and used |
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h index f81955934aeb..4054b31e0fa9 100644 --- a/arch/parisc/include/asm/atomic.h +++ b/arch/parisc/include/asm/atomic.h | |||
@@ -197,15 +197,15 @@ static __inline__ int atomic_read(const atomic_t *v) | |||
197 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | 197 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) |
198 | 198 | ||
199 | /** | 199 | /** |
200 | * atomic_add_unless - add unless the number is a given value | 200 | * __atomic_add_unless - add unless the number is a given value |
201 | * @v: pointer of type atomic_t | 201 | * @v: pointer of type atomic_t |
202 | * @a: the amount to add to v... | 202 | * @a: the amount to add to v... |
203 | * @u: ...unless v is equal to u. | 203 | * @u: ...unless v is equal to u. |
204 | * | 204 | * |
205 | * Atomically adds @a to @v, so long as it was not @u. | 205 | * Atomically adds @a to @v, so long as it was not @u. |
206 | * Returns non-zero if @v was not @u, and zero otherwise. | 206 | * Returns the old value of @v. |
207 | */ | 207 | */ |
208 | static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | 208 | static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) |
209 | { | 209 | { |
210 | int c, old; | 210 | int c, old; |
211 | c = atomic_read(v); | 211 | c = atomic_read(v); |
@@ -217,10 +217,9 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | |||
217 | break; | 217 | break; |
218 | c = old; | 218 | c = old; |
219 | } | 219 | } |
220 | return c != (u); | 220 | return c; |
221 | } | 221 | } |
222 | 222 | ||
223 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
224 | 223 | ||
225 | #define atomic_add(i,v) ((void)(__atomic_add_return( (i),(v)))) | 224 | #define atomic_add(i,v) ((void)(__atomic_add_return( (i),(v)))) |
226 | #define atomic_sub(i,v) ((void)(__atomic_add_return(-(i),(v)))) | 225 | #define atomic_sub(i,v) ((void)(__atomic_add_return(-(i),(v)))) |
@@ -259,10 +258,10 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | |||
259 | 258 | ||
260 | #define ATOMIC64_INIT(i) ((atomic64_t) { (i) }) | 259 | #define ATOMIC64_INIT(i) ((atomic64_t) { (i) }) |
261 | 260 | ||
262 | static __inline__ int | 261 | static __inline__ s64 |
263 | __atomic64_add_return(s64 i, atomic64_t *v) | 262 | __atomic64_add_return(s64 i, atomic64_t *v) |
264 | { | 263 | { |
265 | int ret; | 264 | s64 ret; |
266 | unsigned long flags; | 265 | unsigned long flags; |
267 | _atomic_spin_lock_irqsave(v, flags); | 266 | _atomic_spin_lock_irqsave(v, flags); |
268 | 267 | ||
@@ -317,7 +316,7 @@ atomic64_read(const atomic64_t *v) | |||
317 | * @u: ...unless v is equal to u. | 316 | * @u: ...unless v is equal to u. |
318 | * | 317 | * |
319 | * Atomically adds @a to @v, so long as it was not @u. | 318 | * Atomically adds @a to @v, so long as it was not @u. |
320 | * Returns non-zero if @v was not @u, and zero otherwise. | 319 | * Returns the old value of @v. |
321 | */ | 320 | */ |
322 | static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) | 321 | static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) |
323 | { | 322 | { |
@@ -336,12 +335,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) | |||
336 | 335 | ||
337 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) | 336 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) |
338 | 337 | ||
339 | #else /* CONFIG_64BIT */ | ||
340 | |||
341 | #include <asm-generic/atomic64.h> | ||
342 | |||
343 | #endif /* !CONFIG_64BIT */ | 338 | #endif /* !CONFIG_64BIT */ |
344 | 339 | ||
345 | #include <asm-generic/atomic-long.h> | ||
346 | 340 | ||
347 | #endif /* _ASM_PARISC_ATOMIC_H_ */ | 341 | #endif /* _ASM_PARISC_ATOMIC_H_ */ |
diff --git a/arch/parisc/include/asm/bitops.h b/arch/parisc/include/asm/bitops.h index 43c516fa17ff..8c9b631d2a78 100644 --- a/arch/parisc/include/asm/bitops.h +++ b/arch/parisc/include/asm/bitops.h | |||
@@ -8,7 +8,7 @@ | |||
8 | #include <linux/compiler.h> | 8 | #include <linux/compiler.h> |
9 | #include <asm/types.h> /* for BITS_PER_LONG/SHIFT_PER_LONG */ | 9 | #include <asm/types.h> /* for BITS_PER_LONG/SHIFT_PER_LONG */ |
10 | #include <asm/byteorder.h> | 10 | #include <asm/byteorder.h> |
11 | #include <asm/atomic.h> | 11 | #include <linux/atomic.h> |
12 | 12 | ||
13 | /* | 13 | /* |
14 | * HP-PARISC specific bit operations | 14 | * HP-PARISC specific bit operations |
@@ -223,14 +223,7 @@ static __inline__ int fls(int x) | |||
223 | #ifdef __KERNEL__ | 223 | #ifdef __KERNEL__ |
224 | 224 | ||
225 | #include <asm-generic/bitops/le.h> | 225 | #include <asm-generic/bitops/le.h> |
226 | 226 | #include <asm-generic/bitops/ext2-atomic-setbit.h> | |
227 | /* '3' is bits per byte */ | ||
228 | #define LE_BYTE_ADDR ((sizeof(unsigned long) - 1) << 3) | ||
229 | |||
230 | #define ext2_set_bit_atomic(l,nr,addr) \ | ||
231 | test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr) | ||
232 | #define ext2_clear_bit_atomic(l,nr,addr) \ | ||
233 | test_and_clear_bit( (nr) ^ LE_BYTE_ADDR, (unsigned long *)addr) | ||
234 | 227 | ||
235 | #endif /* __KERNEL__ */ | 228 | #endif /* __KERNEL__ */ |
236 | 229 | ||
diff --git a/arch/parisc/include/asm/futex.h b/arch/parisc/include/asm/futex.h index 67a33cc27ef2..2388bdb32832 100644 --- a/arch/parisc/include/asm/futex.h +++ b/arch/parisc/include/asm/futex.h | |||
@@ -5,11 +5,14 @@ | |||
5 | 5 | ||
6 | #include <linux/futex.h> | 6 | #include <linux/futex.h> |
7 | #include <linux/uaccess.h> | 7 | #include <linux/uaccess.h> |
8 | #include <asm/atomic.h> | ||
8 | #include <asm/errno.h> | 9 | #include <asm/errno.h> |
9 | 10 | ||
10 | static inline int | 11 | static inline int |
11 | futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) | 12 | futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) |
12 | { | 13 | { |
14 | unsigned long int flags; | ||
15 | u32 val; | ||
13 | int op = (encoded_op >> 28) & 7; | 16 | int op = (encoded_op >> 28) & 7; |
14 | int cmp = (encoded_op >> 24) & 15; | 17 | int cmp = (encoded_op >> 24) & 15; |
15 | int oparg = (encoded_op << 8) >> 20; | 18 | int oparg = (encoded_op << 8) >> 20; |
@@ -18,21 +21,58 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) | |||
18 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) | 21 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) |
19 | oparg = 1 << oparg; | 22 | oparg = 1 << oparg; |
20 | 23 | ||
21 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(u32))) | 24 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(*uaddr))) |
22 | return -EFAULT; | 25 | return -EFAULT; |
23 | 26 | ||
24 | pagefault_disable(); | 27 | pagefault_disable(); |
25 | 28 | ||
29 | _atomic_spin_lock_irqsave(uaddr, flags); | ||
30 | |||
26 | switch (op) { | 31 | switch (op) { |
27 | case FUTEX_OP_SET: | 32 | case FUTEX_OP_SET: |
33 | /* *(int *)UADDR2 = OPARG; */ | ||
34 | ret = get_user(oldval, uaddr); | ||
35 | if (!ret) | ||
36 | ret = put_user(oparg, uaddr); | ||
37 | break; | ||
28 | case FUTEX_OP_ADD: | 38 | case FUTEX_OP_ADD: |
39 | /* *(int *)UADDR2 += OPARG; */ | ||
40 | ret = get_user(oldval, uaddr); | ||
41 | if (!ret) { | ||
42 | val = oldval + oparg; | ||
43 | ret = put_user(val, uaddr); | ||
44 | } | ||
45 | break; | ||
29 | case FUTEX_OP_OR: | 46 | case FUTEX_OP_OR: |
47 | /* *(int *)UADDR2 |= OPARG; */ | ||
48 | ret = get_user(oldval, uaddr); | ||
49 | if (!ret) { | ||
50 | val = oldval | oparg; | ||
51 | ret = put_user(val, uaddr); | ||
52 | } | ||
53 | break; | ||
30 | case FUTEX_OP_ANDN: | 54 | case FUTEX_OP_ANDN: |
55 | /* *(int *)UADDR2 &= ~OPARG; */ | ||
56 | ret = get_user(oldval, uaddr); | ||
57 | if (!ret) { | ||
58 | val = oldval & ~oparg; | ||
59 | ret = put_user(val, uaddr); | ||
60 | } | ||
61 | break; | ||
31 | case FUTEX_OP_XOR: | 62 | case FUTEX_OP_XOR: |
63 | /* *(int *)UADDR2 ^= OPARG; */ | ||
64 | ret = get_user(oldval, uaddr); | ||
65 | if (!ret) { | ||
66 | val = oldval ^ oparg; | ||
67 | ret = put_user(val, uaddr); | ||
68 | } | ||
69 | break; | ||
32 | default: | 70 | default: |
33 | ret = -ENOSYS; | 71 | ret = -ENOSYS; |
34 | } | 72 | } |
35 | 73 | ||
74 | _atomic_spin_unlock_irqrestore(uaddr, flags); | ||
75 | |||
36 | pagefault_enable(); | 76 | pagefault_enable(); |
37 | 77 | ||
38 | if (!ret) { | 78 | if (!ret) { |
@@ -54,7 +94,9 @@ static inline int | |||
54 | futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | 94 | futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, |
55 | u32 oldval, u32 newval) | 95 | u32 oldval, u32 newval) |
56 | { | 96 | { |
97 | int ret; | ||
57 | u32 val; | 98 | u32 val; |
99 | unsigned long flags; | ||
58 | 100 | ||
59 | /* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is | 101 | /* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is |
60 | * our gateway page, and causes no end of trouble... | 102 | * our gateway page, and causes no end of trouble... |
@@ -65,12 +107,24 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | |||
65 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) | 107 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) |
66 | return -EFAULT; | 108 | return -EFAULT; |
67 | 109 | ||
68 | if (get_user(val, uaddr)) | 110 | /* HPPA has no cmpxchg in hardware and therefore the |
69 | return -EFAULT; | 111 | * best we can do here is use an array of locks. The |
70 | if (val == oldval && put_user(newval, uaddr)) | 112 | * lock selected is based on a hash of the userspace |
71 | return -EFAULT; | 113 | * address. This should scale to a couple of CPUs. |
114 | */ | ||
115 | |||
116 | _atomic_spin_lock_irqsave(uaddr, flags); | ||
117 | |||
118 | ret = get_user(val, uaddr); | ||
119 | |||
120 | if (!ret && val == oldval) | ||
121 | ret = put_user(newval, uaddr); | ||
122 | |||
72 | *uval = val; | 123 | *uval = val; |
73 | return 0; | 124 | |
125 | _atomic_spin_unlock_irqrestore(uaddr, flags); | ||
126 | |||
127 | return ret; | ||
74 | } | 128 | } |
75 | 129 | ||
76 | #endif /*__KERNEL__*/ | 130 | #endif /*__KERNEL__*/ |
diff --git a/arch/parisc/include/asm/mmu_context.h b/arch/parisc/include/asm/mmu_context.h index 354b2aca990e..59be25764433 100644 --- a/arch/parisc/include/asm/mmu_context.h +++ b/arch/parisc/include/asm/mmu_context.h | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
5 | #include <linux/sched.h> | 5 | #include <linux/sched.h> |
6 | #include <asm/atomic.h> | 6 | #include <linux/atomic.h> |
7 | #include <asm/pgalloc.h> | 7 | #include <asm/pgalloc.h> |
8 | #include <asm/pgtable.h> | 8 | #include <asm/pgtable.h> |
9 | #include <asm-generic/mm_hooks.h> | 9 | #include <asm-generic/mm_hooks.h> |
diff --git a/arch/parisc/include/asm/ptrace.h b/arch/parisc/include/asm/ptrace.h index 7f09533da771..250ae35aa062 100644 --- a/arch/parisc/include/asm/ptrace.h +++ b/arch/parisc/include/asm/ptrace.h | |||
@@ -56,7 +56,6 @@ struct pt_regs { | |||
56 | #define instruction_pointer(regs) ((regs)->iaoq[0] & ~3) | 56 | #define instruction_pointer(regs) ((regs)->iaoq[0] & ~3) |
57 | #define user_stack_pointer(regs) ((regs)->gr[30]) | 57 | #define user_stack_pointer(regs) ((regs)->gr[30]) |
58 | unsigned long profile_pc(struct pt_regs *); | 58 | unsigned long profile_pc(struct pt_regs *); |
59 | extern void show_regs(struct pt_regs *); | ||
60 | 59 | ||
61 | 60 | ||
62 | #endif /* __KERNEL__ */ | 61 | #endif /* __KERNEL__ */ |
diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h index 3392de3e7be0..d61de64f990a 100644 --- a/arch/parisc/include/asm/unistd.h +++ b/arch/parisc/include/asm/unistd.h | |||
@@ -821,8 +821,9 @@ | |||
821 | #define __NR_open_by_handle_at (__NR_Linux + 326) | 821 | #define __NR_open_by_handle_at (__NR_Linux + 326) |
822 | #define __NR_syncfs (__NR_Linux + 327) | 822 | #define __NR_syncfs (__NR_Linux + 327) |
823 | #define __NR_setns (__NR_Linux + 328) | 823 | #define __NR_setns (__NR_Linux + 328) |
824 | #define __NR_sendmmsg (__NR_Linux + 329) | ||
824 | 825 | ||
825 | #define __NR_Linux_syscalls (__NR_setns + 1) | 826 | #define __NR_Linux_syscalls (__NR_sendmmsg + 1) |
826 | 827 | ||
827 | 828 | ||
828 | #define __IGNORE_select /* newselect */ | 829 | #define __IGNORE_select /* newselect */ |
diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c index df653663d3db..a7bb757a5497 100644 --- a/arch/parisc/kernel/parisc_ksyms.c +++ b/arch/parisc/kernel/parisc_ksyms.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | EXPORT_SYMBOL(memset); | 32 | EXPORT_SYMBOL(memset); |
33 | 33 | ||
34 | #include <asm/atomic.h> | 34 | #include <linux/atomic.h> |
35 | EXPORT_SYMBOL(__xchg8); | 35 | EXPORT_SYMBOL(__xchg8); |
36 | EXPORT_SYMBOL(__xchg32); | 36 | EXPORT_SYMBOL(__xchg32); |
37 | EXPORT_SYMBOL(__cmpxchg_u32); | 37 | EXPORT_SYMBOL(__cmpxchg_u32); |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 828305f19cff..32d588488f04 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <linux/ftrace.h> | 33 | #include <linux/ftrace.h> |
34 | 34 | ||
35 | #include <asm/system.h> | 35 | #include <asm/system.h> |
36 | #include <asm/atomic.h> | 36 | #include <linux/atomic.h> |
37 | #include <asm/current.h> | 37 | #include <asm/current.h> |
38 | #include <asm/delay.h> | 38 | #include <asm/delay.h> |
39 | #include <asm/tlbflush.h> | 39 | #include <asm/tlbflush.h> |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 34a4f5a2fffb..3735abd7f8f6 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -259,7 +259,7 @@ | |||
259 | ENTRY_SAME(ni_syscall) /* query_module */ | 259 | ENTRY_SAME(ni_syscall) /* query_module */ |
260 | ENTRY_SAME(poll) | 260 | ENTRY_SAME(poll) |
261 | /* structs contain pointers and an in_addr... */ | 261 | /* structs contain pointers and an in_addr... */ |
262 | ENTRY_COMP(nfsservctl) | 262 | ENTRY_SAME(ni_syscall) /* was nfsservctl */ |
263 | ENTRY_SAME(setresgid) /* 170 */ | 263 | ENTRY_SAME(setresgid) /* 170 */ |
264 | ENTRY_SAME(getresgid) | 264 | ENTRY_SAME(getresgid) |
265 | ENTRY_SAME(prctl) | 265 | ENTRY_SAME(prctl) |
@@ -427,6 +427,7 @@ | |||
427 | ENTRY_COMP(open_by_handle_at) | 427 | ENTRY_COMP(open_by_handle_at) |
428 | ENTRY_SAME(syncfs) | 428 | ENTRY_SAME(syncfs) |
429 | ENTRY_SAME(setns) | 429 | ENTRY_SAME(setns) |
430 | ENTRY_COMP(sendmmsg) | ||
430 | 431 | ||
431 | /* Nothing yet */ | 432 | /* Nothing yet */ |
432 | 433 | ||
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 8b58bf0b7d5a..f19e6604026a 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
34 | #include <asm/traps.h> | 34 | #include <asm/traps.h> |
35 | #include <asm/unaligned.h> | 35 | #include <asm/unaligned.h> |
36 | #include <asm/atomic.h> | 36 | #include <linux/atomic.h> |
37 | #include <asm/smp.h> | 37 | #include <asm/smp.h> |
38 | #include <asm/pdc.h> | 38 | #include <asm/pdc.h> |
39 | #include <asm/pdc_chassis.h> | 39 | #include <asm/pdc_chassis.h> |
diff --git a/arch/parisc/lib/bitops.c b/arch/parisc/lib/bitops.c index 353963d42059..a8bffd8af77d 100644 --- a/arch/parisc/lib/bitops.c +++ b/arch/parisc/lib/bitops.c | |||
@@ -9,7 +9,7 @@ | |||
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | #include <linux/spinlock.h> | 10 | #include <linux/spinlock.h> |
11 | #include <asm/system.h> | 11 | #include <asm/system.h> |
12 | #include <asm/atomic.h> | 12 | #include <linux/atomic.h> |
13 | 13 | ||
14 | #ifdef CONFIG_SMP | 14 | #ifdef CONFIG_SMP |
15 | arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = { | 15 | arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = { |