From patchwork Thu Mar 12 04:16:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 45717 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f72.google.com (mail-wg0-f72.google.com [74.125.82.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 4AD73214BF for ; Thu, 12 Mar 2015 04:16:58 +0000 (UTC) Received: by wggx13 with SMTP id x13sf9604758wgg.0 for ; Wed, 11 Mar 2015 21:16:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-unsubscribe; bh=qvBOz9cXZ/mInPMyFQ0xLzxJFi5n5rFfG1l6ElqaKrQ=; b=NLFf3RNq4bOKdGmvCUlDXz5GrxRS3d6caR1FPpsBslbpEDr9Ht9S4wWGajT4nLoC8z E7B+lvFFixUKT/5np7srduqnQdNF4YS2s7iLCeQdFVfORaao7LaCsB4MSlHjDXXfU0O/ 3fgrcAjqjEAC3OxaTeoUdv8i5tfQhjZnC2rVw/LumHgJ2VHcdrjSCwRYK5BpDLM4n7zj WlqP0BrRvv3oDhNN2TtKJ1ZIsKNqk1CXAhh6wQeYgmI6UHsEp1+ydVTEjn24kdcEjsFW kKGlqrRu/cN7UzIWpacrgtWw3AahqRsoYFuYPdPfgrg94CZySet8pm5AKctyP4zc4Bhb yyAg== X-Gm-Message-State: ALoCoQlxp5jSNtwMzAgsCKBD+QHR1/ZEs97++iKT+pCOQuRUGz27silqOoWgSWGgfpiSt60KoORb X-Received: by 10.152.27.134 with SMTP id t6mr5964981lag.5.1426133817502; Wed, 11 Mar 2015 21:16:57 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.19.234 with SMTP id i10ls221203lae.103.gmail; Wed, 11 Mar 2015 21:16:57 -0700 (PDT) X-Received: by 10.112.157.100 with SMTP id wl4mr37605749lbb.108.1426133817196; Wed, 11 Mar 2015 21:16:57 -0700 (PDT) Received: from mail-la0-f53.google.com (mail-la0-f53.google.com. [209.85.215.53]) by mx.google.com with ESMTPS id x2si1859950lbf.85.2015.03.11.21.16.57 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Mar 2015 21:16:57 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.53 as permitted sender) client-ip=209.85.215.53; Received: by labgd6 with SMTP id gd6so13219994lab.3 for ; Wed, 11 Mar 2015 21:16:57 -0700 (PDT) X-Received: by 10.112.130.39 with SMTP id ob7mr38462367lbb.32.1426133817097; Wed, 11 Mar 2015 21:16:57 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.112.35.133 with SMTP id h5csp3173223lbj; Wed, 11 Mar 2015 21:16:56 -0700 (PDT) X-Received: by 10.67.5.230 with SMTP id cp6mr45936290pad.55.1426133809475; Wed, 11 Mar 2015 21:16:49 -0700 (PDT) Received: from mail-pd0-f171.google.com (mail-pd0-f171.google.com. [209.85.192.171]) by mx.google.com with ESMTPS id cw2si10589646pad.178.2015.03.11.21.16.48 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Mar 2015 21:16:49 -0700 (PDT) Received-SPF: pass (google.com: domain of john.stultz@linaro.org designates 209.85.192.171 as permitted sender) client-ip=209.85.192.171; Received: by pdbfl12 with SMTP id fl12so16732626pdb.5 for ; Wed, 11 Mar 2015 21:16:48 -0700 (PDT) X-Received: by 10.66.121.161 with SMTP id ll1mr49074809pab.131.1426133808579; Wed, 11 Mar 2015 21:16:48 -0700 (PDT) Received: from localhost.localdomain (c-67-170-153-23.hsd1.or.comcast.net. [67.170.153.23]) by mx.google.com with ESMTPSA id x1sm3070268pdp.1.2015.03.11.21.16.47 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 11 Mar 2015 21:16:47 -0700 (PDT) From: John Stultz To: lkml Cc: John Stultz , Dave Jones , Linus Torvalds , Thomas Gleixner , Richard Cochran , Prarit Bhargava , Stephen Boyd , Ingo Molnar , Peter Zijlstra Subject: [PATCH 04/12] time: Add debugging checks to warn if we see delays Date: Wed, 11 Mar 2015 21:16:32 -0700 Message-Id: <1426133800-29329-5-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1426133800-29329-1-git-send-email-john.stultz@linaro.org> References: <1426133800-29329-1-git-send-email-john.stultz@linaro.org> X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: john.stultz@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.53 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Recently there's been some request for better sanity checking in the time code, so that its more clear when something is going wrong since timekeeping issues could manifest in a large number of strange ways with various subsystems. Thus, this patch adds some extra infrastructure to add a check update_wall_time() to print warnings if we see the call delayed beyond the max_cycles overflow point, or beyond the clocksource max_idle_ns value which is currently 50% of the overflow point. This extra infrastructure is conditionalized behind a new CONFIG_DEBUG_TIMEKEEPING option also added in this patch. Tested this a bit by halting qemu for specified lengths of time to trigger the warnings. Cc: Dave Jones Cc: Linus Torvalds Cc: Thomas Gleixner Cc: Richard Cochran Cc: Prarit Bhargava Cc: Stephen Boyd Cc: Ingo Molnar Cc: Peter Zijlstra Signed-off-by: John Stultz --- kernel/time/jiffies.c | 1 + kernel/time/timekeeping.c | 27 +++++++++++++++++++++++++++ lib/Kconfig.debug | 12 ++++++++++++ 3 files changed, 40 insertions(+) diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index a6a5bf5..7e41390 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -71,6 +71,7 @@ static struct clocksource clocksource_jiffies = { .mask = 0xffffffff, /*32bits*/ .mult = NSEC_PER_JIFFY << JIFFIES_SHIFT, /* details above */ .shift = JIFFIES_SHIFT, + .max_cycles = 10, }; __cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock); diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 91db941..882ba5b 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -118,6 +118,30 @@ static inline void tk_update_sleep_time(struct timekeeper *tk, ktime_t delta) tk->offs_boot = ktime_add(tk->offs_boot, delta); } +#ifdef CONFIG_DEBUG_TIMEKEEPING +static void timekeeping_check_update(struct timekeeper *tk, cycle_t offset) +{ + + cycle_t max_cycles = tk->tkr.clock->max_cycles; + const char *name = tk->tkr.clock->name; + + if (offset > max_cycles) { + printk_deferred("ERROR: cycle offset (%lld) is larger than allowed %s max_cycles (%lld)\n", + offset, name, max_cycles); + } else { + if (offset > (max_cycles >> 1)) { + printk_deferred("WARNING: cycle offset (%lld) is past the %s 50%% safety margin (%lld)\n", + offset, name, max_cycles>>1); + } + } +} +#else +static inline +void timekeeping_check_update(struct timekeeper *tk, cycle_t offset) +{ +} +#endif + /** * tk_setup_internals - Set up internals to use clocksource clock. * @@ -1630,6 +1654,9 @@ void update_wall_time(void) if (offset < real_tk->cycle_interval) goto out; + /* Do some additional sanity checking */ + timekeeping_check_update(real_tk, offset); + /* * With NO_HZ we may have to accumulate many cycle_intervals * (think "ticks") worth of time at once. To do this efficiently, diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index c5cefb3..408d32e 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -865,6 +865,18 @@ config SCHED_STACK_END_CHECK data corruption or a sporadic crash at a later stage once the region is examined. The runtime overhead introduced is minimal. +config DEBUG_TIMEKEEPING + bool "Enable extra timekeeping sanity checking" + help + This option will enable additional timekeeping sanity checks + which may be helpful when diagnosing issues where timekeeping + problems are suspected. + + This may include checks in the timekeeping hotpaths, so this + option may have a performance impact to some workloads. + + If unsure, say N. + config TIMER_STATS bool "Collect kernel timers statistics" depends on DEBUG_KERNEL && PROC_FS