From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755235AbcK2SaV (ORCPT ); Tue, 29 Nov 2016 13:30:21 -0500 Received: from terminus.zytor.com ([198.137.202.10]:41506 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750922AbcK2SaN (ORCPT ); Tue, 29 Nov 2016 13:30:13 -0500 Date: Tue, 29 Nov 2016 10:28:31 -0800 From: tip-bot for Thomas Gleixner Message-ID: Cc: yinghai@kernel.org, bp@alien8.de, linux-kernel@vger.kernel.org, hpa@zytor.com, tglx@linutronix.de, peterz@infradead.org, mingo@kernel.org Reply-To: mingo@kernel.org, peterz@infradead.org, tglx@linutronix.de, hpa@zytor.com, linux-kernel@vger.kernel.org, bp@alien8.de, yinghai@kernel.org In-Reply-To: <20161119134017.574838461@linutronix.de> References: <20161119134017.574838461@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/timers] x86/tsc: Detect random warps Git-Commit-ID: bec8520dca0d27c1ddac703f9d0a78275ca2603e 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: bec8520dca0d27c1ddac703f9d0a78275ca2603e Gitweb: http://git.kernel.org/tip/bec8520dca0d27c1ddac703f9d0a78275ca2603e Author: Thomas Gleixner AuthorDate: Sat, 19 Nov 2016 13:47:35 +0000 Committer: Thomas Gleixner CommitDate: Tue, 29 Nov 2016 19:23:15 +0100 x86/tsc: Detect random warps If time warps can be observed then they should only ever be observed on one CPU. If they are observed on both CPUs then the system is completely hosed. Add a check for this condition and notify if it happens. Signed-off-by: Thomas Gleixner Reviewed-by: Ingo Molnar Cc: Peter Zijlstra Cc: Yinghai Lu Cc: Borislav Petkov Link: http://lkml.kernel.org/r/20161119134017.574838461@linutronix.de Signed-off-by: Thomas Gleixner --- arch/x86/kernel/tsc_sync.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 78083bf..40f8edd 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c @@ -37,6 +37,7 @@ static arch_spinlock_t sync_lock = __ARCH_SPIN_LOCK_UNLOCKED; static cycles_t last_tsc; static cycles_t max_warp; static int nr_warps; +static int random_warps; /* * TSC-warp measurement loop running on both CPUs. This is not called @@ -45,7 +46,7 @@ static int nr_warps; static void check_tsc_warp(unsigned int timeout) { cycles_t start, now, prev, end; - int i; + int i, cur_warps = 0; start = rdtsc_ordered(); /* @@ -85,7 +86,14 @@ static void check_tsc_warp(unsigned int timeout) if (unlikely(prev > now)) { arch_spin_lock(&sync_lock); max_warp = max(max_warp, prev - now); + /* + * Check whether this bounces back and forth. Only + * one CPU should observe time going backwards. + */ + if (cur_warps != nr_warps) + random_warps++; nr_warps++; + cur_warps = nr_warps; arch_spin_unlock(&sync_lock); } } @@ -160,6 +168,8 @@ void check_tsc_sync_source(int cpu) smp_processor_id(), cpu); pr_warning("Measured %Ld cycles TSC warp between CPUs, " "turning off TSC clock.\n", max_warp); + if (random_warps) + pr_warning("TSC warped randomly between CPUs\n"); mark_tsc_unstable("check_tsc_sync_source failed"); } else { pr_debug("TSC synchronization [CPU#%d -> CPU#%d]: passed\n", @@ -170,6 +180,7 @@ void check_tsc_sync_source(int cpu) * Reset it - just in case we boot another CPU later: */ atomic_set(&start_count, 0); + random_warps = 0; nr_warps = 0; max_warp = 0; last_tsc = 0;