From: Daniel Walker <dwalker@mvista.com>
To: akpm@osdl.org
Cc: linux-kernel@vger.kernel.org, johnstul@us.ibm.com
Subject: [PATCH 11/23] clocksource: atomic signals
Date: Tue, 30 Jan 2007 19:37:21 -0800 [thread overview]
Message-ID: <20070131033806.468210824@mvista.com> (raw)
In-Reply-To: 20070131033710.420168478@mvista.com
[-- Attachment #1: clocksource_add_atomic_singals.patch --]
[-- Type: text/plain, Size: 5656 bytes --]
Modifies the way clocks are switched to in the timekeeping code. The original
code would constantly monitor the clocksource list checking for newly added
clocksources. I modified this by using atomic types to signal when a new clock
is added. This allows the operation to be used only when it's needed.
The fast path is also reduced to checking a single atomic value.
Signed-Off-By: Daniel Walker <dwalker@mvista.com>
---
include/linux/clocksource.h | 5 ++++
include/linux/timekeeping.h | 4 ---
kernel/time/clocksource.c | 6 +++++
kernel/time/timekeeping.c | 49 ++++++++++++++++++++++++++++----------------
4 files changed, 43 insertions(+), 21 deletions(-)
Index: linux-2.6.19/include/linux/clocksource.h
===================================================================
--- linux-2.6.19.orig/include/linux/clocksource.h
+++ linux-2.6.19/include/linux/clocksource.h
@@ -25,6 +25,11 @@ typedef u64 cycle_t;
extern struct clocksource clocksource_jiffies;
/*
+ * Atomic signal that is specific to timekeeping.
+ */
+extern atomic_t clock_check;
+
+/*
* Allows inlined calling for notifier routines.
*/
extern struct atomic_notifier_head clocksource_list_notifier;
Index: linux-2.6.19/include/linux/timekeeping.h
===================================================================
--- linux-2.6.19.orig/include/linux/timekeeping.h
+++ linux-2.6.19/include/linux/timekeeping.h
@@ -4,10 +4,6 @@
#include <linux/clocksource.h>
#ifndef CONFIG_GENERIC_TIME
-static inline int change_clocksource(void)
-{
- return 0;
-}
static inline void change_clocksource(void) { }
static inline void timekeeping_init_notifier(void) { }
Index: linux-2.6.19/kernel/time/clocksource.c
===================================================================
--- linux-2.6.19.orig/kernel/time/clocksource.c
+++ linux-2.6.19/kernel/time/clocksource.c
@@ -50,6 +50,7 @@ static char override_name[32];
static int finished_booting;
ATOMIC_NOTIFIER_HEAD(clocksource_list_notifier);
+atomic_t clock_check = ATOMIC_INIT(0);
/* clocksource_done_booting - Called near the end of bootup
*
@@ -58,6 +59,8 @@ ATOMIC_NOTIFIER_HEAD(clocksource_list_no
static int __init clocksource_done_booting(void)
{
finished_booting = 1;
+ /* Check for a new clock now */
+ atomic_inc(&clock_check);
return 0;
}
@@ -285,6 +288,9 @@ static ssize_t sysfs_override_clocksourc
/* try to select it: */
next_clocksource = select_clocksource();
+ /* Signal that there is a new clocksource */
+ atomic_inc(&clock_check);
+
spin_unlock_irq(&clocksource_lock);
return ret;
Index: linux-2.6.19/kernel/time/timekeeping.c
===================================================================
--- linux-2.6.19.orig/kernel/time/timekeeping.c
+++ linux-2.6.19/kernel/time/timekeeping.c
@@ -9,6 +9,7 @@
#include <linux/sched.h>
#include <linux/timekeeping.h>
#include <linux/time.h>
+#include <linux/timex.h>
#include <linux/hrtimer.h>
#include <linux/tick.h>
@@ -39,7 +40,6 @@ static unsigned long timekeeping_suspend
* Clock used for timekeeping
*/
struct clocksource *clock = &clocksource_jiffies;
-atomic_t clock_recalc_interval = ATOMIC_INIT(0);
#ifdef CONFIG_GENERIC_TIME
/**
@@ -157,11 +157,12 @@ int do_settimeofday(struct timespec *tv)
EXPORT_SYMBOL(do_settimeofday);
/**
- * change_clocksource - Swaps clocksources if a new one is available
+ * timkeeping_change_clocksource - Swaps clocksources if a new one is available
*
* Accumulates current time interval and initializes new clocksource
+ * Needs to be called with the xtime_lock held.
*/
-static int change_clocksource(void)
+static void timekeeping_change_clocksource(void)
{
struct clocksource *new;
cycle_t now;
@@ -176,12 +177,15 @@ static int change_clocksource(void)
clock->cycle_last = now;
printk(KERN_INFO "Time: %s clocksource has been installed.\n",
clock->name);
- return 1;
- } else if (unlikely(atomic_read(&clock_recalc_interval))) {
- atomic_set(&clock_recalc_interval, 0);
- return 1;
+ tick_clock_notify();
+ clock->error = 0;
+ clock->xtime_nsec = 0;
+ clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
+ } else {
+ clock->error = 0;
+ clock->xtime_nsec = 0;
+ clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
}
- return 0;
}
/**
@@ -205,9 +209,14 @@ int timekeeping_is_continuous(void)
static int
clocksource_callback(struct notifier_block *nb, unsigned long op, void *c)
{
- if (c == clock && op == CLOCKSOURCE_NOTIFY_FREQ &&
- !atomic_read(&clock_recalc_interval))
- atomic_inc(&clock_recalc_interval);
+ if (likely(c != clock))
+ return 0;
+
+ switch (op) {
+ case CLOCKSOURCE_NOTIFY_FREQ:
+ case CLOCKSOURCE_NOTIFY_RATING:
+ atomic_inc(&clock_check);
+ }
return 0;
}
@@ -334,6 +343,7 @@ static int __init timekeeping_init_devic
int error = sysdev_class_register(&timekeeping_sysclass);
if (!error)
error = sysdev_register(&device_timer);
+
return error;
}
@@ -476,13 +486,18 @@ static inline void update_wall_time(void
xtime.tv_nsec = (s64)clock->xtime_nsec >> clock->shift;
clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift;
- /* check to see if there is a new clocksource to use */
- if (change_clocksource()) {
- clock->error = 0;
- clock->xtime_nsec = 0;
- tick_clock_notify();
- clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
+#ifdef CONFIG_GENERIC_TIME
+ /*
+ * check to see if there is a new clocksource to use
+ */
+ if (unlikely(atomic_read(&clock_check))) {
+
+ timekeeping_change_clocksource();
+
+ atomic_set(&clock_check, 0);
}
+#endif /* CONFIG_GENERIC_TIME */
+
update_vsyscall(&xtime, clock);
}
--
next prev parent reply other threads:[~2007-01-31 3:42 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-31 3:37 [PATCH 00/23] clocksource update v12 Daniel Walker
2007-01-31 3:37 ` [PATCH 01/23] clocksource: drop clocksource-add-verification-watchdog-helper-fix.patch Daniel Walker
2007-01-31 12:47 ` Ingo Molnar
2007-01-31 3:37 ` [PATCH 02/23] clocksource: drop clocksource-add-verification-watchdog-helper.patch Daniel Walker
2007-01-31 3:37 ` [PATCH 03/23] clocksource: drop clocksource-remove-the-update-callback.patch Daniel Walker
2007-01-31 3:37 ` [PATCH 04/23] clocksource: drop time-x86_64-tsc-fixup-clocksource-changes.patch Daniel Walker
2007-01-31 3:37 ` [PATCH 05/23] clocksource: drop simplify-the-registration-of-clocksources.patch Daniel Walker
2007-01-31 3:37 ` [PATCH 06/23] timekeeping: create kernel/time/timekeeping.c Daniel Walker
2007-01-31 8:59 ` Ingo Molnar
2007-01-31 15:05 ` Daniel Walker
2007-01-31 3:37 ` [PATCH 07/23] clocksource: rating sorted list Daniel Walker
2007-01-31 9:34 ` Ingo Molnar
2007-01-31 15:07 ` Daniel Walker
2007-01-31 3:37 ` [PATCH 08/23] clocksource: drop duplicate register checking Daniel Walker
2007-01-31 9:59 ` Ingo Molnar
2007-01-31 15:13 ` Daniel Walker
2007-01-31 17:19 ` Ingo Molnar
2007-01-31 3:37 ` [PATCH 09/23] clocksource: add block notifier Daniel Walker
2007-01-31 10:17 ` Ingo Molnar
2007-01-31 15:25 ` Daniel Walker
2007-01-31 17:22 ` Ingo Molnar
2007-01-31 3:37 ` [PATCH 10/23] clocksource: remove update_callback Daniel Walker
2007-01-31 10:46 ` Ingo Molnar
2007-01-31 15:42 ` Daniel Walker
2007-01-31 17:18 ` Ingo Molnar
2007-01-31 3:37 ` Daniel Walker [this message]
2007-01-31 11:07 ` [PATCH 11/23] clocksource: atomic signals Ingo Molnar
2007-01-31 15:59 ` Daniel Walker
2007-01-31 17:15 ` Ingo Molnar
2007-01-31 3:37 ` [PATCH 12/23] clocksource: add clocksource_get_clock() Daniel Walker
2007-01-31 11:46 ` Ingo Molnar
2007-01-31 16:40 ` Daniel Walker
2007-01-31 3:37 ` [PATCH 13/23] timekeeping: move sysfs layer/drop API calls Daniel Walker
2007-01-31 11:49 ` Ingo Molnar
2007-01-31 3:37 ` [PATCH 14/23] clocksource: increase initcall priority Daniel Walker
2007-01-31 11:50 ` Ingo Molnar
2007-01-31 16:42 ` Daniel Walker
2007-01-31 17:10 ` Ingo Molnar
2007-01-31 17:20 ` Daniel Walker
2007-01-31 17:29 ` Thomas Gleixner
2007-01-31 3:37 ` [PATCH 15/23] clocksource: add new flags Daniel Walker
2007-01-31 3:37 ` [PATCH 16/23] clocksource: arm update for " Daniel Walker
2007-01-31 12:27 ` Ingo Molnar
2007-01-31 3:37 ` [PATCH 17/23] clocksource: avr32 " Daniel Walker
2007-01-31 3:37 ` [PATCH 18/23] clocksource: i386 " Daniel Walker
2007-01-31 3:37 ` [PATCH 19/23] clocksource: mips " Daniel Walker
2007-01-31 3:37 ` [PATCH 20/23] clocksource: x86_64 " Daniel Walker
2007-01-31 3:37 ` [PATCH 21/23] clocksource: drivers/ " Daniel Walker
2007-01-31 3:37 ` [PATCH 22/23] clocksource: new clock lookup method Daniel Walker
[not found] ` <20070131122215.GE1847@elte.hu>
[not found] ` <1170261439.9781.96.camel@imap.mvista.com>
[not found] ` <20070131164918.GA4468@elte.hu>
[not found] ` <1170265169.9781.145.camel@imap.mvista.com>
2007-01-31 17:55 ` Thomas Gleixner
2007-01-31 18:07 ` Daniel Walker
2007-01-31 21:09 ` Thomas Gleixner
2007-01-31 3:37 ` [PATCH 23/23] clocksource tsc: add verify routine Daniel Walker
2007-01-31 12:43 ` Ingo Molnar
2007-01-31 17:02 ` Daniel Walker
2007-01-31 17:22 ` Thomas Gleixner
2007-01-31 17:33 ` Ingo Molnar
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=20070131033806.468210824@mvista.com \
--to=dwalker@mvista.com \
--cc=akpm@osdl.org \
--cc=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.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.