From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966420AbbDVTO6 (ORCPT ); Wed, 22 Apr 2015 15:14:58 -0400 Received: from terminus.zytor.com ([198.137.202.10]:41733 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966356AbbDVTO4 (ORCPT ); Wed, 22 Apr 2015 15:14:56 -0400 Date: Wed, 22 Apr 2015 12:14:23 -0700 From: tip-bot for Thomas Gleixner Message-ID: Cc: viresh.kumar@linaro.org, preeti@linux.vnet.ibm.com, fweisbec@gmail.com, tglx@linutronix.de, mingo@kernel.org, hpa@zytor.com, peterz@infradead.org, mtosatti@redhat.com, linux-kernel@vger.kernel.org Reply-To: linux-kernel@vger.kernel.org, peterz@infradead.org, mtosatti@redhat.com, hpa@zytor.com, mingo@kernel.org, tglx@linutronix.de, fweisbec@gmail.com, preeti@linux.vnet.ibm.com, viresh.kumar@linaro.org In-Reply-To: <20150414203503.580273114@linutronix.de> References: <20150414203503.580273114@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:timers/core] hrtimer: Avoid locking in hrtimer_cancel() if timer not active Git-Commit-ID: 19d9f4225dd6a47fca430f15eeae345ceb95c301 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: 19d9f4225dd6a47fca430f15eeae345ceb95c301 Gitweb: http://git.kernel.org/tip/19d9f4225dd6a47fca430f15eeae345ceb95c301 Author: Thomas Gleixner AuthorDate: Tue, 14 Apr 2015 21:09:25 +0000 Committer: Thomas Gleixner CommitDate: Wed, 22 Apr 2015 17:06:52 +0200 hrtimer: Avoid locking in hrtimer_cancel() if timer not active We can do a lockless check for hrtimer_active before actually taking the lock in hrtimer[_try_to]_cancel. This is useful for hotpath users like nanosleep as they avoid the lock dance when the timer has expired. This is safe because active is true when the timer is enqueued or the callback is running. Taking the hrtimer base lock does not protect against concurrent hrtimer_start calls, the callsite has to do the proper serialization itself. Signed-off-by: Thomas Gleixner Acked-by: Peter Zijlstra Cc: Preeti U Murthy Cc: Viresh Kumar Cc: Marcelo Tosatti Cc: Frederic Weisbecker Link: http://lkml.kernel.org/r/20150414203503.580273114@linutronix.de Signed-off-by: Thomas Gleixner --- kernel/time/hrtimer.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index beab02d..3bac942 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -991,6 +991,15 @@ int hrtimer_try_to_cancel(struct hrtimer *timer) unsigned long flags; int ret = -1; + /* + * Check lockless first. If the timer is not active (neither + * enqueued nor running the callback, nothing to do here. The + * base lock does not serialize against a concurrent enqueue, + * so we can avoid taking it. + */ + if (!hrtimer_active(timer)) + return 0; + base = lock_hrtimer_base(timer, &flags); if (!hrtimer_callback_running(timer))