Provided by: manpages-dev_6.16-1_all 

NAME
FUTEX_LOCK_PI - lock a priority-inheritance futex
LIBRARY
Standard C library (libc, -lc)
SYNOPSIS
#include <linux/futex.h> /* Definition of FUTEX_* constants */
#include <sys/syscall.h> /* Definition of SYS_* constants */
#include <unistd.h>
long syscall(SYS_futex, uint32_t *uaddr, FUTEX_LOCK_PI, 0,
const struct timespec *timeout);
DESCRIPTION
This operation is used after an attempt to acquire the lock via an atomic user-mode instruction failed
because the futex word has a nonzero value—specifically, because it contained the (PID-namespace-
specific) TID of the lock owner.
The operation checks the value of the futex word at the address uaddr. If the value is 0, then the
kernel tries to atomically set the futex value to the caller's TID. If the futex word's value is
nonzero, the kernel atomically sets the FUTEX_WAITERS bit, which signals the futex owner that it cannot
unlock the futex in user space atomically by setting the futex value to 0. After that, the kernel:
(1) Tries to find the thread which is associated with the owner TID.
(2) Creates or reuses kernel state on behalf of the owner. (If this is the first waiter, there is no
kernel state for this futex, so kernel state is created by locking the RT-mutex and the futex owner
is made the owner of the RT-mutex. If there are existing waiters, then the existing state is
reused.)
(3) Attaches the waiter to the futex (i.e., the waiter is enqueued on the RT-mutex waiter list).
If more than one waiter exists, the enqueueing of the waiter is in descending priority order. (For
information on priority ordering, see the discussion of the SCHED_DEADLINE, SCHED_FIFO, and SCHED_RR
scheduling policies in sched(7).) The owner inherits either the waiter's CPU bandwidth (if the waiter is
scheduled under the SCHED_DEADLINE policy) or the waiter's priority (if the waiter is scheduled under the
SCHED_RR or SCHED_FIFO policy). This inheritance follows the lock chain in the case of nested locking
and performs deadlock detection.
The timeout argument provides a timeout for the lock attempt. If timeout is not NULL, the structure it
points to specifies an absolute timeout. If timeout is NULL, the operation will block indefinitely.
RETURN VALUE
On error, -1 is returned, and errno is set to indicate the error.
On success, FUTEX_LOCK_PI returns 0 if the futex was successfully locked.
ERRORS
See futex(2).
EAGAIN The futex owner thread ID of uaddr is about to exit, but has not yet handled the internal state
cleanup. Try again.
EDEADLK
The futex word at uaddr is already locked by the caller.
EFAULT timeout did not point to a valid user-space address.
EINVAL The supplied timeout argument was invalid (tv_sec was less than zero, or tv_nsec was not less than
1,000,000,000).
EINVAL The kernel detected an inconsistency between the user-space state at uaddr and the kernel state.
This indicates either state corruption or that the kernel found a waiter on uaddr which is waiting
via FUTEX_WAIT(2const) or FUTEX_WAIT_BITSET(2const).
ENOMEM The kernel could not allocate memory to hold state information.
ENOSYS A run-time check determined that the operation is not available. The PI-futex operations are not
implemented on all architectures and are not supported on some CPU variants.
EPERM The caller is not allowed to attach itself to the futex at uaddr. (This may be caused by a state
corruption in user space.)
ESRCH The thread ID in the futex word at uaddr does not exist.
ETIMEDOUT
The timeout expired before the operation completed.
STANDARDS
Linux.
HISTORY
Linux 2.6.18.
CAVEATS
Unlike other futex(2) operations, the timeout is measured against the CLOCK_REALTIME clock.
SEE ALSO
futex(2)
Linux man-pages 6.16 2025-10-05 FUTEX_LOCK_PI(2const)