Release 4.16 include/asm-generic/futex.h
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_GENERIC_FUTEX_H
#define _ASM_GENERIC_FUTEX_H
#include <linux/futex.h>
#include <linux/uaccess.h>
#include <asm/errno.h>
#ifndef CONFIG_SMP
/*
* The following implementation only for uniprocessor machines.
* It relies on preempt_disable() ensuring mutual exclusion.
*
*/
/**
* arch_futex_atomic_op_inuser() - Atomic arithmetic operation with constant
* argument and comparison of the previous
* futex value with another constant.
*
* @encoded_op: encoded operation to execute
* @uaddr: pointer to user space address
*
* Return:
* 0 - On success
* <0 - On error
*/
static inline int
arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, u32 __user *uaddr)
{
int oldval, ret;
u32 tmp;
preempt_disable();
pagefault_disable();
ret = -EFAULT;
if (unlikely(get_user(oldval, uaddr) != 0))
goto out_pagefault_enable;
ret = 0;
tmp = oldval;
switch (op) {
case FUTEX_OP_SET:
tmp = oparg;
break;
case FUTEX_OP_ADD:
tmp += oparg;
break;
case FUTEX_OP_OR:
tmp |= oparg;
break;
case FUTEX_OP_ANDN:
tmp &= ~oparg;
break;
case FUTEX_OP_XOR:
tmp ^= oparg;
break;
default:
ret = -ENOSYS;
}
if (ret == 0 && unlikely(put_user(tmp, uaddr) != 0))
ret = -EFAULT;
out_pagefault_enable:
pagefault_enable();
preempt_enable();
if (ret == 0)
*oval = oldval;
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Ley Foon Tan | 147 | 89.63% | 1 | 33.33% |
Jiri Slaby | 11 | 6.71% | 1 | 33.33% |
David Hildenbrand | 6 | 3.66% | 1 | 33.33% |
Total | 164 | 100.00% | 3 | 100.00% |
/**
* futex_atomic_cmpxchg_inatomic() - Compare and exchange the content of the
* uaddr with newval if the current value is
* oldval.
* @uval: pointer to store content of @uaddr
* @uaddr: pointer to user space address
* @oldval: old value
* @newval: new value to store to @uaddr
*
* Return:
* 0 - On success
* <0 - On error
*/
static inline int
futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
u32 oldval, u32 newval)
{
u32 val;
preempt_disable();
if (unlikely(get_user(val, uaddr) != 0)) {
preempt_enable();
return -EFAULT;
}
if (val == oldval && unlikely(put_user(newval, uaddr) != 0)) {
preempt_enable();
return -EFAULT;
}
*uval = val;
preempt_enable();
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Ley Foon Tan | 73 | 82.02% | 1 | 33.33% |
Romain Perier | 10 | 11.24% | 1 | 33.33% |
David Hildenbrand | 6 | 6.74% | 1 | 33.33% |
Total | 89 | 100.00% | 3 | 100.00% |
#else
static inline int
arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, u32 __user *uaddr)
{
int oldval = 0, ret;
pagefault_disable();
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;
}
pagefault_enable();
if (!ret)
*oval = oldval;
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Jeff Dike | 61 | 81.33% | 1 | 25.00% |
Jiri Slaby | 11 | 14.67% | 1 | 25.00% |
Peter Zijlstra | 2 | 2.67% | 1 | 25.00% |
Michel Lespinasse | 1 | 1.33% | 1 | 25.00% |
Total | 75 | 100.00% | 4 | 100.00% |
static inline int
futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
u32 oldval, u32 newval)
{
return -ENOSYS;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Ingo Molnar | 19 | 73.08% | 2 | 50.00% |
Michel Lespinasse | 7 | 26.92% | 2 | 50.00% |
Total | 26 | 100.00% | 4 | 100.00% |
#endif /* CONFIG_SMP */
#endif
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Ley Foon Tan | 229 | 59.79% | 1 | 7.69% |
Jeff Dike | 78 | 20.37% | 2 | 15.38% |
Jiri Slaby | 23 | 6.01% | 1 | 7.69% |
Ingo Molnar | 19 | 4.96% | 2 | 15.38% |
David Hildenbrand | 13 | 3.39% | 2 | 15.38% |
Romain Perier | 10 | 2.61% | 1 | 7.69% |
Michel Lespinasse | 8 | 2.09% | 2 | 15.38% |
Peter Zijlstra | 2 | 0.52% | 1 | 7.69% |
Greg Kroah-Hartman | 1 | 0.26% | 1 | 7.69% |
Total | 383 | 100.00% | 13 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.