From: Paul Mundt <lethal@linux-sh.org>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>,
Daniel Walker <dwalker@fifo99.com>,
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 12:42:07 +0000 [thread overview]
Message-ID: <20090528124207.GA28830@linux-sh.org> (raw)
In-Reply-To: <alpine.LFD.2.00.0905281417500.3397@localhost.localdomain>
On Thu, May 28, 2009 at 02:22:17PM +0200, Thomas Gleixner wrote:
> On Thu, 28 May 2009, Paul Mundt wrote:
> > @@ -437,10 +441,19 @@ void clocksource_unregister(struct clocksource *cs)
> > unsigned long flags;
> >
> > spin_lock_irqsave(&clocksource_lock, flags);
> > +
> > + if (sched_clocksource = cs) {
> > + printk(KERN_WARNING "Refusing to unregister "
> > + "scheduler clocksource %s", cs->name);
>
> Hmm, isn't that dangerous ? The clocksource might be in a module or
> in kmalloced memory which is going to be freed.
>
Perhaps the saner thing to do is see if select_clocksource() manages to
find something suitable, otherwise switch back to jiffies..
--
include/linux/clocksource.h | 4 +++-
kernel/sched_clock.c | 6 ++++--
kernel/time/clocksource.c | 14 ++++++++++++++
kernel/time/jiffies.c | 2 +-
4 files changed, 22 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..b91190e 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,9 @@
*/
unsigned long long __attribute__((weak)) sched_clock(void)
{
- return (unsigned long long)(jiffies - INITIAL_JIFFIES)
- * (NSEC_PER_SEC / HZ);
+ struct clocksource *clock = ACCESS_ONCE(sched_clocksource);
+
+ return cyc2ns(clock, clocksource_read(clock));
}
static __read_mostly int sched_clock_running;
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 80189f6..19c72d0 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;
}
@@ -440,7 +444,17 @@ void clocksource_unregister(struct clocksource *cs)
list_del(&cs->list);
if (clocksource_override = cs)
clocksource_override = NULL;
+
next_clocksource = select_clocksource();
+
+ /*
+ * If select_clocksource() fails to find another suitable
+ * clocksource for sched_clocksource and we are unregistering
+ * it, switch back to jiffies.
+ */
+ if (sched_clocksource = cs)
+ sched_clocksource = &clocksource_jiffies;
+
spin_unlock_irqrestore(&clocksource_lock, flags);
}
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: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>,
Daniel Walker <dwalker@fifo99.com>,
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 21:42:07 +0900 [thread overview]
Message-ID: <20090528124207.GA28830@linux-sh.org> (raw)
In-Reply-To: <alpine.LFD.2.00.0905281417500.3397@localhost.localdomain>
On Thu, May 28, 2009 at 02:22:17PM +0200, Thomas Gleixner wrote:
> On Thu, 28 May 2009, Paul Mundt wrote:
> > @@ -437,10 +441,19 @@ void clocksource_unregister(struct clocksource *cs)
> > unsigned long flags;
> >
> > spin_lock_irqsave(&clocksource_lock, flags);
> > +
> > + if (sched_clocksource == cs) {
> > + printk(KERN_WARNING "Refusing to unregister "
> > + "scheduler clocksource %s", cs->name);
>
> Hmm, isn't that dangerous ? The clocksource might be in a module or
> in kmalloced memory which is going to be freed.
>
Perhaps the saner thing to do is see if select_clocksource() manages to
find something suitable, otherwise switch back to jiffies..
--
include/linux/clocksource.h | 4 +++-
kernel/sched_clock.c | 6 ++++--
kernel/time/clocksource.c | 14 ++++++++++++++
kernel/time/jiffies.c | 2 +-
4 files changed, 22 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..b91190e 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,9 @@
*/
unsigned long long __attribute__((weak)) sched_clock(void)
{
- return (unsigned long long)(jiffies - INITIAL_JIFFIES)
- * (NSEC_PER_SEC / HZ);
+ struct clocksource *clock = ACCESS_ONCE(sched_clocksource);
+
+ return cyc2ns(clock, clocksource_read(clock));
}
static __read_mostly int sched_clock_running;
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 80189f6..19c72d0 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;
}
@@ -440,7 +444,17 @@ void clocksource_unregister(struct clocksource *cs)
list_del(&cs->list);
if (clocksource_override == cs)
clocksource_override = NULL;
+
next_clocksource = select_clocksource();
+
+ /*
+ * If select_clocksource() fails to find another suitable
+ * clocksource for sched_clocksource and we are unregistering
+ * it, switch back to jiffies.
+ */
+ if (sched_clocksource == cs)
+ sched_clocksource = &clocksource_jiffies;
+
spin_unlock_irqrestore(&clocksource_lock, flags);
}
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 12:42 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
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 [this message]
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=20090528124207.GA28830@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.