Two new helper functions (task_pi_list_add & task_pi_list_del) are created to consolidate all the pure pi_state_list addition and insertion codes. The set_owner argument in task_pi_list_add() will be needed in a later patch. Signed-off-by: Waiman Long <longman@xxxxxxxxxx> --- kernel/futex.c | 64 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/kernel/futex.c b/kernel/futex.c index 7590c7d..ccec962 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -822,6 +822,39 @@ static inline int get_futex_value(u32 *dest, u32 __user *from) /* * PI code: */ + +/** + * task_pi_list_add - add futex state object to a task's pi_state_list + * @task : task structure + * @state: futex state object + */ +static inline void task_pi_list_add(struct task_struct *task, + struct futex_state *state) +{ + raw_spin_lock_irq(&task->pi_lock); + WARN_ON(!list_empty(&state->list)); + list_add(&state->list, &task->pi_state_list); + state->owner = task; + raw_spin_unlock_irq(&task->pi_lock); +} + +/** + * task_pi_list_del - delete futex state object from a task's pi_state_list + * @state: futex state object + * @warn : warn if list is empty when set + */ +static inline void task_pi_list_del(struct futex_state *state, const bool warn) +{ + struct task_struct *task = state->owner; + + raw_spin_lock_irq(&task->pi_lock); + if (warn) + WARN_ON(list_empty(&state->list)); + list_del_init(&state->list); + state->owner = NULL; + raw_spin_unlock_irq(&task->pi_lock); +} + static int refill_futex_state_cache(void) { struct futex_state *state; @@ -874,9 +907,7 @@ static void put_futex_state(struct futex_state *state) * and has cleaned up the futex state already */ if (state->owner) { - raw_spin_lock_irq(&state->owner->pi_lock); - list_del_init(&state->list); - raw_spin_unlock_irq(&state->owner->pi_lock); + task_pi_list_del(state, false); rt_mutex_proxy_unlock(&state->pi_mutex, state->owner); } @@ -1397,16 +1428,8 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this, return ret; } - raw_spin_lock(&pi_state->owner->pi_lock); - WARN_ON(list_empty(&pi_state->list)); - list_del_init(&pi_state->list); - raw_spin_unlock(&pi_state->owner->pi_lock); - - raw_spin_lock(&new_owner->pi_lock); - WARN_ON(!list_empty(&pi_state->list)); - list_add(&pi_state->list, &new_owner->pi_state_list); - pi_state->owner = new_owner; - raw_spin_unlock(&new_owner->pi_lock); + task_pi_list_del(pi_state, true); + task_pi_list_add(new_owner, pi_state); raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); @@ -2211,19 +2234,10 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, * We fixed up user space. Now we need to fix the pi_state * itself. */ - if (pi_state->owner != NULL) { - raw_spin_lock_irq(&pi_state->owner->pi_lock); - WARN_ON(list_empty(&pi_state->list)); - list_del_init(&pi_state->list); - raw_spin_unlock_irq(&pi_state->owner->pi_lock); - } + if (pi_state->owner != NULL) + task_pi_list_del(pi_state, true); - pi_state->owner = newowner; - - raw_spin_lock_irq(&newowner->pi_lock); - WARN_ON(!list_empty(&pi_state->list)); - list_add(&pi_state->list, &newowner->pi_state_list); - raw_spin_unlock_irq(&newowner->pi_lock); + task_pi_list_add(newowner, pi_state); return 0; /* -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html