|
@@ -725,9 +725,12 @@ static struct futex_pi_state * alloc_pi_state(void)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
+ * Drops a reference to the pi_state object and frees or caches it
|
|
|
+ * when the last reference is gone.
|
|
|
+ *
|
|
|
* Must be called with the hb lock held.
|
|
|
*/
|
|
|
-static void free_pi_state(struct futex_pi_state *pi_state)
|
|
|
+static void put_pi_state(struct futex_pi_state *pi_state)
|
|
|
{
|
|
|
if (!pi_state)
|
|
|
return;
|
|
@@ -1729,7 +1732,7 @@ retry_private:
|
|
|
case 0:
|
|
|
break;
|
|
|
case -EFAULT:
|
|
|
- free_pi_state(pi_state);
|
|
|
+ put_pi_state(pi_state);
|
|
|
pi_state = NULL;
|
|
|
double_unlock_hb(hb1, hb2);
|
|
|
hb_waiters_dec(hb2);
|
|
@@ -1746,7 +1749,7 @@ retry_private:
|
|
|
* exit to complete.
|
|
|
* - The user space value changed.
|
|
|
*/
|
|
|
- free_pi_state(pi_state);
|
|
|
+ put_pi_state(pi_state);
|
|
|
pi_state = NULL;
|
|
|
double_unlock_hb(hb1, hb2);
|
|
|
hb_waiters_dec(hb2);
|
|
@@ -1815,7 +1818,7 @@ retry_private:
|
|
|
} else if (ret) {
|
|
|
/* -EDEADLK */
|
|
|
this->pi_state = NULL;
|
|
|
- free_pi_state(pi_state);
|
|
|
+ put_pi_state(pi_state);
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
}
|
|
@@ -1824,7 +1827,7 @@ retry_private:
|
|
|
}
|
|
|
|
|
|
out_unlock:
|
|
|
- free_pi_state(pi_state);
|
|
|
+ put_pi_state(pi_state);
|
|
|
double_unlock_hb(hb1, hb2);
|
|
|
wake_up_q(&wake_q);
|
|
|
hb_waiters_dec(hb2);
|
|
@@ -1973,7 +1976,7 @@ static void unqueue_me_pi(struct futex_q *q)
|
|
|
__unqueue_futex(q);
|
|
|
|
|
|
BUG_ON(!q->pi_state);
|
|
|
- free_pi_state(q->pi_state);
|
|
|
+ put_pi_state(q->pi_state);
|
|
|
q->pi_state = NULL;
|
|
|
|
|
|
spin_unlock(q->lock_ptr);
|
|
@@ -2759,7 +2762,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
|
|
|
* Drop the reference to the pi state which
|
|
|
* the requeue_pi() code acquired for us.
|
|
|
*/
|
|
|
- free_pi_state(q.pi_state);
|
|
|
+ put_pi_state(q.pi_state);
|
|
|
spin_unlock(q.lock_ptr);
|
|
|
}
|
|
|
} else {
|