/* * Flags for futex2 syscalls. * * NOTE: these are not pure flags, they can also be seen as: * * union { * u32 flags; * struct { * u32 size : 2, * numa : 1, * : 4, * private : 1; * }; * };
*/ #define FUTEX2_SIZE_U8 0x00 #define FUTEX2_SIZE_U16 0x01 #define FUTEX2_SIZE_U32 0x02 #define FUTEX2_SIZE_U64 0x03 #define FUTEX2_NUMA 0x04 #define FUTEX2_MPOL 0x08 /* 0x10 */ /* 0x20 */ /* 0x40 */ #define FUTEX2_PRIVATE FUTEX_PRIVATE_FLAG
#define FUTEX2_SIZE_MASK 0x03
/* do not use */ #define FUTEX_32 FUTEX2_SIZE_U32 /* historical accident :-( */
/* * When FUTEX2_NUMA doubles the futex word, the second word is a node value. * The special value -1 indicates no-node. This is the same value as * NUMA_NO_NODE, except that value is not ABI, this is.
*/ #define FUTEX_NO_NODE (-1)
/* * Max numbers of elements in a futex_waitv array
*/ #define FUTEX_WAITV_MAX 128
/** * struct futex_waitv - A waiter for vectorized wait * @val: Expected value at uaddr * @uaddr: User address to wait on * @flags: Flags for this waiter * @__reserved: Reserved member to preserve data alignment. Should be 0.
*/ struct futex_waitv {
__u64 val;
__u64 uaddr;
__u32 flags;
__u32 __reserved;
};
/* * Support for robust futexes: the kernel cleans up held futexes at * thread exit time.
*/
/* * Per-lock list entry - embedded in user-space locks, somewhere close * to the futex field. (Note: user-space uses a double-linked list to * achieve O(1) list add and remove, but the kernel only needs to know * about the forward link) * * NOTE: this structure is part of the syscall ABI, and must not be * changed.
*/ struct robust_list { struct robust_list __user *next;
};
/* * Per-thread list head: * * NOTE: this structure is part of the syscall ABI, and must only be * changed if the change is first communicated with the glibc folks. * (When an incompatible change is done, we'll increase the structure * size, which glibc will detect)
*/ struct robust_list_head { /* * The head of the list. Points back to itself if empty:
*/ struct robust_list list;
/* * This relative offset is set by user-space, it gives the kernel * the relative position of the futex field to examine. This way * we keep userspace flexible, to freely shape its data-structure, * without hardcoding any particular offset into the kernel:
*/ long futex_offset;
/* * The death of the thread may race with userspace setting * up a lock's links. So to handle this race, userspace first * sets this field to the address of the to-be-taken lock, * then does the lock acquire, and then adds itself to the * list, and then clears this field. Hence the kernel will * always have full knowledge of all locks that the thread * _might_ have taken. We check the owner TID in any case, * so only truly owned locks will be handled.
*/ struct robust_list __user *list_op_pending;
};
/* * Are there any waiters for this robust futex:
*/ #define FUTEX_WAITERS 0x80000000
/* * The kernel signals via this bit that a thread holding a futex * has exited without unlocking the futex. The kernel also does * a FUTEX_WAKE on such futexes, after setting the bit, to wake * up any possible waiters:
*/ #define FUTEX_OWNER_DIED 0x40000000
/* * The rest of the robust-futex field is for the TID:
*/ #define FUTEX_TID_MASK 0x3fffffff
/* * This limit protects against a deliberately circular list. * (Not worth introducing an rlimit for it)
*/ #define ROBUST_LIST_LIMIT 2048
/* * bitset with all bits set for the FUTEX_xxx_BITSET OPs to request a * match of any bit.
*/ #define FUTEX_BITSET_MATCH_ANY 0xffffffff
#define FUTEX_OP_OPARG_SHIFT 8 /* Use (1 << OPARG) instead of OPARG. */
#define FUTEX_OP_CMP_EQ 0 /* if (oldval == CMPARG) wake */ #define FUTEX_OP_CMP_NE 1 /* if (oldval != CMPARG) wake */ #define FUTEX_OP_CMP_LT 2 /* if (oldval < CMPARG) wake */ #define FUTEX_OP_CMP_LE 3 /* if (oldval <= CMPARG) wake */ #define FUTEX_OP_CMP_GT 4 /* if (oldval > CMPARG) wake */ #define FUTEX_OP_CMP_GE 5 /* if (oldval >= CMPARG) wake */
/* FUTEX_WAKE_OP will perform atomically int oldval = *(int *)UADDR2; *(int *)UADDR2 = oldval OP OPARG; if (oldval CMP CMPARG)
wake UADDR2; */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.