Make futex_wait() use an hrtimer for timeout
[linux-2.6.git] / include / linux / futex.h
1 #ifndef _LINUX_FUTEX_H
2 #define _LINUX_FUTEX_H
3
4 #include <linux/sched.h>
5
6 union ktime;
7
8 /* Second argument to futex syscall */
9
10
11 #define FUTEX_WAIT              0
12 #define FUTEX_WAKE              1
13 #define FUTEX_FD                2
14 #define FUTEX_REQUEUE           3
15 #define FUTEX_CMP_REQUEUE       4
16 #define FUTEX_WAKE_OP           5
17 #define FUTEX_LOCK_PI           6
18 #define FUTEX_UNLOCK_PI         7
19 #define FUTEX_TRYLOCK_PI        8
20
21 /*
22  * Support for robust futexes: the kernel cleans up held futexes at
23  * thread exit time.
24  */
25
26 /*
27  * Per-lock list entry - embedded in user-space locks, somewhere close
28  * to the futex field. (Note: user-space uses a double-linked list to
29  * achieve O(1) list add and remove, but the kernel only needs to know
30  * about the forward link)
31  *
32  * NOTE: this structure is part of the syscall ABI, and must not be
33  * changed.
34  */
35 struct robust_list {
36         struct robust_list __user *next;
37 };
38
39 /*
40  * Per-thread list head:
41  *
42  * NOTE: this structure is part of the syscall ABI, and must only be
43  * changed if the change is first communicated with the glibc folks.
44  * (When an incompatible change is done, we'll increase the structure
45  *  size, which glibc will detect)
46  */
47 struct robust_list_head {
48         /*
49          * The head of the list. Points back to itself if empty:
50          */
51         struct robust_list list;
52
53         /*
54          * This relative offset is set by user-space, it gives the kernel
55          * the relative position of the futex field to examine. This way
56          * we keep userspace flexible, to freely shape its data-structure,
57          * without hardcoding any particular offset into the kernel:
58          */
59         long futex_offset;
60
61         /*
62          * The death of the thread may race with userspace setting
63          * up a lock's links. So to handle this race, userspace first
64          * sets this field to the address of the to-be-taken lock,
65          * then does the lock acquire, and then adds itself to the
66          * list, and then clears this field. Hence the kernel will
67          * always have full knowledge of all locks that the thread
68          * _might_ have taken. We check the owner TID in any case,
69          * so only truly owned locks will be handled.
70          */
71         struct robust_list __user *list_op_pending;
72 };
73
74 /*
75  * Are there any waiters for this robust futex:
76  */
77 #define FUTEX_WAITERS           0x80000000
78
79 /*
80  * The kernel signals via this bit that a thread holding a futex
81  * has exited without unlocking the futex. The kernel also does
82  * a FUTEX_WAKE on such futexes, after setting the bit, to wake
83  * up any possible waiters:
84  */
85 #define FUTEX_OWNER_DIED        0x40000000
86
87 /*
88  * The rest of the robust-futex field is for the TID:
89  */
90 #define FUTEX_TID_MASK          0x3fffffff
91
92 /*
93  * This limit protects against a deliberately circular list.
94  * (Not worth introducing an rlimit for it)
95  */
96 #define ROBUST_LIST_LIMIT       2048
97
98 #ifdef __KERNEL__
99 long do_futex(u32 __user *uaddr, int op, u32 val, union ktime *timeout,
100               u32 __user *uaddr2, u32 val2, u32 val3);
101
102 extern int
103 handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi);
104
105 /*
106  * Futexes are matched on equal values of this key.
107  * The key type depends on whether it's a shared or private mapping.
108  * Don't rearrange members without looking at hash_futex().
109  *
110  * offset is aligned to a multiple of sizeof(u32) (== 4) by definition.
111  * We set bit 0 to indicate if it's an inode-based key.
112  */
113 union futex_key {
114         struct {
115                 unsigned long pgoff;
116                 struct inode *inode;
117                 int offset;
118         } shared;
119         struct {
120                 unsigned long address;
121                 struct mm_struct *mm;
122                 int offset;
123         } private;
124         struct {
125                 unsigned long word;
126                 void *ptr;
127                 int offset;
128         } both;
129 };
130 int get_futex_key(u32 __user *uaddr, union futex_key *key);
131 void get_futex_key_refs(union futex_key *key);
132 void drop_futex_key_refs(union futex_key *key);
133
134 #ifdef CONFIG_FUTEX
135 extern void exit_robust_list(struct task_struct *curr);
136 extern void exit_pi_state_list(struct task_struct *curr);
137 #else
138 static inline void exit_robust_list(struct task_struct *curr)
139 {
140 }
141 static inline void exit_pi_state_list(struct task_struct *curr)
142 {
143 }
144 #endif
145 #endif /* __KERNEL__ */
146
147 #define FUTEX_OP_SET            0       /* *(int *)UADDR2 = OPARG; */
148 #define FUTEX_OP_ADD            1       /* *(int *)UADDR2 += OPARG; */
149 #define FUTEX_OP_OR             2       /* *(int *)UADDR2 |= OPARG; */
150 #define FUTEX_OP_ANDN           3       /* *(int *)UADDR2 &= ~OPARG; */
151 #define FUTEX_OP_XOR            4       /* *(int *)UADDR2 ^= OPARG; */
152
153 #define FUTEX_OP_OPARG_SHIFT    8       /* Use (1 << OPARG) instead of OPARG.  */
154
155 #define FUTEX_OP_CMP_EQ         0       /* if (oldval == CMPARG) wake */
156 #define FUTEX_OP_CMP_NE         1       /* if (oldval != CMPARG) wake */
157 #define FUTEX_OP_CMP_LT         2       /* if (oldval < CMPARG) wake */
158 #define FUTEX_OP_CMP_LE         3       /* if (oldval <= CMPARG) wake */
159 #define FUTEX_OP_CMP_GT         4       /* if (oldval > CMPARG) wake */
160 #define FUTEX_OP_CMP_GE         5       /* if (oldval >= CMPARG) wake */
161
162 /* FUTEX_WAKE_OP will perform atomically
163    int oldval = *(int *)UADDR2;
164    *(int *)UADDR2 = oldval OP OPARG;
165    if (oldval CMP CMPARG)
166      wake UADDR2;  */
167
168 #define FUTEX_OP(op, oparg, cmp, cmparg) \
169   (((op & 0xf) << 28) | ((cmp & 0xf) << 24)             \
170    | ((oparg & 0xfff) << 12) | (cmparg & 0xfff))
171
172 #endif