Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 137596
b: refs/heads/master
c: 5eb3dc6
h: refs/heads/master
v: v3
  • Loading branch information
Darren Hart authored and Ingo Molnar committed Mar 12, 2009
1 parent 0269012 commit d1b7964
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: de87fcc124a5d4a171aa32707b3265608ebda6e7
refs/heads/master: 5eb3dc62fc5986e85715041c23dcf3832812be4b
29 changes: 17 additions & 12 deletions trunk/kernel/futex.c
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,19 @@ double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2)
}
}

static inline void
double_unlock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2)
{
if (hb1 <= hb2) {
spin_unlock(&hb2->lock);
if (hb1 < hb2)
spin_unlock(&hb1->lock);
} else { /* hb1 > hb2 */
spin_unlock(&hb1->lock);
spin_unlock(&hb2->lock);
}
}

/*
* Wake up waiters matching bitset queued on this futex (uaddr).
*/
Expand Down Expand Up @@ -767,9 +780,7 @@ futex_wake_op(u32 __user *uaddr1, int fshared, u32 __user *uaddr2,
if (unlikely(op_ret < 0)) {
u32 dummy;

spin_unlock(&hb1->lock);
if (hb1 != hb2)
spin_unlock(&hb2->lock);
double_unlock_hb(hb1, hb2);

#ifndef CONFIG_MMU
/*
Expand Down Expand Up @@ -833,9 +844,7 @@ futex_wake_op(u32 __user *uaddr1, int fshared, u32 __user *uaddr2,
ret += op_ret;
}

spin_unlock(&hb1->lock);
if (hb1 != hb2)
spin_unlock(&hb2->lock);
double_unlock_hb(hb1, hb2);
out_put_keys:
put_futex_key(fshared, &key2);
out_put_key1:
Expand Down Expand Up @@ -876,9 +885,7 @@ static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2,
ret = get_futex_value_locked(&curval, uaddr1);

if (unlikely(ret)) {
spin_unlock(&hb1->lock);
if (hb1 != hb2)
spin_unlock(&hb2->lock);
double_unlock_hb(hb1, hb2);

put_futex_key(fshared, &key2);
put_futex_key(fshared, &key1);
Expand Down Expand Up @@ -925,9 +932,7 @@ static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2,
}

out_unlock:
spin_unlock(&hb1->lock);
if (hb1 != hb2)
spin_unlock(&hb2->lock);
double_unlock_hb(hb1, hb2);

/* drop_futex_key_refs() must be called outside the spinlocks. */
while (--drop_count >= 0)
Expand Down

0 comments on commit d1b7964

Please sign in to comment.