From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964847AbcGGIot (ORCPT ); Thu, 7 Jul 2016 04:44:49 -0400 Received: from terminus.zytor.com ([198.137.202.10]:39290 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756935AbcGGIop (ORCPT ); Thu, 7 Jul 2016 04:44:45 -0400 Date: Thu, 7 Jul 2016 01:43:58 -0700 From: tip-bot for Thomas Gleixner Message-ID: Cc: clm@fb.com, mingo@kernel.org, chrubis@suse.cz, fweisbec@gmail.com, lenb@kernel.org, arjan@infradead.org, torvalds@linux-foundation.org, tglx@linutronix.de, hpa@zytor.com, viro@zeniv.linux.org.uk, peterz@infradead.org, paulmck@linux.vnet.ibm.com, linux-kernel@vger.kernel.org, josh@joshtriplett.org, linux@sciencehorizons.net, riel@redhat.com Reply-To: clm@fb.com, mingo@kernel.org, lenb@kernel.org, arjan@infradead.org, chrubis@suse.cz, fweisbec@gmail.com, peterz@infradead.org, viro@zeniv.linux.org.uk, torvalds@linux-foundation.org, tglx@linutronix.de, hpa@zytor.com, paulmck@linux.vnet.ibm.com, linux-kernel@vger.kernel.org, riel@redhat.com, linux@sciencehorizons.net, josh@joshtriplett.org In-Reply-To: <20160704094341.787164909@linutronix.de> References: <20160704094341.787164909@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:timers/core] signals: Use hrtimer for sigtimedwait() Git-Commit-ID: 2b1ecc3d1a6b10f8fbac7f83d80db30b5a2c2791 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 2b1ecc3d1a6b10f8fbac7f83d80db30b5a2c2791 Gitweb: http://git.kernel.org/tip/2b1ecc3d1a6b10f8fbac7f83d80db30b5a2c2791 Author: Thomas Gleixner AuthorDate: Mon, 4 Jul 2016 09:50:25 +0000 Committer: Ingo Molnar CommitDate: Thu, 7 Jul 2016 10:35:07 +0200 signals: Use hrtimer for sigtimedwait() We've converted most timeout related syscalls to hrtimers, but sigtimedwait() did not get this treatment. Convert it so we get a reasonable accuracy and remove the user space exposure to the timer wheel properties. Signed-off-by: Thomas Gleixner Reviewed-by: Frederic Weisbecker Cc: Al Viro Cc: Arjan van de Ven Cc: Chris Mason Cc: Cyril Hrubis Cc: George Spelvin Cc: Josh Triplett Cc: Len Brown Cc: Linus Torvalds Cc: Paul McKenney Cc: Peter Zijlstra Cc: Rik van Riel Cc: rt@linutronix.de Link: http://lkml.kernel.org/r/20160704094341.787164909@linutronix.de Signed-off-by: Ingo Molnar --- kernel/signal.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/kernel/signal.c b/kernel/signal.c index 96e9bc4..af21afc 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2751,23 +2751,18 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from) * @ts: upper bound on process time suspension */ int do_sigtimedwait(const sigset_t *which, siginfo_t *info, - const struct timespec *ts) + const struct timespec *ts) { + ktime_t *to = NULL, timeout = { .tv64 = KTIME_MAX }; struct task_struct *tsk = current; - long timeout = MAX_SCHEDULE_TIMEOUT; sigset_t mask = *which; - int sig; + int sig, ret = 0; if (ts) { if (!timespec_valid(ts)) return -EINVAL; - timeout = timespec_to_jiffies(ts); - /* - * We can be close to the next tick, add another one - * to ensure we will wait at least the time asked for. - */ - if (ts->tv_sec || ts->tv_nsec) - timeout++; + timeout = timespec_to_ktime(*ts); + to = &timeout; } /* @@ -2778,7 +2773,7 @@ int do_sigtimedwait(const sigset_t *which, siginfo_t *info, spin_lock_irq(&tsk->sighand->siglock); sig = dequeue_signal(tsk, &mask, info); - if (!sig && timeout) { + if (!sig && timeout.tv64) { /* * None ready, temporarily unblock those we're interested * while we are sleeping in so that we'll be awakened when @@ -2790,8 +2785,9 @@ int do_sigtimedwait(const sigset_t *which, siginfo_t *info, recalc_sigpending(); spin_unlock_irq(&tsk->sighand->siglock); - timeout = freezable_schedule_timeout_interruptible(timeout); - + __set_current_state(TASK_INTERRUPTIBLE); + ret = freezable_schedule_hrtimeout_range(to, tsk->timer_slack_ns, + HRTIMER_MODE_REL); spin_lock_irq(&tsk->sighand->siglock); __set_task_blocked(tsk, &tsk->real_blocked); sigemptyset(&tsk->real_blocked); @@ -2801,7 +2797,7 @@ int do_sigtimedwait(const sigset_t *which, siginfo_t *info, if (sig) return sig; - return timeout ? -EINTR : -EAGAIN; + return ret ? -EINTR : -EAGAIN; } /**