aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/futex.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/kernel/futex.c b/kernel/futex.c
index 67dacaf93e56..6801b3751a95 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -1452,6 +1452,7 @@ retry:
1452 hb2 = hash_futex(&key2); 1452 hb2 = hash_futex(&key2);
1453 1453
1454retry_private: 1454retry_private:
1455 hb_waiters_inc(hb2);
1455 double_lock_hb(hb1, hb2); 1456 double_lock_hb(hb1, hb2);
1456 1457
1457 if (likely(cmpval != NULL)) { 1458 if (likely(cmpval != NULL)) {
@@ -1461,6 +1462,7 @@ retry_private:
1461 1462
1462 if (unlikely(ret)) { 1463 if (unlikely(ret)) {
1463 double_unlock_hb(hb1, hb2); 1464 double_unlock_hb(hb1, hb2);
1465 hb_waiters_dec(hb2);
1464 1466
1465 ret = get_user(curval, uaddr1); 1467 ret = get_user(curval, uaddr1);
1466 if (ret) 1468 if (ret)
@@ -1510,6 +1512,7 @@ retry_private:
1510 break; 1512 break;
1511 case -EFAULT: 1513 case -EFAULT:
1512 double_unlock_hb(hb1, hb2); 1514 double_unlock_hb(hb1, hb2);
1515 hb_waiters_dec(hb2);
1513 put_futex_key(&key2); 1516 put_futex_key(&key2);
1514 put_futex_key(&key1); 1517 put_futex_key(&key1);
1515 ret = fault_in_user_writeable(uaddr2); 1518 ret = fault_in_user_writeable(uaddr2);
@@ -1519,6 +1522,7 @@ retry_private:
1519 case -EAGAIN: 1522 case -EAGAIN:
1520 /* The owner was exiting, try again. */ 1523 /* The owner was exiting, try again. */
1521 double_unlock_hb(hb1, hb2); 1524 double_unlock_hb(hb1, hb2);
1525 hb_waiters_dec(hb2);
1522 put_futex_key(&key2); 1526 put_futex_key(&key2);
1523 put_futex_key(&key1); 1527 put_futex_key(&key1);
1524 cond_resched(); 1528 cond_resched();
@@ -1594,6 +1598,7 @@ retry_private:
1594 1598
1595out_unlock: 1599out_unlock:
1596 double_unlock_hb(hb1, hb2); 1600 double_unlock_hb(hb1, hb2);
1601 hb_waiters_dec(hb2);
1597 1602
1598 /* 1603 /*
1599 * drop_futex_key_refs() must be called outside the spinlocks. During 1604 * drop_futex_key_refs() must be called outside the spinlocks. During