* (C) Copyright 2003 Red Hat Inc, All Rights Reserved
*
* Removed page pinning, fix privately mapped COW pages and other cleanups
- * (C) Copyright 2003, 2004 Jamie Lokier
+ * (C) Copyright 2003 Jamie Lokier
*
* Thanks to Ben LaHaise for yelling "hashed waitqueues" loudly
* enough at me, Linus for the original (flawed) idea, Matthew
queue_me(&q, -1, NULL);
/*
- * Access the page AFTER the futex is queued.
- * Order is important:
- *
- * Userspace waiter: val = var; if (cond(val)) futex_wait(&var, val);
- * Userspace waker: if (cond(var)) { var = new; futex_wake(&var); }
- *
- * The basic logical guarantee of a futex is that it blocks ONLY
- * if cond(var) is known to be true at the time of blocking, for
- * any cond. If we queued after testing *uaddr, that would open
- * a race condition where we could block indefinitely with
- * cond(var) false, which would violate the guarantee.
- *
- * A consequence is that futex_wait() can return zero and absorb
- * a wakeup when *uaddr != val on entry to the syscall. This is
- * rare, but normal.
- *
+ * Access the page after the futex is queued.
* We hold the mmap semaphore, so the mapping cannot have changed
- * since we looked it up in get_futex_key.
+ * since we looked it up.
*/
if (get_user(curval, (int __user *)uaddr) != 0) {
ret = -EFAULT;
for (i = 0; i < ARRAY_SIZE(futex_queues); i++) {
INIT_LIST_HEAD(&futex_queues[i].chain);
- spin_lock_init(&futex_queues[i].lock);
+ futex_queues[i].lock = SPIN_LOCK_UNLOCKED;
}
return 0;
}