futex_wait_requeue_pi — Wait on uaddr and take uaddr2


int futex_wait_requeue_pi (u32 __user * uaddr,
 unsigned int flags,
 u32 val,
 ktime_t * abs_time,
 u32 bitset,
 u32 __user * uaddr2);



the futex we initially wait on (non-pi)


futex flags (FLAGS_SHARED, FLAGS_CLOCKRT, etc.), they must be the same type, no requeueing from private to shared, etc.


the expected value of uaddr


absolute timeout


32 bit wakeup bitset set by userspace, defaults to all


the pi futex we will take prior to returning to user-space


The caller will wait on uaddr and will be requeued by futex_requeue to uaddr2 which must be PI aware and unique from uaddr. Normal wakeup will wake on uaddr2 and complete the acquisition of the rt_mutex prior to returning to userspace. This ensures the rt_mutex maintains an owner when it has waiters; without one, the pi logic would not know which task to boost/deboost, if there was a need to.

We call schedule in futex_wait_queue_me when we enqueue and return there via the following-- 1) wakeup on uaddr2 after an atomic lock acquisition by futex_requeue 2) wakeup on uaddr2 after a requeue 3) signal 4) timeout

If 3, cleanup and return -ERESTARTNOINTR.

If 2, we may then block on trying to take the rt_mutex and return via: 5) successful lock 6) signal 7) timeout 8) other lock acquisition failure

If 6, return -EWOULDBLOCK (restarting the syscall would do the same).

If 4 or 7, we cleanup and return with -ETIMEDOUT.


0 - On success; <0 - On error