From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934496AbcI3Va1 (ORCPT ); Fri, 30 Sep 2016 17:30:27 -0400 Received: from g4t3425.houston.hpe.com ([15.241.140.78]:8055 "EHLO g4t3425.houston.hpe.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933879AbcI3V1r (ORCPT ); Fri, 30 Sep 2016 17:27:47 -0400 From: Waiman Long To: Thomas Gleixner , Ingo Molnar , Peter Zijlstra , Jonathan Corbet Cc: linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Arnaldo Carvalho de Melo , Davidlohr Bueso , Mike Galbraith , Jason Low , Scott J Norton , Douglas Hatch , Waiman Long Subject: [PATCH v3 04/13] futex: Consolidate pure pi_state_list add & delete codes to helpers Date: Fri, 30 Sep 2016 17:26:13 -0400 Message-Id: <1475270782-51720-5-git-send-email-Waiman.Long@hpe.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1475270782-51720-1-git-send-email-Waiman.Long@hpe.com> References: <1475270782-51720-1-git-send-email-Waiman.Long@hpe.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- kernel/futex.c | 67 +++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 42 insertions(+), 25 deletions(-) diff --git a/kernel/futex.c b/kernel/futex.c index ebe59fa..0d1b1be 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -813,6 +813,42 @@ 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 + * @set_owner: set futex state owner to the given task if true + */ +static inline void task_pi_list_add(struct task_struct *task, + struct futex_state *state, + const bool set_owner) +{ + raw_spin_lock_irq(&task->pi_lock); + WARN_ON(!list_empty(&state->list)); + list_add(&state->list, &task->pi_state_list); + if (set_owner) + 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 + * @task : task structure + * @state: futex state object + * @warn : warn if list is empty when set + */ +static inline void task_pi_list_del(struct task_struct *task, + struct futex_state *state, + const bool warn) +{ + raw_spin_lock_irq(&task->pi_lock); + if (warn) + WARN_ON(list_empty(&state->list)); + list_del_init(&state->list); + raw_spin_unlock_irq(&task->pi_lock); +} + static int refill_futex_state_cache(void) { struct futex_state *state; @@ -865,9 +901,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->owner, state, false); rt_mutex_proxy_unlock(&state->pi_mutex, state->owner); } @@ -1388,16 +1422,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->owner, pi_state, true); + task_pi_list_add(new_owner, pi_state, true); raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); @@ -2202,19 +2228,10 @@ retry: * 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->owner, 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, true); return 0; /* -- 1.7.1