From: Paul Mundt <lethal@linux-sh.org>
To: Daniel Walker <dwalker@fifo99.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Linus Walleij <linus.ml.walleij@gmail.com>,
Ingo Molnar <mingo@elte.hu>, Andrew Victor <linux@maxim.org.za>,
Haavard Skinnemoen <hskinnemoen@atmel.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, linux-sh@vger.kernel.org,
linux-arm-kernel@lists.arm.linux.org.uk,
John Stultz <johnstul@linux.vnet.ibm.com>
Subject: Re: [PATCH] sched: Support current clocksource handling in fallback sched_clock().
Date: Thu, 28 May 2009 09:19:36 +0000 [thread overview]
Message-ID: <20090528091936.GA27545@linux-sh.org> (raw)
In-Reply-To: <1243441525.28705.19.camel@desktop>
On Wed, May 27, 2009 at 09:25:25AM -0700, Daniel Walker wrote:
> On Wed, 2009-05-27 at 09:15 +0900, Paul Mundt wrote:
>
> > unsigned long long __attribute__((weak)) sched_clock(void)
> > {
> > + /*
> > + * Use the current clocksource when it becomes available later in
> > + * the boot process, and ensure that it is usable for sched_clock().
> > + */
> > + if (clock && (clock->flags & CLOCK_SOURCE_USE_FOR_SCHED_CLOCK))
> > + return cyc2ns(clock, clocksource_read(clock));
> > +
> > + /* Otherwise just fall back on jiffies */
> > return (unsigned long long)(jiffies - INITIAL_JIFFIES)
>
> Do we really need all this complexity in a fast path? the jiffies
> clocksource is static and always ready. Could we instead remove the
> usage of "clock" and create a new pointer called "sched_clocksource" and
> initialize it to the jiffies clock, and allow the clocksource management
> code to update that new pointer based on the
> CLOCK_SOURCE_USE_FOR_SCHED_CLOCK flag when new clocksources are
> registered/removed/marked unstable etc..
>
> that would eliminate all the code in sched_clock except one line,
>
> unsigned long long __attribute__((weak)) sched_clock(void)
> {
> return cyc2ns(sched_clocksource, clocksource_read(sched_clocksource));
> }
>
Ok, there were some ordering problems with the early platform code, but
I've played with this a bit more and got it to the point where this now
also works. I can live with this over the v3 version if people prefer
this approach instead.
--
include/linux/clocksource.h | 4 +++-
kernel/sched_clock.c | 4 ++--
kernel/time/clocksource.c | 4 ++++
kernel/time/jiffies.c | 2 +-
4 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index c56457c..2109940 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -202,7 +202,8 @@ struct clocksource {
#endif
};
-extern struct clocksource *clock; /* current clocksource */
+extern struct clocksource *clock; /* current clocksource */
+extern struct clocksource *sched_clocksource; /* sched_clock() clocksource */
/*
* Clock source flags bits::
@@ -212,6 +213,7 @@ extern struct clocksource *clock; /* current clocksource */
#define CLOCK_SOURCE_WATCHDOG 0x10
#define CLOCK_SOURCE_VALID_FOR_HRES 0x20
+#define CLOCK_SOURCE_USE_FOR_SCHED_CLOCK 0x40
/* simplify initialization of mask field */
#define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1)
diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
index e1d16c9..c06c285 100644
--- a/kernel/sched_clock.c
+++ b/kernel/sched_clock.c
@@ -30,6 +30,7 @@
#include <linux/percpu.h>
#include <linux/ktime.h>
#include <linux/sched.h>
+#include <linux/clocksource.h>
/*
* Scheduler clock - returns current time in nanosec units.
@@ -38,8 +39,7 @@
*/
unsigned long long __attribute__((weak)) sched_clock(void)
{
- return (unsigned long long)(jiffies - INITIAL_JIFFIES)
- * (NSEC_PER_SEC / HZ);
+ return cyc2ns(sched_clocksource, clocksource_read(sched_clocksource));
}
static __read_mostly int sched_clock_running;
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 80189f6..d148a75 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -109,6 +109,7 @@ EXPORT_SYMBOL(timecounter_cyc2time);
/* XXX - Would like a better way for initializing curr_clocksource */
extern struct clocksource clocksource_jiffies;
+struct clocksource *sched_clocksource = &clocksource_jiffies;
/*[Clocksource internal variables]---------
* curr_clocksource:
@@ -362,6 +363,9 @@ static struct clocksource *select_clocksource(void)
if (next = curr_clocksource)
return NULL;
+ if (next->flags & CLOCK_SOURCE_USE_FOR_SCHED_CLOCK)
+ sched_clocksource = next;
+
return next;
}
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
index c3f6c30..727d881 100644
--- a/kernel/time/jiffies.c
+++ b/kernel/time/jiffies.c
@@ -52,7 +52,7 @@
static cycle_t jiffies_read(struct clocksource *cs)
{
- return (cycle_t) jiffies;
+ return (cycle_t) (jiffies - INITIAL_JIFFIES);
}
struct clocksource clocksource_jiffies = {
WARNING: multiple messages have this Message-ID (diff)
From: Paul Mundt <lethal@linux-sh.org>
To: Daniel Walker <dwalker@fifo99.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Linus Walleij <linus.ml.walleij@gmail.com>,
Ingo Molnar <mingo@elte.hu>, Andrew Victor <linux@maxim.org.za>,
Haavard Skinnemoen <hskinnemoen@atmel.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, linux-sh@vger.kernel.org,
linux-arm-kernel@lists.arm.linux.org.uk,
John Stultz <johnstul@linux.vnet.ibm.com>
Subject: Re: [PATCH] sched: Support current clocksource handling in fallback sched_clock().
Date: Thu, 28 May 2009 18:19:36 +0900 [thread overview]
Message-ID: <20090528091936.GA27545@linux-sh.org> (raw)
In-Reply-To: <1243441525.28705.19.camel@desktop>
On Wed, May 27, 2009 at 09:25:25AM -0700, Daniel Walker wrote:
> On Wed, 2009-05-27 at 09:15 +0900, Paul Mundt wrote:
>
> > unsigned long long __attribute__((weak)) sched_clock(void)
> > {
> > + /*
> > + * Use the current clocksource when it becomes available later in
> > + * the boot process, and ensure that it is usable for sched_clock().
> > + */
> > + if (clock && (clock->flags & CLOCK_SOURCE_USE_FOR_SCHED_CLOCK))
> > + return cyc2ns(clock, clocksource_read(clock));
> > +
> > + /* Otherwise just fall back on jiffies */
> > return (unsigned long long)(jiffies - INITIAL_JIFFIES)
>
> Do we really need all this complexity in a fast path? the jiffies
> clocksource is static and always ready. Could we instead remove the
> usage of "clock" and create a new pointer called "sched_clocksource" and
> initialize it to the jiffies clock, and allow the clocksource management
> code to update that new pointer based on the
> CLOCK_SOURCE_USE_FOR_SCHED_CLOCK flag when new clocksources are
> registered/removed/marked unstable etc..
>
> that would eliminate all the code in sched_clock except one line,
>
> unsigned long long __attribute__((weak)) sched_clock(void)
> {
> return cyc2ns(sched_clocksource, clocksource_read(sched_clocksource));
> }
>
Ok, there were some ordering problems with the early platform code, but
I've played with this a bit more and got it to the point where this now
also works. I can live with this over the v3 version if people prefer
this approach instead.
--
include/linux/clocksource.h | 4 +++-
kernel/sched_clock.c | 4 ++--
kernel/time/clocksource.c | 4 ++++
kernel/time/jiffies.c | 2 +-
4 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index c56457c..2109940 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -202,7 +202,8 @@ struct clocksource {
#endif
};
-extern struct clocksource *clock; /* current clocksource */
+extern struct clocksource *clock; /* current clocksource */
+extern struct clocksource *sched_clocksource; /* sched_clock() clocksource */
/*
* Clock source flags bits::
@@ -212,6 +213,7 @@ extern struct clocksource *clock; /* current clocksource */
#define CLOCK_SOURCE_WATCHDOG 0x10
#define CLOCK_SOURCE_VALID_FOR_HRES 0x20
+#define CLOCK_SOURCE_USE_FOR_SCHED_CLOCK 0x40
/* simplify initialization of mask field */
#define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1)
diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
index e1d16c9..c06c285 100644
--- a/kernel/sched_clock.c
+++ b/kernel/sched_clock.c
@@ -30,6 +30,7 @@
#include <linux/percpu.h>
#include <linux/ktime.h>
#include <linux/sched.h>
+#include <linux/clocksource.h>
/*
* Scheduler clock - returns current time in nanosec units.
@@ -38,8 +39,7 @@
*/
unsigned long long __attribute__((weak)) sched_clock(void)
{
- return (unsigned long long)(jiffies - INITIAL_JIFFIES)
- * (NSEC_PER_SEC / HZ);
+ return cyc2ns(sched_clocksource, clocksource_read(sched_clocksource));
}
static __read_mostly int sched_clock_running;
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 80189f6..d148a75 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -109,6 +109,7 @@ EXPORT_SYMBOL(timecounter_cyc2time);
/* XXX - Would like a better way for initializing curr_clocksource */
extern struct clocksource clocksource_jiffies;
+struct clocksource *sched_clocksource = &clocksource_jiffies;
/*[Clocksource internal variables]---------
* curr_clocksource:
@@ -362,6 +363,9 @@ static struct clocksource *select_clocksource(void)
if (next == curr_clocksource)
return NULL;
+ if (next->flags & CLOCK_SOURCE_USE_FOR_SCHED_CLOCK)
+ sched_clocksource = next;
+
return next;
}
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
index c3f6c30..727d881 100644
--- a/kernel/time/jiffies.c
+++ b/kernel/time/jiffies.c
@@ -52,7 +52,7 @@
static cycle_t jiffies_read(struct clocksource *cs)
{
- return (cycle_t) jiffies;
+ return (cycle_t) (jiffies - INITIAL_JIFFIES);
}
struct clocksource clocksource_jiffies = {
next prev parent reply other threads:[~2009-05-28 9:19 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-26 6:15 [PATCH] sched: Support current clocksource handling in fallback sched_clock() Paul Mundt
2009-05-26 6:15 ` Paul Mundt
2009-05-26 14:31 ` [PATCH] sched: Support current clocksource handling in fallback Linus Walleij
2009-05-26 14:31 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Linus Walleij
2009-05-26 14:38 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-26 14:38 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-26 20:17 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-26 20:17 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-26 23:08 ` Paul Mundt
2009-05-26 23:08 ` Paul Mundt
2009-05-26 23:13 ` Paul Mundt
2009-05-26 23:13 ` Paul Mundt
2009-05-26 23:25 ` [PATCH] sched: Support current clocksource handling in john stultz
2009-05-26 23:25 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz
2009-05-26 23:44 ` Paul Mundt
2009-05-26 23:44 ` Paul Mundt
2009-05-27 0:18 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-27 0:18 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-27 0:22 ` [PATCH] sched: Support current clocksource handling in john stultz
2009-05-27 0:22 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz
2009-05-27 0:26 ` Paul Mundt
2009-05-27 0:26 ` Paul Mundt
2009-05-27 1:09 ` [PATCH] sched: Support current clocksource handling in john stultz
2009-05-27 1:09 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz
2009-05-27 0:27 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-27 0:27 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-26 23:49 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-26 23:49 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-27 0:15 ` Paul Mundt
2009-05-27 0:15 ` Paul Mundt
2009-05-27 16:25 ` [PATCH] sched: Support current clocksource handling in Daniel Walker
2009-05-27 16:25 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker
2009-05-28 8:44 ` Paul Mundt
2009-05-28 8:44 ` Paul Mundt
2009-05-28 9:19 ` Paul Mundt [this message]
2009-05-28 9:19 ` Paul Mundt
2009-05-28 9:34 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-28 9:34 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-28 11:09 ` Paul Mundt
2009-05-28 11:09 ` Paul Mundt
2009-05-28 12:22 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-28 12:22 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-28 12:40 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-28 12:40 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-28 12:42 ` Paul Mundt
2009-05-28 12:42 ` Paul Mundt
2009-05-28 12:53 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-28 12:53 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-28 12:59 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-28 12:59 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-28 13:20 ` Paul Mundt
2009-05-28 13:20 ` Paul Mundt
2009-05-28 16:13 ` [PATCH] sched: Support current clocksource handling in Daniel Walker
2009-05-28 16:13 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker
2009-05-28 16:32 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-28 16:32 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-28 16:40 ` Paul Mundt
2009-05-28 16:40 ` Paul Mundt
2009-05-28 16:52 ` [PATCH] sched: Support current clocksource handling in Daniel Walker
2009-05-28 16:52 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker
2009-05-28 16:58 ` Paul Mundt
2009-05-28 16:58 ` Paul Mundt
2009-05-28 17:38 ` [PATCH] sched: Support current clocksource handling in Daniel Walker
2009-05-28 17:38 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker
2009-05-28 17:46 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-28 17:46 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-28 17:53 ` Paul Mundt
2009-05-28 17:53 ` Paul Mundt
2009-05-28 18:10 ` [PATCH] sched: Support current clocksource handling in Daniel Walker
2009-05-28 18:10 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker
2009-05-28 18:27 ` Paul Mundt
2009-05-28 18:27 ` Paul Mundt
2009-05-28 19:04 ` [PATCH] sched: Support current clocksource handling in Daniel Walker
2009-05-28 19:04 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker
2009-05-28 19:34 ` Paul Mundt
2009-05-28 19:34 ` Paul Mundt
2009-05-28 19:41 ` [PATCH] sched: Support current clocksource handling in Daniel Walker
2009-05-28 19:41 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker
2009-05-28 23:37 ` Paul Mundt
2009-05-28 23:37 ` Paul Mundt
2009-05-28 18:44 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-28 18:44 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-28 17:00 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-28 17:00 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-28 17:07 ` [PATCH] sched: Support current clocksource handling in John Stultz
2009-05-28 17:07 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() John Stultz
2009-05-26 20:23 ` [PATCH] sched: Support current clocksource handling in john stultz
2009-05-26 20:23 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz
2009-05-26 20:30 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-26 20:30 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-26 20:40 ` [PATCH] sched: Support current clocksource handling in john stultz
2009-05-26 20:40 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz
2009-05-26 20:55 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-26 20:55 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-26 23:00 ` [PATCH] sched: Support current clocksource handling in john stultz
2009-05-26 23:00 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz
2009-05-26 23:24 ` [PATCH] sched: Support current clocksource handling in fallback Mangalampalli, JayantX
2009-05-26 23:24 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Mangalampalli, JayantX
2009-05-27 0:04 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-27 0:04 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-26 23:39 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-26 23:39 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-27 6:58 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-27 6:58 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-26 20:39 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner
2009-05-26 20:39 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner
2009-05-26 14:43 ` Paul Mundt
2009-05-26 14:43 ` Paul Mundt
2009-05-26 14:50 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra
2009-05-26 14:50 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra
2009-05-26 14:53 ` Paul Mundt
2009-05-26 14:53 ` Paul Mundt
2009-05-26 15:02 ` [PATCH] sched: Support current clocksource handling in fallback Matthieu CASTET
2009-05-26 15:02 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Matthieu CASTET
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=20090528091936.GA27545@linux-sh.org \
--to=lethal@linux-sh.org \
--cc=akpm@linux-foundation.org \
--cc=dwalker@fifo99.com \
--cc=hskinnemoen@atmel.com \
--cc=johnstul@linux.vnet.ibm.com \
--cc=linus.ml.walleij@gmail.com \
--cc=linux-arm-kernel@lists.arm.linux.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=linux@maxim.org.za \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/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.