]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man2/futex.2
futex.2: Clarify that the FUTEX_WAIT timeout is relative
[thirdparty/man-pages.git] / man2 / futex.2
CommitLineData
8f0aff2a 1.\" Page by b.hubert
2297bf0e 2.\"
2e46a6e7 3.\" %%%LICENSE_START(FREELY_REDISTRIBUTABLE)
8f0aff2a 4.\" may be freely modified and distributed
8ff7380d 5.\" %%%LICENSE_END
fea681da
MK
6.\"
7.\" Niki A. Rahimi (LTC Security Development, narahimi@us.ibm.com)
8.\" added ERRORS section.
9.\"
10.\" Modified 2004-06-17 mtk
11.\" Modified 2004-10-07 aeb, added FUTEX_REQUEUE, FUTEX_CMP_REQUEUE
12.\"
bea08fec 13.\" FIXME .
4f58b197 14.\" See also https://bugzilla.kernel.org/show_bug.cgi?id=14303
40d5cf23 15.\" 2.6.14 adds FUTEX_WAKE_OP
4f58b197
MK
16.\" commit 4732efbeb997189d9f9b04708dc26bf8613ed721
17.\" Author: Jakub Jelinek <jakub@redhat.com>
18.\" Date: Tue Sep 6 15:16:25 2005 -0700
19.\"
bea08fec 20.\" FIXME .
c13182ef
MK
21.\" 2.6.18 adds (Ingo Molnar) priority inheritance support:
22.\" FUTEX_LOCK_PI, FUTEX_UNLOCK_PI, and FUTEX_TRYLOCK_PI. These need
34f7665a
MK
23.\" to be documented in the manual page. Probably there is sufficient
24.\" material in the kernel source file Documentation/pi-futex.txt.
4f58b197
MK
25.\" commit c87e2837be82df479a6bae9f155c43516d2feebc
26.\" Author: Ingo Molnar <mingo@elte.hu>
27.\" Date: Tue Jun 27 02:54:58 2006 -0700
28.\"
29.\" commit e2970f2fb6950183a34e8545faa093eb49d186e1
30.\" Author: Ingo Molnar <mingo@elte.hu>
31.\" Date: Tue Jun 27 02:54:47 2006 -0700
32.\"
27b38e1c 33.\" See Documentation/pi-futex.txt
4f58b197 34.\"
bea08fec 35.\" FIXME .
40d5cf23 36.\" 2.6.25 adds FUTEX_WAKE_BITSET, FUTEX_WAIT_BITSET
4f58b197
MK
37.\" commit cd689985cf49f6ff5c8eddc48d98b9d581d9475d
38.\" Author: Thomas Gleixner <tglx@linutronix.de>
39.\" Date: Fri Feb 1 17:45:14 2008 +0100
40.\"
bea08fec 41.\" FIXME .
4f58b197
MK
42.\" 2.6.31 adds FUTEX_WAIT_REQUEUE_PI, FUTEX_CMP_REQUEUE_PI
43.\" commit 52400ba946759af28442dee6265c5c0180ac7122
44.\" Author: Darren Hart <dvhltc@us.ibm.com>
45.\" Date: Fri Apr 3 13:40:49 2009 -0700
46.\"
47.\" commit ba9c22f2c01cf5c88beed5a6b9e07d42e10bd358
48.\" Author: Darren Hart <dvhltc@us.ibm.com>
49.\" Date: Mon Apr 20 22:22:22 2009 -0700
50.\"
51.\" See Documentation/futex-requeue-pi.txt
34f7665a 52.\"
3d155313 53.TH FUTEX 2 2014-05-21 "Linux" "Linux Programmer's Manual"
fea681da 54.SH NAME
ce154705 55futex \- fast user-space locking
fea681da 56.SH SYNOPSIS
9d9dc1e8 57.nf
fea681da
MK
58.sp
59.B "#include <linux/futex.h>"
fea681da
MK
60.B "#include <sys/time.h>"
61.sp
9d9dc1e8
MK
62.BI "int futex(int *" uaddr ", int " op ", int " val \
63", const struct timespec *" timeout ,
64.br
65.BI " int *" uaddr2 ", int " val3 );
fea681da 66.\" int *? void *? u32 *?
9d9dc1e8 67.fi
409f08b0 68
b939d6e4
MK
69.IR Note :
70There is no glibc wrapper for this system call; see NOTES.
47297adb 71.SH DESCRIPTION
fea681da
MK
72.PP
73The
e511ffb6 74.BR futex ()
fea681da
MK
75system call provides a method for
76a program to wait for a value at a given address to change, and a
77method to wake up anyone waiting on a particular address (while the
78addresses for the same memory in separate processes may not be
79equal, the kernel maps them internally so the same memory mapped in
80different locations will correspond for
e511ffb6 81.BR futex ()
c13182ef 82calls).
fd3fa7ef 83This system call is typically used to
fea681da
MK
84implement the contended case of a lock in shared memory, as
85described in
a8bda636 86.BR futex (7).
fea681da 87.PP
c13182ef 88When a
a8bda636 89.BR futex (7)
7fac88a9 90operation did not finish uncontended in user space, a call needs to be made
c13182ef
MK
91to the kernel to arbitrate.
92Arbitration can either mean putting the calling
fea681da
MK
93process to sleep or, conversely, waking a waiting process.
94.PP
95Callers of this function are expected to adhere to the semantics as set out in
a8bda636 96.BR futex (7).
fea681da 97As these
d603cc27 98semantics involve writing nonportable assembly instructions, this in turn
fea681da
MK
99probably means that most users will in fact be library authors and not
100general application developers.
101.PP
102The
103.I uaddr
104argument needs to point to an aligned integer which stores the counter.
105The operation to execute is passed via the
106.I op
c4bb193f 107argument, along with a value
fea681da
MK
108.IR val .
109.PP
6be4bad7
MK
110The
111.I op
112argument consists of two parts:
113a command that specifies the operation to be performed,
114bit-wise ORed with zero or or more options that
115modify the behaviour of the operation.
fc30eb79
TG
116The options that may be included in
117.I op
118are as follows:
119.TP
120.BR FUTEX_PRIVATE_FLAG " (since Linux 2.6.22)"
121.\" commit 34f01cc1f512fa783302982776895c73714ebbc2
122This option bit can be employed with all futex operations.
123It tells the kernel that the futex is process private and not shared
124with another process.
125This allows the kernel to choose the fast path for validating
126the user-space address and avoids expensive VMA lookups,
127taking reference counts on file backing store, and so on.
2e98bbc2
TG
128.TP
129.BR FUTEX_CLOCK_REALTIME " (since Linux 2.6.28)"
130.\" commit 1acdac104668a0834cfa267de9946fac7764d486
4a7e5b05 131This option bit can be employed only with the
2e98bbc2
TG
132.BR FUTEX_WAIT_BITSET
133and
134.BR FUTEX_WAIT_REQUEUE_PI
135operations (described below).
136
137If this option is set,
138the kernel treats the user space supplied timeout as an absolute
139time based on
140.BR CLOCK_REALTIME .
141
142If this option is not set,
143the kernel treats the user space supplied timeout as relative time.
d67e21f5 144.\" FIXME a relative time based on what clock?
6be4bad7
MK
145.PP
146The operation specified in
147.I op
148is one of the following:
fea681da 149.TP
81c9d87e
MK
150.BR FUTEX_WAIT " (since Linux 2.6.0)"
151.\" Strictly speaking, since some time in 2.5.x
fea681da
MK
152This operation atomically verifies that the futex address
153.I uaddr
154still contains the value
155.IR val ,
682edefb
MK
156and sleeps awaiting
157.B FUTEX_WAKE
158on this futex address.
1909e523 159
c13182ef 160If the
fea681da 161.I timeout
1909e523 162argument is non-NULL, its contents specify a relative timeout for the wait.
82a6092b
MK
163(This interval will be rounded up to the system clock granularity,
164and kernel scheduling delays mean that the
165blocking interval may overrun by a small amount.)
166If
167.I timeout
168is NULL, the call blocks indefinitely.
4798a7f3 169
c13182ef 170The arguments
fea681da
MK
171.I uaddr2
172and
173.I val3
174are ignored.
175
176For
a8bda636 177.BR futex (7),
fea681da
MK
178this call is executed if decrementing the count gave a negative value
179(indicating contention), and will sleep until another process releases
682edefb
MK
180the futex and executes the
181.B FUTEX_WAKE
182operation.
fea681da 183.TP
d67e21f5
MK
184.BR FUTEX_WAIT_BITSET " (since Linux 2.6.25)"
185.\" commit cd689985cf49f6ff5c8eddc48d98b9d581d9475d
186.\" FIXME TO complete
187[As yet undocumented]
188.TP
81c9d87e
MK
189.BR FUTEX_WAKE " (since Linux 2.6.0)"
190.\" Strictly speaking, since Linux 2.5.x
a8d55537 191This operation wakes at most \fIval\fP
b87dcfb9 192processes waiting on this futex address (i.e., inside
682edefb 193.BR FUTEX_WAIT ).
4798a7f3 194
fea681da
MK
195The arguments
196.IR timeout ,
197.I uaddr2
198and
199.I val3
200are ignored.
201
202For
a8bda636 203.BR futex (7),
fea681da
MK
204this is executed if incrementing
205the count showed that there were waiters, once the futex value has been set
206to 1 (indicating that it is available).
207.TP
d67e21f5
MK
208.BR FUTEX_WAKE_OP " (since Linux 2.6.14)"
209.\" commit 4732efbeb997189d9f9b04708dc26bf8613ed721
210.\" FIXME to complete
211[As yet undocumented]
212.TP
213.BR FUTEX_WAKE_BITSET " (since Linux 2.6.25)"
214.\" commit cd689985cf49f6ff5c8eddc48d98b9d581d9475d
215.\" FIXME TO complete
216[As yet undocumented]
217.TP
218.BR FUTEX_LOCK_PI " (since Linux 2.6.18)"
219.\" commit c87e2837be82df479a6bae9f155c43516d2feebc
220.\" FIXME to complete
221[As yet undocumented]
222.TP
223.BR FUTEX_UNLOCK_PI " (since Linux 2.6.18)"
224.\" commit c87e2837be82df479a6bae9f155c43516d2feebc
225.\" FIXME to complete
226[As yet undocumented]
227.TP
228.BR FUTEX_TRYLOCK_PI " (since Linux 2.6.18)"
229.\" commit c87e2837be82df479a6bae9f155c43516d2feebc
230.\" FIXME to complete
231[As yet undocumented]
232.TP
81c9d87e
MK
233.BR FUTEX_FD " (from Linux 2.6.0 up to and including Linux 2.6.25)"
234.\" Strictly speaking, from Linux 2.5.x to 2.6.25
fea681da
MK
235To support asynchronous wakeups, this operation associates a file descriptor
236with a futex.
237.\" , suitable for .BR poll (2).
682edefb
MK
238If another process executes a
239.BR FUTEX_WAKE ,
240the process will receive the signal number that was passed in
fea681da
MK
241.IR val .
242The calling process must close the returned file descriptor after use.
4798a7f3 243
fea681da
MK
244The arguments
245.IR timeout ,
246.I uaddr2
247and
248.I val3
249are ignored.
250
c13182ef 251To prevent race conditions, the caller should test if the futex has
682edefb
MK
252been upped after
253.B FUTEX_FD
254returns.
266a5e91 255
da36351e 256Because it was inherently racy,
682edefb 257.B FUTEX_FD
5fab2e7c 258has been removed from Linux 2.6.26 onward.
fea681da 259.TP
81c9d87e
MK
260.BR FUTEX_REQUEUE " (since Linux 2.6.0)"
261.\" Strictly speaking: from Linux 2.5.70
fea681da 262This operation was introduced in order to avoid a "thundering herd" effect
682edefb
MK
263when
264.B FUTEX_WAKE
265is used and all processes woken up need to acquire another futex.
2abb73b9 266The argument
fea681da 267.I val
2abb73b9
TG
268contains the number of waiters on
269.I uaddr
270that are immediately woken up.
271The
fea681da 272.I timeout
2abb73b9
TG
273argument is (ab)used to specify the number of waiters
274that are requeued to the futex at
275.IR uaddr2 ;
276the kernel casts the
277.I timeout
278value to
279.IR u32 .
280.\" FIXME What are the constraints (if any) on the values of 'val' vs
281.\" 'timeout' vs [the number of waites on 'uaddr']?
282
283The argument
fea681da 284.I val3
2abb73b9 285is ignored.
fea681da
MK
286.TP
287.BR FUTEX_CMP_REQUEUE " (since Linux 2.6.7)"
682edefb
MK
288There was a race in the intended use of
289.BR FUTEX_REQUEUE ,
290so
291.B FUTEX_CMP_REQUEUE
292was introduced.
a72a3aeb 293.\" FIXME should there be a statement in the description of FUTEX_REQUEUE
a1f47699 294.\" to say that it should be avoided in favor of FUTEX_CMP_REQUEUE?
03433acb 295This operation is similar to
682edefb 296.BR FUTEX_REQUEUE ,
fea681da
MK
297but first checks whether the location
298.I uaddr
299still contains the value
300.IR val3 .
e808bba0
MK
301If not, the operation fails with the error
302.BR EAGAIN .
4798a7f3 303
03433acb
MK
304The arguments
305.IR val ,
306.IR uaddr ,
307.IR uaddr2 ,
308and
fea681da 309.I timeout
03433acb
MK
310are as for
311.BR FUTEX_REQUEUE .
d67e21f5
MK
312.TP
313.BR FUTEX_CMP_REQUEUE_PI " (since Linux 2.6.31)"
314.\" commit 52400ba946759af28442dee6265c5c0180ac7122
315.\" FIXME to complete
316[As yet undocumented]
317.TP
318.BR FUTEX_WAIT_REQUEUE_PI " (since Linux 2.6.31)"
319.\" commit 52400ba946759af28442dee6265c5c0180ac7122
320.\" FIXME to complete
321[As yet undocumented]
47297adb 322.SH RETURN VALUE
fea681da 323.PP
e808bba0
MK
324In the event of an error, all operations return \-1, and set
325.I errno
326to indicate the error.
327The return value on success depends on the operation,
328as described in the following list:
fea681da
MK
329.TP
330.B FUTEX_WAIT
682edefb
MK
331Returns 0 if the process was woken by a
332.B FUTEX_WAKE
333call.
e808bba0 334See ERRORS for the various possible error returns.
fea681da
MK
335.TP
336.B FUTEX_WAKE
337Returns the number of processes woken up.
338.TP
339.B FUTEX_FD
340Returns the new file descriptor associated with the futex.
341.TP
342.B FUTEX_REQUEUE
343Returns the number of processes woken up.
344.TP
345.B FUTEX_CMP_REQUEUE
346Returns the number of processes woken up.
347.SH ERRORS
348.TP
349.B EACCES
350No read access to futex memory.
351.TP
352.B EAGAIN
682edefb 353.B FUTEX_CMP_REQUEUE
e808bba0 354detected that the value pointed to by
9f6c40c0
МК
355.I uaddr
356is not equal to the expected value
357.IR val3 .
fd1dc4c2 358.\" FIXME: Is the following sentence correct?
fea681da 359(This probably indicates a race;
682edefb
MK
360use the safe
361.B FUTEX_WAKE
362now.)
fea681da
MK
363.TP
364.B EFAULT
1ea901e8
MK
365A required pointer argument (i.e.,
366.IR uaddr ,
367.IR uaddr2 ,
368or
369.IR timeout )
496df304 370did not point to a valid user-space address.
fea681da 371.TP
9f6c40c0 372.B EINTR
e808bba0 373A
9f6c40c0 374.B FUTEX_WAIT
e808bba0
MK
375operation was interrupted by a signal (see
376.BR signal (7))
377or a spurious wakeup.
9f6c40c0 378.TP
fea681da 379.B EINVAL
fb2f4c27
MK
380.RB ( FUTEX_WAIT ,
381.BR FUTEX_WAIT_REQUEUE_PI )
382The supplied
383.I timeout
384argument was invalid
385.RI ( tv_sec
386was less than zero, or
387.IR tv_nsec
388was not less than 1000,000,000).
389.TP
390.B EINVAL
ea355b7f 391.RB ( FUTEX_WAIT ,
caf1ff25 392.BR FUTEX_WAKE ,
a1f47699
MK
393.BR FUTEX_REQUEUE ,
394.BR FUTEX_CMP_REQUEUE )
51ee94be 395.I uaddr
caf1ff25 396or (for
a1f47699
MK
397.BR FUTEX_REQUEUE
398and
399.BR FUTEX_CMP_REQUEUE )
caf1ff25 400.I uaddr2
51ee94be
MK
401does not point to a valid object\(emthat is,
402the address is not 4-byte-aligned.
403.TP
404.B EINVAL
bae14b6c 405.RB ( FUTEX_WAKE ,
e169277f
MK
406.BR FUTEX_REQUEUE ,
407.BR FUTEX_CMP_REQUEUE )
496df304 408The kernel detected an inconsistency between the user-space state at
9534086b
TG
409.I uaddr
410and the kernel state\(emthat is, it detected a waiter which waits in
411.BR FUTEX_LOCK_PI .
412.TP
413.B EINVAL
add875c0
MK
414.RB ( FUTEX_REQUEUE )
415.\" FIXME tglx suggested adding this, but does this error really
416.\" occur for FUTEX_REQUEUE?
417.I uaddr
418equals
419.IR uaddr2
420(i.e., an attempt was made to requeue to the same futex).
421.TP
422.B EINVAL
4832b48a 423Invalid argument.
fea681da
MK
424.TP
425.B ENFILE
426The system limit on the total number of open files has been reached.
4701fc28
MK
427.TP
428.B ENOSYS
429Invalid operation specified in
430.IR op .
9f6c40c0 431.TP
4a7e5b05
MK
432.B ENOSYS
433The
434.BR FUTEX_CLOCK_REALTIME
435option was specified in
436.I op ,
437but the accompanying operation was neither
438.BR FUTEX_WAIT_BITSET
439nor
440.BR FUTEX_WAIT_REQUEUE_PI .
441.TP
9f6c40c0 442.B ETIMEDOUT
d1926d78
MK
443.RB ( FUTEX_WAIT )
444The operation timed out.
9f6c40c0
МК
445.TP
446.B EWOULDBLOCK
6b5025a6
MK
447.RB ( FUTEX_WAIT )
448The atomic enqueueing failed.
449.TP
450.B EWOULDBLOCK
e808bba0
MK
451.I op
452was
453.BR FUTEX_WAIT
454and the value pointed to by
9f6c40c0
МК
455.I uaddr
456was not equal to the expected value
457.I val
e808bba0 458at the time of the call.
47297adb 459.SH VERSIONS
a1d5f77c 460.PP
81c9d87e
MK
461Futexes were first made available in a stable kernel release
462with Linux 2.6.0.
463
a1d5f77c
MK
464Initial futex support was merged in Linux 2.5.7 but with different semantics
465from what was described above.
c4bb193f 466A 4-argument system call with the semantics
fd3fa7ef 467described in this page was introduced in Linux 2.5.40.
11b520ed 468In Linux 2.5.70, one argument
a1d5f77c 469was added.
11b520ed 470In Linux 2.6.7, a sixth argument was added\(emmessy, especially
a1d5f77c 471on the s390 architecture.
47297adb 472.SH CONFORMING TO
8382f16d 473This system call is Linux-specific.
47297adb 474.SH NOTES
fea681da 475.PP
fcdad7d6 476To reiterate, bare futexes are not intended as an easy-to-use abstraction
c13182ef 477for end-users.
fcdad7d6 478(There is no wrapper function for this system call in glibc.)
c13182ef 479Implementors are expected to be assembly literate and to have
7fac88a9 480read the sources of the futex user-space library referenced below.
d282bb24 481.\" .SH AUTHORS
fea681da
MK
482.\" .PP
483.\" Futexes were designed and worked on by
484.\" Hubertus Franke (IBM Thomas J. Watson Research Center),
485.\" Matthew Kirkwood, Ingo Molnar (Red Hat)
486.\" and Rusty Russell (IBM Linux Technology Center).
487.\" This page written by bert hubert.
47297adb 488.SH SEE ALSO
d806bc05 489.BR restart_syscall (2),
14d8dd3b 490.BR futex (7)
fea681da 491.PP
52087dd3 492\fIFuss, Futexes and Furwocks: Fast Userlevel Locking in Linux\fP
9b936e9e
MK
493(proceedings of the Ottawa Linux Symposium 2002), online at
494.br
608bf950
SK
495.UR http://kernel.org\:/doc\:/ols\:/2002\:/ols2002-pages-479-495.pdf
496.UE
9b936e9e
MK
497.PP
498Futex example library, futex-*.tar.bz2 at
499.br
a605264d 500.UR ftp://ftp.kernel.org\:/pub\:/linux\:/kernel\:/people\:/rusty/
608bf950 501.UE