From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754659AbdHZOOm (ORCPT ); Sat, 26 Aug 2017 10:14:42 -0400 Received: from terminus.zytor.com ([65.50.211.136]:54447 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754587AbdHZOOl (ORCPT ); Sat, 26 Aug 2017 10:14:41 -0400 Date: Sat, 26 Aug 2017 07:10:39 -0700 From: tip-bot for John Stultz Message-ID: Cc: prarit@redhat.com, hpa@zytor.com, kevin.brodsky@arm.com, tglx@linutronix.de, mingo@kernel.org, richardcochran@gmail.com, chris@chris-wilson.co.uk, john.stultz@linaro.org, will.deacon@arm.com, stephen.boyd@linaro.org, mlichvar@redhat.com, linux-kernel@vger.kernel.org, danielmentz@google.com Reply-To: hpa@zytor.com, prarit@redhat.com, tglx@linutronix.de, mingo@kernel.org, richardcochran@gmail.com, kevin.brodsky@arm.com, mlichvar@redhat.com, john.stultz@linaro.org, chris@chris-wilson.co.uk, will.deacon@arm.com, stephen.boyd@linaro.org, linux-kernel@vger.kernel.org, danielmentz@google.com In-Reply-To: <1503701824-1645-1-git-send-email-john.stultz@linaro.org> References: <1503701824-1645-1-git-send-email-john.stultz@linaro.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:timers/urgent] time: Fix ktime_get_raw() incorrect base accumulation Git-Commit-ID: 0bcdc0987cce9880436b70836c6a92bb8e744fd1 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: 0bcdc0987cce9880436b70836c6a92bb8e744fd1 Gitweb: http://git.kernel.org/tip/0bcdc0987cce9880436b70836c6a92bb8e744fd1 Author: John Stultz AuthorDate: Fri, 25 Aug 2017 15:57:04 -0700 Committer: Thomas Gleixner CommitDate: Sat, 26 Aug 2017 16:06:12 +0200 time: Fix ktime_get_raw() incorrect base accumulation In comqit fc6eead7c1e2 ("time: Clean up CLOCK_MONOTONIC_RAW time handling"), the following code got mistakenly added to the update of the raw timekeeper: /* Update the monotonic raw base */ seconds = tk->raw_sec; nsec = (u32)(tk->tkr_raw.xtime_nsec >> tk->tkr_raw.shift); tk->tkr_raw.base = ns_to_ktime(seconds * NSEC_PER_SEC + nsec); Which adds the raw_sec value and the shifted down raw xtime_nsec to the base value. But the read function adds the shifted down tk->tkr_raw.xtime_nsec value another time, The result of this is that ktime_get_raw() users (which are all internal users) see the raw time move faster then it should (the rate at which can vary with the current size of tkr_raw.xtime_nsec), which has resulted in at least problems with graphics rendering performance. The change tried to match the monotonic base update logic: seconds = (u64)(tk->xtime_sec + tk->wall_to_monotonic.tv_sec); nsec = (u32) tk->wall_to_monotonic.tv_nsec; tk->tkr_mono.base = ns_to_ktime(seconds * NSEC_PER_SEC + nsec); Which adds the wall_to_monotonic.tv_nsec value, but not the tk->tkr_mono.xtime_nsec value to the base. To fix this, simplify the tkr_raw.base accumulation to only accumulate the raw_sec portion, and do not include the tkr_raw.xtime_nsec portion, which will be added at read time. Fixes: fc6eead7c1e2 ("time: Clean up CLOCK_MONOTONIC_RAW time handling") Reported-and-tested-by: Chris Wilson Signed-off-by: John Stultz Signed-off-by: Thomas Gleixner Cc: Prarit Bhargava Cc: Kevin Brodsky Cc: Richard Cochran Cc: Stephen Boyd Cc: Will Deacon Cc: Miroslav Lichvar Cc: Daniel Mentz Link: http://lkml.kernel.org/r/1503701824-1645-1-git-send-email-john.stultz@linaro.org --- kernel/time/timekeeping.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index cedafa0..7e7e61c 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -637,9 +637,7 @@ static inline void tk_update_ktime_data(struct timekeeper *tk) tk->ktime_sec = seconds; /* Update the monotonic raw base */ - seconds = tk->raw_sec; - nsec = (u32)(tk->tkr_raw.xtime_nsec >> tk->tkr_raw.shift); - tk->tkr_raw.base = ns_to_ktime(seconds * NSEC_PER_SEC + nsec); + tk->tkr_raw.base = ns_to_ktime(tk->raw_sec * NSEC_PER_SEC); } /* must hold timekeeper_lock */