X-Git-Url: http://pilppa.org/gitweb/?a=blobdiff_plain;f=include%2Fasm-s390%2Ffutex.h;h=5c5d02de49e9ae53fe5728fef181f1657fd4c3dc;hb=ff5d48a6d18d09bb750d1f89f6464f5fdb6fc85b;hp=2cac5ecd9d00b07132c0d4706141e0c342c0e4ac;hpb=2e66fc41169c90d93b7811caf7e7822de6aa2259;p=linux-2.6-omap-h63xx.git diff --git a/include/asm-s390/futex.h b/include/asm-s390/futex.h index 2cac5ecd9d0..5c5d02de49e 100644 --- a/include/asm-s390/futex.h +++ b/include/asm-s390/futex.h @@ -1,39 +1,29 @@ -#ifndef _ASM_FUTEX_H -#define _ASM_FUTEX_H +#ifndef _ASM_S390_FUTEX_H +#define _ASM_S390_FUTEX_H #ifdef __KERNEL__ #include +#include #include -#include -static inline int -futex_atomic_op_inuser (int encoded_op, int __user *uaddr) +static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) { int op = (encoded_op >> 28) & 7; int cmp = (encoded_op >> 24) & 15; int oparg = (encoded_op << 8) >> 20; int cmparg = (encoded_op << 20) >> 20; - int oldval = 0, ret, tem; + int oldval, ret; + if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) oparg = 1 << oparg; if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) return -EFAULT; - inc_preempt_count(); - - switch (op) { - case FUTEX_OP_SET: - case FUTEX_OP_ADD: - case FUTEX_OP_OR: - case FUTEX_OP_ANDN: - case FUTEX_OP_XOR: - default: - ret = -ENOSYS; - } - - dec_preempt_count(); + pagefault_disable(); + ret = uaccess.futex_atomic_op(op, uaddr, oparg, &oldval); + pagefault_enable(); if (!ret) { switch (cmp) { @@ -49,5 +39,14 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) return ret; } -#endif -#endif +static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, + int oldval, int newval) +{ + if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) + return -EFAULT; + + return uaccess.futex_atomic_cmpxchg(uaddr, oldval, newval); +} + +#endif /* __KERNEL__ */ +#endif /* _ASM_S390_FUTEX_H */