cregit-Linux how code gets into the kernel

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

PersonTokensPropCommitsCommitProp
Ley Foon Tan14789.63%133.33%
Jiri Slaby116.71%133.33%
David Hildenbrand63.66%133.33%
Total164100.00%3100.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

PersonTokensPropCommitsCommitProp
Ley Foon Tan7382.02%133.33%
Romain Perier1011.24%133.33%
David Hildenbrand66.74%133.33%
Total89100.00%3100.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

PersonTokensPropCommitsCommitProp
Jeff Dike6181.33%125.00%
Jiri Slaby1114.67%125.00%
Peter Zijlstra22.67%125.00%
Michel Lespinasse11.33%125.00%
Total75100.00%4100.00%


static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, u32 newval) { return -ENOSYS; }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar1973.08%250.00%
Michel Lespinasse726.92%250.00%
Total26100.00%4100.00%

#endif /* CONFIG_SMP */ #endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Ley Foon Tan22959.79%17.69%
Jeff Dike7820.37%215.38%
Jiri Slaby236.01%17.69%
Ingo Molnar194.96%215.38%
David Hildenbrand133.39%215.38%
Romain Perier102.61%17.69%
Michel Lespinasse82.09%215.38%
Peter Zijlstra20.52%17.69%
Greg Kroah-Hartman10.26%17.69%
Total383100.00%13100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.