|
@@ -1452,6 +1452,7 @@ retry:
|
|
hb2 = hash_futex(&key2);
|
|
hb2 = hash_futex(&key2);
|
|
|
|
|
|
retry_private:
|
|
retry_private:
|
|
|
|
+ hb_waiters_inc(hb2);
|
|
double_lock_hb(hb1, hb2);
|
|
double_lock_hb(hb1, hb2);
|
|
|
|
|
|
if (likely(cmpval != NULL)) {
|
|
if (likely(cmpval != NULL)) {
|
|
@@ -1461,6 +1462,7 @@ retry_private:
|
|
|
|
|
|
if (unlikely(ret)) {
|
|
if (unlikely(ret)) {
|
|
double_unlock_hb(hb1, hb2);
|
|
double_unlock_hb(hb1, hb2);
|
|
|
|
+ hb_waiters_dec(hb2);
|
|
|
|
|
|
ret = get_user(curval, uaddr1);
|
|
ret = get_user(curval, uaddr1);
|
|
if (ret)
|
|
if (ret)
|
|
@@ -1510,6 +1512,7 @@ retry_private:
|
|
break;
|
|
break;
|
|
case -EFAULT:
|
|
case -EFAULT:
|
|
double_unlock_hb(hb1, hb2);
|
|
double_unlock_hb(hb1, hb2);
|
|
|
|
+ hb_waiters_dec(hb2);
|
|
put_futex_key(&key2);
|
|
put_futex_key(&key2);
|
|
put_futex_key(&key1);
|
|
put_futex_key(&key1);
|
|
ret = fault_in_user_writeable(uaddr2);
|
|
ret = fault_in_user_writeable(uaddr2);
|
|
@@ -1519,6 +1522,7 @@ retry_private:
|
|
case -EAGAIN:
|
|
case -EAGAIN:
|
|
/* The owner was exiting, try again. */
|
|
/* The owner was exiting, try again. */
|
|
double_unlock_hb(hb1, hb2);
|
|
double_unlock_hb(hb1, hb2);
|
|
|
|
+ hb_waiters_dec(hb2);
|
|
put_futex_key(&key2);
|
|
put_futex_key(&key2);
|
|
put_futex_key(&key1);
|
|
put_futex_key(&key1);
|
|
cond_resched();
|
|
cond_resched();
|
|
@@ -1594,6 +1598,7 @@ retry_private:
|
|
|
|
|
|
out_unlock:
|
|
out_unlock:
|
|
double_unlock_hb(hb1, hb2);
|
|
double_unlock_hb(hb1, hb2);
|
|
|
|
+ hb_waiters_dec(hb2);
|
|
|
|
|
|
/*
|
|
/*
|
|
* drop_futex_key_refs() must be called outside the spinlocks. During
|
|
* drop_futex_key_refs() must be called outside the spinlocks. During
|