From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754789AbcITNn1 (ORCPT ); Tue, 20 Sep 2016 09:43:27 -0400 Received: from g2t2355.austin.hpe.com ([15.233.44.28]:37061 "EHLO g2t2355.austin.hpe.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753340AbcITNnX (ORCPT ); Tue, 20 Sep 2016 09:43:23 -0400 From: Waiman Long To: Thomas Gleixner , Ingo Molnar , Peter Zijlstra , Jonathan Corbet Cc: linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Davidlohr Bueso , Jason Low , Scott J Norton , Douglas Hatch , Waiman Long Subject: [RFC PATCH v2 1/5] futex: Add futex_set_timer() helper function Date: Tue, 20 Sep 2016 09:42:39 -0400 Message-Id: <1474378963-15496-2-git-send-email-Waiman.Long@hpe.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1474378963-15496-1-git-send-email-Waiman.Long@hpe.com> References: <1474378963-15496-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 This patch adds a new futex_set_timer() function to consolidate all the sleeping hrtime setup code. Signed-off-by: Waiman Long --- kernel/futex.c | 51 ++++++++++++++++++++++++--------------------------- 1 files changed, 24 insertions(+), 27 deletions(-) diff --git a/kernel/futex.c b/kernel/futex.c index 46cb3a3..37e61ef 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -467,6 +467,25 @@ static void drop_futex_key_refs(union futex_key *key) } } +/* + * Helper function to set the sleeping hrtimer. + */ +static inline void futex_set_timer(ktime_t *time, struct hrtimer_sleeper **pto, + struct hrtimer_sleeper *timeout, int flags, u64 range_ns) +{ + if (!time) + return; + *pto = timeout; + hrtimer_init_on_stack(&timeout->timer, (flags & FLAGS_CLOCKRT) ? + CLOCK_REALTIME : CLOCK_MONOTONIC, + HRTIMER_MODE_ABS); + hrtimer_init_sleeper(timeout, current); + if (range_ns) + hrtimer_set_expires_range_ns(&timeout->timer, *time, range_ns); + else + hrtimer_set_expires(&timeout->timer, *time); +} + /** * get_futex_key() - Get parameters which are the keys for a futex * @uaddr: virtual address of the futex @@ -2403,17 +2422,8 @@ static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val, return -EINVAL; q.bitset = bitset; - if (abs_time) { - to = &timeout; - - hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? - CLOCK_REALTIME : CLOCK_MONOTONIC, - HRTIMER_MODE_ABS); - hrtimer_init_sleeper(to, current); - hrtimer_set_expires_range_ns(&to->timer, *abs_time, - current->timer_slack_ns); - } - + futex_set_timer(abs_time, &to, &timeout, flags, + current->timer_slack_ns); retry: /* * Prepare to wait on uaddr. On success, holds hb lock and increments @@ -2501,13 +2511,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, if (refill_pi_state_cache()) return -ENOMEM; - if (time) { - to = &timeout; - hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME, - HRTIMER_MODE_ABS); - hrtimer_init_sleeper(to, current); - hrtimer_set_expires(&to->timer, *time); - } + futex_set_timer(time, &to, &timeout, FLAGS_CLOCKRT, 0); retry: ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, VERIFY_WRITE); @@ -2816,15 +2820,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, if (!bitset) return -EINVAL; - if (abs_time) { - to = &timeout; - hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? - CLOCK_REALTIME : CLOCK_MONOTONIC, - HRTIMER_MODE_ABS); - hrtimer_init_sleeper(to, current); - hrtimer_set_expires_range_ns(&to->timer, *abs_time, - current->timer_slack_ns); - } + futex_set_timer(abs_time, &to, &timeout, flags, + current->timer_slack_ns); /* * The waiter is allocated on our stack, manipulated by the requeue -- 1.7.1