Blame view

include/linux/futex.h 6.56 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _LINUX_FUTEX_H
  #define _LINUX_FUTEX_H
286100a6c   Alexey Dobriyan   sched, futex: det...
3
4
  #include <linux/compiler.h>
  #include <linux/types.h>
0771dfefc   Ingo Molnar   [PATCH] lightweig...
5

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
  /* Second argument to futex syscall */
4732efbeb   Jakub Jelinek   [PATCH] FUTEX_WAK...
7
8
9
10
11
12
  #define FUTEX_WAIT		0
  #define FUTEX_WAKE		1
  #define FUTEX_FD		2
  #define FUTEX_REQUEUE		3
  #define FUTEX_CMP_REQUEUE	4
  #define FUTEX_WAKE_OP		5
c87e2837b   Ingo Molnar   [PATCH] pi-futex:...
13
14
15
  #define FUTEX_LOCK_PI		6
  #define FUTEX_UNLOCK_PI		7
  #define FUTEX_TRYLOCK_PI	8
cd689985c   Thomas Gleixner   futex: Add bitset...
16
17
  #define FUTEX_WAIT_BITSET	9
  #define FUTEX_WAKE_BITSET	10
52400ba94   Darren Hart   futex: add requeu...
18
  #define FUTEX_WAIT_REQUEUE_PI	11
ba9c22f2c   Darren Hart   futex: remove FUT...
19
  #define FUTEX_CMP_REQUEUE_PI	12
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20

34f01cc1f   Eric Dumazet   FUTEX: new PRIVAT...
21
  #define FUTEX_PRIVATE_FLAG	128
1acdac104   Thomas Gleixner   futex: make clock...
22
23
  #define FUTEX_CLOCK_REALTIME	256
  #define FUTEX_CMD_MASK		~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME)
34f01cc1f   Eric Dumazet   FUTEX: new PRIVAT...
24
25
26
27
28
29
30
31
32
  
  #define FUTEX_WAIT_PRIVATE	(FUTEX_WAIT | FUTEX_PRIVATE_FLAG)
  #define FUTEX_WAKE_PRIVATE	(FUTEX_WAKE | FUTEX_PRIVATE_FLAG)
  #define FUTEX_REQUEUE_PRIVATE	(FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)
  #define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)
  #define FUTEX_WAKE_OP_PRIVATE	(FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)
  #define FUTEX_LOCK_PI_PRIVATE	(FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)
  #define FUTEX_UNLOCK_PI_PRIVATE	(FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)
  #define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)
f8d1e5489   Anton Blanchard   futex: Fix typo i...
33
34
  #define FUTEX_WAIT_BITSET_PRIVATE	(FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG)
  #define FUTEX_WAKE_BITSET_PRIVATE	(FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG)
52400ba94   Darren Hart   futex: add requeu...
35
36
  #define FUTEX_WAIT_REQUEUE_PI_PRIVATE	(FUTEX_WAIT_REQUEUE_PI | \
  					 FUTEX_PRIVATE_FLAG)
52400ba94   Darren Hart   futex: add requeu...
37
38
  #define FUTEX_CMP_REQUEUE_PI_PRIVATE	(FUTEX_CMP_REQUEUE_PI | \
  					 FUTEX_PRIVATE_FLAG)
34f01cc1f   Eric Dumazet   FUTEX: new PRIVAT...
39

0771dfefc   Ingo Molnar   [PATCH] lightweig...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  /*
   * 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
  
  /*
0771dfefc   Ingo Molnar   [PATCH] lightweig...
107
108
   * The rest of the robust-futex field is for the TID:
   */
bd197234b   Thomas Gleixner   Revert "futex_req...
109
  #define FUTEX_TID_MASK		0x3fffffff
0771dfefc   Ingo Molnar   [PATCH] lightweig...
110
111
  
  /*
76b81e2b0   Ingo Molnar   [PATCH] lightweig...
112
113
   * This limit protects against a deliberately circular list.
   * (Not worth introducing an rlimit for it)
0771dfefc   Ingo Molnar   [PATCH] lightweig...
114
   */
76b81e2b0   Ingo Molnar   [PATCH] lightweig...
115
  #define ROBUST_LIST_LIMIT	2048
0771dfefc   Ingo Molnar   [PATCH] lightweig...
116

cd689985c   Thomas Gleixner   futex: Add bitset...
117
118
119
120
121
  /*
   * bitset with all bits set for the FUTEX_xxx_BITSET OPs to request a
   * match of any bit.
   */
  #define FUTEX_BITSET_MATCH_ANY	0xffffffff
