Loading kernel/futex.c +19 −29 Original line number Diff line number Diff line Loading @@ -200,8 +200,7 @@ static void drop_futex_key_refs(union futex_key *key) * For other futexes, it points to ¤t->mm->mmap_sem and * caller must have taken the reader lock. but NOT any spinlocks. */ static int get_futex_key(u32 __user *uaddr, struct rw_semaphore *fshared, union futex_key *key) static int get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key) { unsigned long address = (unsigned long)uaddr; struct mm_struct *mm = current->mm; Loading Loading @@ -268,7 +267,7 @@ static int get_futex_key(u32 __user *uaddr, struct rw_semaphore *fshared, } static inline void put_futex_key(struct rw_semaphore *fshared, union futex_key *key) void put_futex_key(int fshared, union futex_key *key) { drop_futex_key_refs(key); } Loading Loading @@ -297,10 +296,8 @@ static int get_futex_value_locked(u32 *dest, u32 __user *from) /* * Fault handling. * if fshared is non NULL, current->mm->mmap_sem is already held */ static int futex_handle_fault(unsigned long address, struct rw_semaphore *fshared, int attempt) static int futex_handle_fault(unsigned long address, int attempt) { struct vm_area_struct * vma; struct mm_struct *mm = current->mm; Loading Loading @@ -687,8 +684,7 @@ double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) * Wake up all waiters hashed on the physical page that is mapped * to this virtual address: */ static int futex_wake(u32 __user *uaddr, struct rw_semaphore *fshared, int nr_wake, u32 bitset) static int futex_wake(u32 __user *uaddr, int fshared, int nr_wake, u32 bitset) { struct futex_hash_bucket *hb; struct futex_q *this, *next; Loading Loading @@ -735,8 +731,7 @@ static int futex_wake(u32 __user *uaddr, struct rw_semaphore *fshared, * to this virtual address: */ static int futex_wake_op(u32 __user *uaddr1, struct rw_semaphore *fshared, u32 __user *uaddr2, futex_wake_op(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, int nr_wake, int nr_wake2, int op) { union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT; Loading Loading @@ -790,7 +785,7 @@ futex_wake_op(u32 __user *uaddr1, struct rw_semaphore *fshared, */ if (attempt++) { ret = futex_handle_fault((unsigned long)uaddr2, fshared, attempt); attempt); if (ret) goto out; goto retry; Loading Loading @@ -841,8 +836,7 @@ futex_wake_op(u32 __user *uaddr1, struct rw_semaphore *fshared, * Requeue all waiters hashed on one physical page to another * physical page. */ static int futex_requeue(u32 __user *uaddr1, struct rw_semaphore *fshared, u32 __user *uaddr2, static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, int nr_wake, int nr_requeue, u32 *cmpval) { union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT; Loading Loading @@ -1048,8 +1042,7 @@ static void unqueue_me_pi(struct futex_q *q) * private futexes. */ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, struct task_struct *newowner, struct rw_semaphore *fshared) struct task_struct *newowner, int fshared) { u32 newtid = task_pid_vnr(newowner) | FUTEX_WAITERS; struct futex_pi_state *pi_state = q->pi_state; Loading Loading @@ -1128,7 +1121,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, handle_fault: spin_unlock(q->lock_ptr); ret = futex_handle_fault((unsigned long)uaddr, fshared, attempt++); ret = futex_handle_fault((unsigned long)uaddr, attempt++); spin_lock(q->lock_ptr); Loading @@ -1152,7 +1145,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, static long futex_wait_restart(struct restart_block *restart); static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared, static int futex_wait(u32 __user *uaddr, int fshared, u32 val, ktime_t *abs_time, u32 bitset) { struct task_struct *curr = current; Loading Loading @@ -1307,13 +1300,13 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared, static long futex_wait_restart(struct restart_block *restart) { u32 __user *uaddr = (u32 __user *)restart->futex.uaddr; struct rw_semaphore *fshared = NULL; int fshared = 0; ktime_t t; t.tv64 = restart->futex.time; restart->fn = do_no_restart_syscall; if (restart->futex.flags & FLAGS_SHARED) fshared = ¤t->mm->mmap_sem; fshared = 1; return (long)futex_wait(uaddr, fshared, restart->futex.val, &t, restart->futex.bitset); } Loading @@ -1325,7 +1318,7 @@ static long futex_wait_restart(struct restart_block *restart) * if there are waiters then it will block, it does PI, etc. (Due to * races the kernel might see a 0 value of the futex too.) */ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, static int futex_lock_pi(u32 __user *uaddr, int fshared, int detect, ktime_t *time, int trylock) { struct hrtimer_sleeper timeout, *to = NULL; Loading Loading @@ -1571,8 +1564,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, queue_unlock(&q, hb); if (attempt++) { ret = futex_handle_fault((unsigned long)uaddr, fshared, attempt); ret = futex_handle_fault((unsigned long)uaddr, attempt); if (ret) goto out_release_sem; goto retry_unlocked; Loading @@ -1592,7 +1584,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, * This is the in-kernel slowpath: we look up the PI state (if any), * and do the rt-mutex unlock. */ static int futex_unlock_pi(u32 __user *uaddr, struct rw_semaphore *fshared) static int futex_unlock_pi(u32 __user *uaddr, int fshared) { struct futex_hash_bucket *hb; struct futex_q *this, *next; Loading Loading @@ -1683,8 +1675,7 @@ static int futex_unlock_pi(u32 __user *uaddr, struct rw_semaphore *fshared) spin_unlock(&hb->lock); if (attempt++) { ret = futex_handle_fault((unsigned long)uaddr, fshared, attempt); ret = futex_handle_fault((unsigned long)uaddr, attempt); if (ret) goto out; uval = 0; Loading Loading @@ -1816,8 +1807,7 @@ int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi) * PI futexes happens in exit_pi_state(): */ if (!pi && (uval & FUTEX_WAITERS)) futex_wake(uaddr, &curr->mm->mmap_sem, 1, FUTEX_BITSET_MATCH_ANY); futex_wake(uaddr, 1, 1, FUTEX_BITSET_MATCH_ANY); } return 0; } Loading Loading @@ -1913,10 +1903,10 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, { int ret = -ENOSYS; int cmd = op & FUTEX_CMD_MASK; struct rw_semaphore *fshared = NULL; int fshared = 0; if (!(op & FUTEX_PRIVATE_FLAG)) fshared = ¤t->mm->mmap_sem; fshared = 1; switch (cmd) { case FUTEX_WAIT: Loading Loading
kernel/futex.c +19 −29 Original line number Diff line number Diff line Loading @@ -200,8 +200,7 @@ static void drop_futex_key_refs(union futex_key *key) * For other futexes, it points to ¤t->mm->mmap_sem and * caller must have taken the reader lock. but NOT any spinlocks. */ static int get_futex_key(u32 __user *uaddr, struct rw_semaphore *fshared, union futex_key *key) static int get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key) { unsigned long address = (unsigned long)uaddr; struct mm_struct *mm = current->mm; Loading Loading @@ -268,7 +267,7 @@ static int get_futex_key(u32 __user *uaddr, struct rw_semaphore *fshared, } static inline void put_futex_key(struct rw_semaphore *fshared, union futex_key *key) void put_futex_key(int fshared, union futex_key *key) { drop_futex_key_refs(key); } Loading Loading @@ -297,10 +296,8 @@ static int get_futex_value_locked(u32 *dest, u32 __user *from) /* * Fault handling. * if fshared is non NULL, current->mm->mmap_sem is already held */ static int futex_handle_fault(unsigned long address, struct rw_semaphore *fshared, int attempt) static int futex_handle_fault(unsigned long address, int attempt) { struct vm_area_struct * vma; struct mm_struct *mm = current->mm; Loading Loading @@ -687,8 +684,7 @@ double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) * Wake up all waiters hashed on the physical page that is mapped * to this virtual address: */ static int futex_wake(u32 __user *uaddr, struct rw_semaphore *fshared, int nr_wake, u32 bitset) static int futex_wake(u32 __user *uaddr, int fshared, int nr_wake, u32 bitset) { struct futex_hash_bucket *hb; struct futex_q *this, *next; Loading Loading @@ -735,8 +731,7 @@ static int futex_wake(u32 __user *uaddr, struct rw_semaphore *fshared, * to this virtual address: */ static int futex_wake_op(u32 __user *uaddr1, struct rw_semaphore *fshared, u32 __user *uaddr2, futex_wake_op(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, int nr_wake, int nr_wake2, int op) { union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT; Loading Loading @@ -790,7 +785,7 @@ futex_wake_op(u32 __user *uaddr1, struct rw_semaphore *fshared, */ if (attempt++) { ret = futex_handle_fault((unsigned long)uaddr2, fshared, attempt); attempt); if (ret) goto out; goto retry; Loading Loading @@ -841,8 +836,7 @@ futex_wake_op(u32 __user *uaddr1, struct rw_semaphore *fshared, * Requeue all waiters hashed on one physical page to another * physical page. */ static int futex_requeue(u32 __user *uaddr1, struct rw_semaphore *fshared, u32 __user *uaddr2, static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, int nr_wake, int nr_requeue, u32 *cmpval) { union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT; Loading Loading @@ -1048,8 +1042,7 @@ static void unqueue_me_pi(struct futex_q *q) * private futexes. */ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, struct task_struct *newowner, struct rw_semaphore *fshared) struct task_struct *newowner, int fshared) { u32 newtid = task_pid_vnr(newowner) | FUTEX_WAITERS; struct futex_pi_state *pi_state = q->pi_state; Loading Loading @@ -1128,7 +1121,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, handle_fault: spin_unlock(q->lock_ptr); ret = futex_handle_fault((unsigned long)uaddr, fshared, attempt++); ret = futex_handle_fault((unsigned long)uaddr, attempt++); spin_lock(q->lock_ptr); Loading @@ -1152,7 +1145,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, static long futex_wait_restart(struct restart_block *restart); static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared, static int futex_wait(u32 __user *uaddr, int fshared, u32 val, ktime_t *abs_time, u32 bitset) { struct task_struct *curr = current; Loading Loading @@ -1307,13 +1300,13 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared, static long futex_wait_restart(struct restart_block *restart) { u32 __user *uaddr = (u32 __user *)restart->futex.uaddr; struct rw_semaphore *fshared = NULL; int fshared = 0; ktime_t t; t.tv64 = restart->futex.time; restart->fn = do_no_restart_syscall; if (restart->futex.flags & FLAGS_SHARED) fshared = ¤t->mm->mmap_sem; fshared = 1; return (long)futex_wait(uaddr, fshared, restart->futex.val, &t, restart->futex.bitset); } Loading @@ -1325,7 +1318,7 @@ static long futex_wait_restart(struct restart_block *restart) * if there are waiters then it will block, it does PI, etc. (Due to * races the kernel might see a 0 value of the futex too.) */ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, static int futex_lock_pi(u32 __user *uaddr, int fshared, int detect, ktime_t *time, int trylock) { struct hrtimer_sleeper timeout, *to = NULL; Loading Loading @@ -1571,8 +1564,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, queue_unlock(&q, hb); if (attempt++) { ret = futex_handle_fault((unsigned long)uaddr, fshared, attempt); ret = futex_handle_fault((unsigned long)uaddr, attempt); if (ret) goto out_release_sem; goto retry_unlocked; Loading @@ -1592,7 +1584,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, * This is the in-kernel slowpath: we look up the PI state (if any), * and do the rt-mutex unlock. */ static int futex_unlock_pi(u32 __user *uaddr, struct rw_semaphore *fshared) static int futex_unlock_pi(u32 __user *uaddr, int fshared) { struct futex_hash_bucket *hb; struct futex_q *this, *next; Loading Loading @@ -1683,8 +1675,7 @@ static int futex_unlock_pi(u32 __user *uaddr, struct rw_semaphore *fshared) spin_unlock(&hb->lock); if (attempt++) { ret = futex_handle_fault((unsigned long)uaddr, fshared, attempt); ret = futex_handle_fault((unsigned long)uaddr, attempt); if (ret) goto out; uval = 0; Loading Loading @@ -1816,8 +1807,7 @@ int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi) * PI futexes happens in exit_pi_state(): */ if (!pi && (uval & FUTEX_WAITERS)) futex_wake(uaddr, &curr->mm->mmap_sem, 1, FUTEX_BITSET_MATCH_ANY); futex_wake(uaddr, 1, 1, FUTEX_BITSET_MATCH_ANY); } return 0; } Loading Loading @@ -1913,10 +1903,10 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, { int ret = -ENOSYS; int cmd = op & FUTEX_CMD_MASK; struct rw_semaphore *fshared = NULL; int fshared = 0; if (!(op & FUTEX_PRIVATE_FLAG)) fshared = ¤t->mm->mmap_sem; fshared = 1; switch (cmd) { case FUTEX_WAIT: Loading