From: robherring2@gmail.com (Rob Herring)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] clocksource: arm_arch_timer: add boot and suspend sched_clock offset
Date: Thu, 18 Apr 2013 14:30:10 -0500 [thread overview]
Message-ID: <1366313410-16692-2-git-send-email-robherring2@gmail.com> (raw)
In-Reply-To: <1366313410-16692-1-git-send-email-robherring2@gmail.com>
From: Rob Herring <rob.herring@calxeda.com>
Commit 023796b (ARM: arch_timer: use full 64-bit counter for sched_clock)
fails to ensure sched_clock always starts at time 0 and counting is
suspended during suspend. arm64 sched_clock support also has the same
issues. This fixes all architected timer users by maintaining an initial
offset which is updated on resume.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
---
arch/arm/kernel/arch_timer.c | 1 +
drivers/clocksource/arm_arch_timer.c | 26 +++++++++++++++++++++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/arch/arm/kernel/arch_timer.c b/arch/arm/kernel/arch_timer.c
index df6825e..9a517fe 100644
--- a/arch/arm/kernel/arch_timer.c
+++ b/arch/arm/kernel/arch_timer.c
@@ -42,5 +42,6 @@ int __init arch_timer_arch_init(void)
arch_timer_delay_timer_register();
sched_clock_func = arch_timer_sched_clock;
+
return 0;
}
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index 17ed8e4..cc0bd67 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/of_irq.h>
#include <linux/io.h>
+#include <linux/syscore_ops.h>
#include <asm/arch_timer.h>
#include <asm/virt.h>
@@ -267,14 +268,34 @@ static struct notifier_block arch_timer_cpu_nb __cpuinitdata = {
};
static u64 sched_clock_mult __read_mostly;
+static u64 arch_timer_suspend_cyc;
+static u64 arch_timer_sched_clock_offset;
unsigned long long notrace arch_timer_sched_clock(void)
{
- return arch_timer_read_counter() * sched_clock_mult;
+ u64 cyc = arch_timer_read_counter() - arch_timer_sched_clock_offset;
+ return cyc * sched_clock_mult;
}
unsigned long long sched_clock(void) \
__attribute__((weak, alias("arch_timer_sched_clock")));
+static int arch_timer_suspend(void)
+{
+ arch_timer_suspend_cyc = arch_timer_read_counter();
+ return 0;
+}
+
+static void arch_timer_resume(void)
+{
+ arch_timer_sched_clock_offset +=
+ arch_timer_read_counter() - arch_timer_suspend_cyc;
+}
+
+static struct syscore_ops arch_timer_ops = {
+ .suspend = arch_timer_suspend,
+ .resume = arch_timer_resume,
+};
+
static int __init arch_timer_register(void)
{
int err;
@@ -332,6 +353,9 @@ static int __init arch_timer_register(void)
pr_info("sched_clock: ARM arch timer >56 bits at %ukHz, resolution %lluns\n",
arch_timer_rate / 1000, sched_clock_mult);
+ arch_timer_sched_clock_offset = arch_timer_read_counter();
+ register_syscore_ops(&arch_timer_ops);
+
return 0;
out_free_irq:
--
1.7.10.4
WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robherring2@gmail.com>
To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org
Cc: arm@kernel.org, Rob Herring <rob.herring@calxeda.com>,
Russell King <linux@arm.linux.org.uk>,
John Stultz <john.stultz@linaro.org>,
Thomas Gleixner <tglx@linutronix.de>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>,
Stephen Boyd <sboyd@codeaurora.org>
Subject: [PATCH 2/2] clocksource: arm_arch_timer: add boot and suspend sched_clock offset
Date: Thu, 18 Apr 2013 14:30:10 -0500 [thread overview]
Message-ID: <1366313410-16692-2-git-send-email-robherring2@gmail.com> (raw)
In-Reply-To: <1366313410-16692-1-git-send-email-robherring2@gmail.com>
From: Rob Herring <rob.herring@calxeda.com>
Commit 023796b (ARM: arch_timer: use full 64-bit counter for sched_clock)
fails to ensure sched_clock always starts at time 0 and counting is
suspended during suspend. arm64 sched_clock support also has the same
issues. This fixes all architected timer users by maintaining an initial
offset which is updated on resume.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
---
arch/arm/kernel/arch_timer.c | 1 +
drivers/clocksource/arm_arch_timer.c | 26 +++++++++++++++++++++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/arch/arm/kernel/arch_timer.c b/arch/arm/kernel/arch_timer.c
index df6825e..9a517fe 100644
--- a/arch/arm/kernel/arch_timer.c
+++ b/arch/arm/kernel/arch_timer.c
@@ -42,5 +42,6 @@ int __init arch_timer_arch_init(void)
arch_timer_delay_timer_register();
sched_clock_func = arch_timer_sched_clock;
+
return 0;
}
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index 17ed8e4..cc0bd67 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/of_irq.h>
#include <linux/io.h>
+#include <linux/syscore_ops.h>
#include <asm/arch_timer.h>
#include <asm/virt.h>
@@ -267,14 +268,34 @@ static struct notifier_block arch_timer_cpu_nb __cpuinitdata = {
};
static u64 sched_clock_mult __read_mostly;
+static u64 arch_timer_suspend_cyc;
+static u64 arch_timer_sched_clock_offset;
unsigned long long notrace arch_timer_sched_clock(void)
{
- return arch_timer_read_counter() * sched_clock_mult;
+ u64 cyc = arch_timer_read_counter() - arch_timer_sched_clock_offset;
+ return cyc * sched_clock_mult;
}
unsigned long long sched_clock(void) \
__attribute__((weak, alias("arch_timer_sched_clock")));
+static int arch_timer_suspend(void)
+{
+ arch_timer_suspend_cyc = arch_timer_read_counter();
+ return 0;
+}
+
+static void arch_timer_resume(void)
+{
+ arch_timer_sched_clock_offset +=
+ arch_timer_read_counter() - arch_timer_suspend_cyc;
+}
+
+static struct syscore_ops arch_timer_ops = {
+ .suspend = arch_timer_suspend,
+ .resume = arch_timer_resume,
+};
+
static int __init arch_timer_register(void)
{
int err;
@@ -332,6 +353,9 @@ static int __init arch_timer_register(void)
pr_info("sched_clock: ARM arch timer >56 bits at %ukHz, resolution %lluns\n",
arch_timer_rate / 1000, sched_clock_mult);
+ arch_timer_sched_clock_offset = arch_timer_read_counter();
+ register_syscore_ops(&arch_timer_ops);
+
return 0;
out_free_irq:
--
1.7.10.4
next prev parent reply other threads:[~2013-04-18 19:30 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-18 19:30 [PATCH 1/2] clocksource: arm_arch_timer: unify sched_clock init Rob Herring
2013-04-18 19:30 ` Rob Herring
2013-04-18 19:30 ` Rob Herring [this message]
2013-04-18 19:30 ` [PATCH 2/2] clocksource: arm_arch_timer: add boot and suspend sched_clock offset Rob Herring
2013-04-19 14:46 ` Catalin Marinas
2013-04-19 14:46 ` Catalin Marinas
2013-04-19 0:00 ` [PATCH 1/2] clocksource: arm_arch_timer: unify sched_clock init Stephen Boyd
2013-04-19 0:00 ` Stephen Boyd
2013-04-19 1:37 ` Rob Herring
2013-04-19 1:37 ` Rob Herring
2013-04-19 17:34 ` Stephen Boyd
2013-04-19 17:34 ` Stephen Boyd
2013-04-20 0:29 ` [PATCH 0/4] ARM 64 bit sched_clock take #2 Stephen Boyd
2013-04-20 0:29 ` Stephen Boyd
2013-04-20 0:29 ` [PATCH 1/4] ARM: sched_clock: Remove unused needs_suspend member Stephen Boyd
2013-04-20 0:29 ` Stephen Boyd
2013-04-20 0:29 ` [PATCH 2/4] ARM: sched_clock: Return suspended count earlier Stephen Boyd
2013-04-20 0:29 ` Stephen Boyd
2013-04-20 0:29 ` [PATCH 3/4] ARM: sched_clock: Add support for >32 bit sched_clock Stephen Boyd
2013-04-20 0:29 ` Stephen Boyd
2013-04-20 0:29 ` Stephen Boyd
2013-04-22 10:48 ` Will Deacon
2013-04-22 10:48 ` Will Deacon
2013-04-22 15:35 ` Stephen Boyd
2013-04-22 15:35 ` Stephen Boyd
2013-04-20 0:29 ` [PATCH 4/4] ARM: arch_timer: Move to setup_sched_clock_64() Stephen Boyd
2013-04-20 0:29 ` Stephen Boyd
2013-04-22 15:16 ` [PATCH 0/4] ARM 64 bit sched_clock take #2 Arnd Bergmann
2013-04-22 15:16 ` Arnd Bergmann
2013-04-22 15:34 ` Mark Rutland
2013-04-22 15:34 ` Mark Rutland
2013-04-22 15:36 ` Stephen Boyd
2013-04-22 15:36 ` Stephen Boyd
2013-04-22 15:51 ` Mark Rutland
2013-04-22 15:51 ` Mark Rutland
2013-04-22 15:51 ` Mark Rutland
2013-04-22 17:00 ` John Stultz
2013-04-22 17:00 ` John Stultz
2013-04-22 20:46 ` Rob Herring
2013-04-22 20:46 ` Rob Herring
2013-04-22 20:46 ` Rob Herring
2013-04-23 16:34 ` Stephen Boyd
2013-04-23 16:34 ` Stephen Boyd
2013-05-01 0:54 ` [PATCH 5/4] sched: Make ARM's sched_clock generic for all architectures Stephen Boyd
2013-05-01 0:54 ` Stephen Boyd
2013-05-01 0:54 ` [PATCH 6/4] arm64: Move to generic sched_clock infrastructure Stephen Boyd
2013-05-01 0:54 ` Stephen Boyd
2013-05-01 9:11 ` Catalin Marinas
2013-05-01 9:11 ` Catalin Marinas
2013-05-01 14:44 ` Christopher Covington
2013-05-01 14:44 ` Christopher Covington
2013-05-31 20:40 ` [PATCH 5/4] sched: Make ARM's sched_clock generic for all architectures John Stultz
2013-05-31 20:40 ` John Stultz
2013-05-31 22:13 ` Stephen Boyd
2013-05-31 22:13 ` Stephen Boyd
2013-05-31 23:50 ` John Stultz
2013-05-31 23:50 ` John Stultz
2013-04-19 14:45 ` [PATCH 1/2] clocksource: arm_arch_timer: unify sched_clock init Catalin Marinas
2013-04-19 14:45 ` Catalin Marinas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1366313410-16692-2-git-send-email-robherring2@gmail.com \
--to=robherring2@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.