From patchwork Mon Nov 28 22:35:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 84466 Delivered-To: patches@linaro.org Received: by 10.140.20.101 with SMTP id 92csp1348551qgi; Mon, 28 Nov 2016 14:35:32 -0800 (PST) X-Received: by 10.98.89.6 with SMTP id n6mr24537484pfb.43.1480372532483; Mon, 28 Nov 2016 14:35:32 -0800 (PST) Return-Path: Received: from mail-pf0-x236.google.com (mail-pf0-x236.google.com. [2607:f8b0:400e:c00::236]) by mx.google.com with ESMTPS id 197si56799770pfy.74.2016.11.28.14.35.32 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Nov 2016 14:35:32 -0800 (PST) Received-SPF: pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c00::236 as permitted sender) client-ip=2607:f8b0:400e:c00::236; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c00::236 as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by mail-pf0-x236.google.com with SMTP id c4so27187956pfb.1 for ; Mon, 28 Nov 2016 14:35:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=rpBKLP2fxKzJ/rHecJISSmpLKQffAEd6CBFzvhcXAV4=; b=j+7KZh7seQentSQ0oyVTaXgqBR8P98Kb8jdSicbpCe2hAH1QTDrJEk6wOYRanjvUpK vk6IpFD0Ia2z6v1D5RAHGPuMaavtBmsT+NxFa9QMSHjehBcWEHKS2kCIphjolMZXM5pP w0Z8VSAzYJe6sY8zVj8ArG/tRknA9DM9PImEw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=rpBKLP2fxKzJ/rHecJISSmpLKQffAEd6CBFzvhcXAV4=; b=Z7bbrKuN5kRnS/4jG5sZSK1JgFZFAk7rxZ7qUmDoqJJFPMTTZvGdZTzcVVfLbXmdEb o8LF/f03FUniO1RRu8GwWGG0gn/tGllvu5oQvYGCceZF8upCTuwljMmyMs1v3JlXMKbF hzs531Go4r7YzyuKllZHiSgsXHl7zVCbieHv1lOB2dXUm8y/kqFTcCBgRmXECcZXZDVW 2T/dlVOPdPW/OHshftiHnE4jrbUAdKbcw+EGtc1ZZevTqcVnF/9cSQlvyfUqBcWOzoDx cRlkO1un0S9SFN/cBt0CJ+gr4Bxq9HC7eRyxovhJvtcEyerpNk8OsA/laI7RYQ//NXQx c3tA== X-Gm-Message-State: AKaTC01OwODA8OBZ3yb8UYL7fcSxd9820Pnt+3W/xMukANi/sBy33SPIf5N5nrNlzr5yybp78dc= X-Received: by 10.98.160.140 with SMTP id p12mr24163716pfl.122.1480372532171; Mon, 28 Nov 2016 14:35:32 -0800 (PST) Return-Path: Received: from localhost.localdomain ([2601:1c2:1002:83f0:4e72:b9ff:fe99:466a]) by smtp.gmail.com with ESMTPSA id r74sm89537352pfl.79.2016.11.28.14.35.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 28 Nov 2016 14:35:31 -0800 (PST) From: John Stultz To: lkml Cc: Joel Fernandes , Steven Rostedt , Thomas Gleixner , Ingo Molnar , Richard Cochran , Prarit Bhargava , John Stultz Subject: [PATCH 5/7] timekeeping: Add a fast and NMI safe boot clock Date: Mon, 28 Nov 2016 14:35:22 -0800 Message-Id: <1480372524-15181-6-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1480372524-15181-1-git-send-email-john.stultz@linaro.org> References: <1480372524-15181-1-git-send-email-john.stultz@linaro.org> From: Joel Fernandes This boot clock can be used as a tracing clock and will account for suspend time. To keep it NMI safe since we're accessing from tracing, we're not using a separate timekeeper with updates to monotonic clock and boot offset protected with seqlocks. This has the following minor side effects: (1) Its possible that a timestamp be taken after the boot offset is updated but before the timekeeper is updated. If this happens, the new boot offset is added to the old timekeeping making the clock appear to update slightly earlier: CPU 0 CPU 1 timekeeping_inject_sleeptime64() __timekeeping_inject_sleeptime(tk, delta); timestamp(); timekeeping_update(tk, TK_CLEAR_NTP...); (2) On 32-bit systems, the 64-bit boot offset (tk->offs_boot) may be partially updated. Since the tk->offs_boot update is a rare event, this should be a rare occurrence which postprocessing should be able to handle. Cc: Steven Rostedt Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Richard Cochran Cc: Prarit Bhargava Reviewed-by: Thomas Gleixner Signed-off-by: Joel Fernandes Signed-off-by: John Stultz --- include/linux/timekeeping.h | 1 + kernel/time/timekeeping.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) -- 2.7.4 diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h index 09168c5..361f8bf 100644 --- a/include/linux/timekeeping.h +++ b/include/linux/timekeeping.h @@ -249,6 +249,7 @@ static inline u64 ktime_get_raw_ns(void) extern u64 ktime_get_mono_fast_ns(void); extern u64 ktime_get_raw_fast_ns(void); +extern u64 ktime_get_boot_fast_ns(void); /* * Timespec interfaces utilizing the ktime based ones diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 37dec7e..b2286e9 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -425,6 +425,35 @@ u64 ktime_get_raw_fast_ns(void) } EXPORT_SYMBOL_GPL(ktime_get_raw_fast_ns); +/** + * ktime_get_boot_fast_ns - NMI safe and fast access to boot clock. + * + * To keep it NMI safe since we're accessing from tracing, we're not using a + * separate timekeeper with updates to monotonic clock and boot offset + * protected with seqlocks. This has the following minor side effects: + * + * (1) Its possible that a timestamp be taken after the boot offset is updated + * but before the timekeeper is updated. If this happens, the new boot offset + * is added to the old timekeeping making the clock appear to update slightly + * earlier: + * CPU 0 CPU 1 + * timekeeping_inject_sleeptime64() + * __timekeeping_inject_sleeptime(tk, delta); + * timestamp(); + * timekeeping_update(tk, TK_CLEAR_NTP...); + * + * (2) On 32-bit systems, the 64-bit boot offset (tk->offs_boot) may be + * partially updated. Since the tk->offs_boot update is a rare event, this + * should be a rare occurrence which postprocessing should be able to handle. + */ +u64 notrace ktime_get_boot_fast_ns(void) +{ + struct timekeeper *tk = &tk_core.timekeeper; + + return (ktime_get_mono_fast_ns() + ktime_to_ns(tk->offs_boot)); +} +EXPORT_SYMBOL_GPL(ktime_get_boot_fast_ns); + /* Suspend-time cycles value for halted fast timekeeper. */ static cycle_t cycles_at_suspend;