From: tip-bot for Daniel Thompson <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: catalin.marinas@arm.com, tglx@linutronix.de, will.deacon@arm.com,
daniel.thompson@linaro.org, mingo@kernel.org,
peterz@infradead.org, linux@arm.linux.org.uk,
linux-kernel@vger.kernel.org, hpa@zytor.com,
john.stultz@linaro.org, sboyd@codeaurora.org
Subject: [tip:timers/core] timers, sched/clock: Remove suspend from clock_read_data()
Date: Fri, 27 Mar 2015 00:42:07 -0700 [thread overview]
Message-ID: <tip-13dbeb384d2d3aa555ea48d511e8cb110bd172e0@git.kernel.org> (raw)
In-Reply-To: <1427397806-20889-4-git-send-email-john.stultz@linaro.org>
Commit-ID: 13dbeb384d2d3aa555ea48d511e8cb110bd172e0
Gitweb: http://git.kernel.org/tip/13dbeb384d2d3aa555ea48d511e8cb110bd172e0
Author: Daniel Thompson <daniel.thompson@linaro.org>
AuthorDate: Thu, 26 Mar 2015 12:23:24 -0700
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Fri, 27 Mar 2015 08:33:58 +0100
timers, sched/clock: Remove suspend from clock_read_data()
Currently cd.read_data.suspended is read by the hotpath function
sched_clock(). This variable need not be accessed on the
hotpath. In fact, once it is removed, we can remove the
conditional branches from sched_clock() and install a dummy
read_sched_clock function to suspend the clock.
The new master copy of the function pointer
(actual_read_sched_clock) is introduced and is used for all
reads of the clock hardware except those within sched_clock
itself.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Will Deacon <will.deacon@arm.com>
Link: http://lkml.kernel.org/r/1427397806-20889-4-git-send-email-john.stultz@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
kernel/time/sched_clock.c | 40 +++++++++++++++++++++++++---------------
1 file changed, 25 insertions(+), 15 deletions(-)
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c
index 872e068..52ea5d9 100644
--- a/kernel/time/sched_clock.c
+++ b/kernel/time/sched_clock.c
@@ -28,10 +28,9 @@
* @read_sched_clock: Current clock source (or dummy source when suspended)
* @mult: Multipler for scaled math conversion
* @shift: Shift value for scaled math conversion
- * @suspended: Flag to indicate if the clock is suspended (stopped)
*
* Care must be taken when updating this structure; it is read by
- * some very hot code paths. It occupies <=48 bytes and, when combined
+ * some very hot code paths. It occupies <=40 bytes and, when combined
* with the seqcount used to synchronize access, comfortably fits into
* a 64 byte cache line.
*/
@@ -42,7 +41,6 @@ struct clock_read_data {
u64 (*read_sched_clock)(void);
u32 mult;
u32 shift;
- bool suspended;
};
/**
@@ -64,6 +62,7 @@ struct clock_data {
struct clock_read_data read_data;
ktime_t wrap_kt;
unsigned long rate;
+ u64 (*actual_read_sched_clock)(void);
};
static struct hrtimer sched_clock_timer;
@@ -83,6 +82,8 @@ static u64 notrace jiffy_sched_clock_read(void)
static struct clock_data cd ____cacheline_aligned = {
.read_data = { .mult = NSEC_PER_SEC / HZ,
.read_sched_clock = jiffy_sched_clock_read, },
+ .actual_read_sched_clock = jiffy_sched_clock_read,
+
};
static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift)
@@ -99,12 +100,9 @@ unsigned long long notrace sched_clock(void)
do {
seq = raw_read_seqcount_begin(&cd.seq);
- res = rd->epoch_ns;
- if (!rd->suspended) {
- cyc = rd->read_sched_clock();
- cyc = (cyc - rd->epoch_cyc) & rd->sched_clock_mask;
- res += cyc_to_ns(cyc, rd->mult, rd->shift);
- }
+ cyc = (rd->read_sched_clock() - rd->epoch_cyc) &
+ rd->sched_clock_mask;
+ res = rd->epoch_ns + cyc_to_ns(cyc, rd->mult, rd->shift);
} while (read_seqcount_retry(&cd.seq, seq));
return res;
@@ -120,7 +118,7 @@ static void notrace update_sched_clock(void)
u64 ns;
struct clock_read_data *rd = &cd.read_data;
- cyc = rd->read_sched_clock();
+ cyc = cd.actual_read_sched_clock();
ns = rd->epoch_ns +
cyc_to_ns((cyc - rd->epoch_cyc) & rd->sched_clock_mask,
rd->mult, rd->shift);
@@ -166,10 +164,11 @@ void __init sched_clock_register(u64 (*read)(void), int bits,
/* update epoch for new counter and update epoch_ns from old counter*/
new_epoch = read();
- cyc = rd->read_sched_clock();
+ cyc = cd.actual_read_sched_clock();
ns = rd->epoch_ns +
cyc_to_ns((cyc - rd->epoch_cyc) & rd->sched_clock_mask,
rd->mult, rd->shift);
+ cd.actual_read_sched_clock = read;
raw_write_seqcount_begin(&cd.seq);
rd->read_sched_clock = read;
@@ -209,7 +208,7 @@ void __init sched_clock_postinit(void)
* If no sched_clock function has been provided at that point,
* make it the final one one.
*/
- if (cd.read_data.read_sched_clock == jiffy_sched_clock_read)
+ if (cd.actual_read_sched_clock == jiffy_sched_clock_read)
sched_clock_register(jiffy_sched_clock_read, BITS_PER_LONG, HZ);
update_sched_clock();
@@ -223,13 +222,24 @@ void __init sched_clock_postinit(void)
hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL);
}
+/*
+ * Clock read function for use when the clock is suspended.
+ *
+ * This function makes it appear to sched_clock() as if the clock
+ * stopped counting at its last update.
+ */
+static u64 notrace suspended_sched_clock_read(void)
+{
+ return cd.read_data.epoch_cyc;
+}
+
static int sched_clock_suspend(void)
{
struct clock_read_data *rd = &cd.read_data;
update_sched_clock();
hrtimer_cancel(&sched_clock_timer);
- rd->suspended = true;
+ rd->read_sched_clock = suspended_sched_clock_read;
return 0;
}
@@ -237,9 +247,9 @@ static void sched_clock_resume(void)
{
struct clock_read_data *rd = &cd.read_data;
- rd->epoch_cyc = rd->read_sched_clock();
+ rd->epoch_cyc = cd.actual_read_sched_clock();
hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL);
- rd->suspended = false;
+ rd->read_sched_clock = cd.actual_read_sched_clock;
}
static struct syscore_ops sched_clock_ops = {
next prev parent reply other threads:[~2015-03-27 7:43 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-26 19:23 [PATCH 0/5 (rebase resend)] Arch-generic sched_clock NMI safety and optimizations for -tip John Stultz
2015-03-26 19:23 ` [PATCH 1/5] sched_clock: Match scope of read and write seqcounts John Stultz
2015-03-27 7:41 ` [tip:timers/core] timers, sched/clock: " tip-bot for Daniel Thompson
2015-03-26 19:23 ` [PATCH 2/5] sched_clock: Optimize cache line usage John Stultz
2015-03-27 7:41 ` [tip:timers/core] timers, sched/clock: " tip-bot for Daniel Thompson
2015-03-26 19:23 ` [PATCH 3/5] sched_clock: Remove suspend from clock_read_data John Stultz
2015-03-27 7:42 ` tip-bot for Daniel Thompson [this message]
2015-03-26 19:23 ` [PATCH 4/5] sched_clock: Remove redundant notrace from update function John Stultz
2015-03-27 7:42 ` [tip:timers/core] timers, sched/clock: " tip-bot for Daniel Thompson
2015-03-26 19:23 ` [PATCH 5/5] sched_clock: Avoid deadlock during read from NMI John Stultz
2015-03-27 7:42 ` [tip:timers/core] timers, sched/clock: " tip-bot for Daniel Thompson
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=tip-13dbeb384d2d3aa555ea48d511e8cb110bd172e0@git.kernel.org \
--to=tipbot@zytor.com \
--cc=catalin.marinas@arm.com \
--cc=daniel.thompson@linaro.org \
--cc=hpa@zytor.com \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=sboyd@codeaurora.org \
--cc=tglx@linutronix.de \
--cc=will.deacon@arm.com \
/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.