58f64d83c   David Woodhouse   [PATCH] Fix noise...
122
  #ifdef __KERNEL__
9064a6787   Mike Frysinger   linux/futex.h: pl...
123
124
125
126
  struct inode;
  struct mm_struct;
  struct task_struct;
  union ktime;
c19384b5b   Pierre Peiffer   Make futex_wait()...
127
  long do_futex(u32 __user *uaddr, int op, u32 val, union ktime *timeout,
e2970f2fb   Ingo Molnar   [PATCH] pi-futex:...
128
  	      u32 __user *uaddr2, u32 val2, u32 val3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129

e3f2ddeac   Ingo Molnar   [PATCH] pi-futex:...
130
131
  extern int
  handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi);
0771dfefc   Ingo Molnar   [PATCH] lightweig...
132

9adef58b1   Rusty Russell   futex: get_futex_...
133
134
135
136
137
138
  /*
   * Futexes are matched on equal values of this key.
   * The key type depends on whether it's a shared or private mapping.
   * Don't rearrange members without looking at hash_futex().
   *
   * offset is aligned to a multiple of sizeof(u32) (== 4) by definition.
34f01cc1f   Eric Dumazet   FUTEX: new PRIVAT...
139
140
141
142
143
144
145
146
147
148
149
   * We use the two low order bits of offset to tell what is the kind of key :
   *  00 : Private process futex (PTHREAD_PROCESS_PRIVATE)
   *       (no reference on an inode or mm)
   *  01 : Shared futex (PTHREAD_PROCESS_SHARED)
   *	mapped on a file (reference on the underlying inode)
   *  10 : Shared futex (PTHREAD_PROCESS_SHARED)
   *       (but private mapping on an mm, and reference taken on it)
  */
  
  #define FUT_OFF_INODE    1 /* We set bit 0 if key has a reference on inode */
  #define FUT_OFF_MMSHARED 2 /* We set bit 1 if key has a reference on mm */
9adef58b1   Rusty Russell   futex: get_futex_...
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  union futex_key {
  	struct {
  		unsigned long pgoff;
  		struct inode *inode;
  		int offset;
  	} shared;
  	struct {
  		unsigned long address;
  		struct mm_struct *mm;
  		int offset;
  	} private;
  	struct {
  		unsigned long word;
  		void *ptr;
  		int offset;
  	} both;
  };
9adef58b1   Rusty Russell   futex: get_futex_...
167

38d47c1b7   Peter Zijlstra   futex: rely on ge...
168
  #define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = NULL } }
0771dfefc   Ingo Molnar   [PATCH] lightweig...
169
170
  #ifdef CONFIG_FUTEX
  extern void exit_robust_list(struct task_struct *curr);
c87e2837b   Ingo Molnar   [PATCH] pi-futex:...
171
  extern void exit_pi_state_list(struct task_struct *curr);
a0c1e9073   Thomas Gleixner   futex: runtime en...
172
  extern int futex_cmpxchg_enabled;
0771dfefc   Ingo Molnar   [PATCH] lightweig...
173
174
175
176
  #else
  static inline void exit_robust_list(struct task_struct *curr)
  {
  }
c87e2837b   Ingo Molnar   [PATCH] pi-futex:...
177
178
179
  static inline void exit_pi_state_list(struct task_struct *curr)
  {
  }
0771dfefc   Ingo Molnar   [PATCH] lightweig...
180
  #endif
58f64d83c   David Woodhouse   [PATCH] Fix noise...
181
  #endif /* __KERNEL__ */
0771dfefc   Ingo Molnar   [PATCH] lightweig...
182

4732efbeb   Jakub Jelinek   [PATCH] FUTEX_WAK...
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  #define FUTEX_OP_SET		0	/* *(int *)UADDR2 = OPARG; */
  #define FUTEX_OP_ADD		1	/* *(int *)UADDR2 += OPARG; */
  #define FUTEX_OP_OR		2	/* *(int *)UADDR2 |= OPARG; */
  #define FUTEX_OP_ANDN		3	/* *(int *)UADDR2 &= ~OPARG; */
  #define FUTEX_OP_XOR		4	/* *(int *)UADDR2 ^= OPARG; */
  
  #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;  */
  
  #define FUTEX_OP(op, oparg, cmp, cmparg) \
    (((op & 0xf) << 28) | ((cmp & 0xf) << 24)		\
     | ((oparg & 0xfff) << 12) | (cmparg & 0xfff))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  #endif