futex_wait_setup — Prepare to wait on a futex


int futex_wait_setup (u32 __user * uaddr,
 u32 val,
 unsigned int flags,
 struct futex_q * q,
 struct futex_hash_bucket ** hb);


u32 __user * uaddr

the futex userspace address

u32 val

the expected value

unsigned int flags

futex flags (FLAGS_SHARED, etc.)

struct futex_q * q

the associated futex_q

struct futex_hash_bucket ** hb

storage for hash_bucket pointer to be returned to caller


Setup the futex_q and locate the hash_bucket. Get the futex value and compare it with the expected value. Handle atomic faults internally. Return with the hb lock held and a q.key reference on success, and unlocked with no q.key reference on failure.


0 - uaddr contains val and hb has been locked; <1 - -EFAULT or -EWOULDBLOCK (uaddr does not contain val) and hb is unlocked