[PATCH 3/4 V2] futex: free_pi_state outside of hb->lock sections

From: Darren Hart
Date: Fri Jul 09 2010 - 17:07:10 EST


free_pi_state() calls kfree() and might sleep. To prepare for raw hb->locks,
get the calls to free_pi_state() out of the hb->lock() sections.

Signed-off-by: Darren Hart <dvhltc@xxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxx>
Cc: Eric Dumazet <eric.dumazet@xxxxxxxxx>
Cc: John Kacur <jkacur@xxxxxxxxxx>
Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
Cc: Mike Galbraith <efault@xxxxxx>
---
kernel/futex.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index a6cec32..2cd58a2 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -1339,7 +1339,6 @@ retry_private:
} else if (ret) {
/* -EDEADLK */
this->pi_state = NULL;
- free_pi_state(pi_state);
goto out_unlock;
}
}
@@ -1483,16 +1482,19 @@ retry:
*/
static void unqueue_me_pi(struct futex_q *q)
{
+ struct futex_pi_state *pi_state = NULL;
+
WARN_ON(plist_node_empty(&q->list));
plist_del(&q->list, &q->list.plist);

BUG_ON(!q->pi_state);
- free_pi_state(q->pi_state);
+ pi_state = q->pi_state;
q->pi_state = NULL;

spin_unlock(q->lock_ptr);
-
drop_futex_key_refs(&q->key);
+
+ free_pi_state(pi_state);
}

/*
--
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/