From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Roman Zippel <zippel@linux-m68k.org>,
Ingo Molnar <mingo@elte.hu>
Subject: [patch 22/40] clocksource: introduce clocksource_forward_now()
Date: Thu, 22 Jan 2009 22:14:09 -0800 [thread overview]
Message-ID: <20090123061409.GV2922@kroah.com> (raw)
In-Reply-To: <20090123001908.GA7397@kroah.com>
[-- Attachment #1: clocksource-introduce-clocksource_forward_now.patch --]
[-- Type: text/plain, Size: 6213 bytes --]
2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Roman Zippel <zippel@linux-m68k.org>
commit 9a055117d3d9cb562f83f8d4cd88772761f4cab0 upstream.
To keep the raw monotonic patch simple first introduce
clocksource_forward_now(), which takes care of the offset since the last
update_wall_time() call and adds it to the clock, so there is no need
anymore to deal with it explicitly at various places, which need to make
significant changes to the clock.
This is also gets rid of the timekeeping_suspend_nsecs, instead of
waiting until resume, the value is accumulated during suspend. In the end
there is only a single user of __get_nsec_offset() left, so I integrated
it back to getnstimeofday().
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/time/timekeeping.c | 71 +++++++++++++++++++++-------------------------
1 file changed, 33 insertions(+), 38 deletions(-)
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -61,27 +61,23 @@ struct clocksource *clock;
#ifdef CONFIG_GENERIC_TIME
/**
- * __get_nsec_offset - Returns nanoseconds since last call to periodic_hook
+ * clocksource_forward_now - update clock to the current time
*
- * private function, must hold xtime_lock lock when being
- * called. Returns the number of nanoseconds since the
- * last call to update_wall_time() (adjusted by NTP scaling)
+ * Forward the current clock to update its state since the last call to
+ * update_wall_time(). This is useful before significant clock changes,
+ * as it avoids having to deal with this time offset explicitly.
*/
-static inline s64 __get_nsec_offset(void)
+static void clocksource_forward_now(void)
{
cycle_t cycle_now, cycle_delta;
- s64 ns_offset;
+ s64 nsec;
- /* read clocksource: */
cycle_now = clocksource_read(clock);
-
- /* calculate the delta since the last update_wall_time: */
cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
+ clock->cycle_last = cycle_now;
- /* convert to nanoseconds: */
- ns_offset = cyc2ns(clock, cycle_delta);
-
- return ns_offset;
+ nsec = cyc2ns(clock, cycle_delta);
+ timespec_add_ns(&xtime, nsec);
}
/**
@@ -92,6 +88,7 @@ static inline s64 __get_nsec_offset(void
*/
void getnstimeofday(struct timespec *ts)
{
+ cycle_t cycle_now, cycle_delta;
unsigned long seq;
s64 nsecs;
@@ -101,7 +98,15 @@ void getnstimeofday(struct timespec *ts)
seq = read_seqbegin(&xtime_lock);
*ts = xtime;
- nsecs = __get_nsec_offset();
+
+ /* read clocksource: */
+ cycle_now = clocksource_read(clock);
+
+ /* calculate the delta since the last update_wall_time: */
+ cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
+
+ /* convert to nanoseconds: */
+ nsecs = cyc2ns(clock, cycle_delta);
} while (read_seqretry(&xtime_lock, seq));
@@ -134,22 +139,22 @@ EXPORT_SYMBOL(do_gettimeofday);
*/
int do_settimeofday(struct timespec *tv)
{
+ struct timespec ts_delta;
unsigned long flags;
- time_t wtm_sec, sec = tv->tv_sec;
- long wtm_nsec, nsec = tv->tv_nsec;
if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
return -EINVAL;
write_seqlock_irqsave(&xtime_lock, flags);
- nsec -= __get_nsec_offset();
+ clocksource_forward_now();
+
+ ts_delta.tv_sec = tv->tv_sec - xtime.tv_sec;
+ ts_delta.tv_nsec = tv->tv_nsec - xtime.tv_nsec;
+ wall_to_monotonic = timespec_sub(wall_to_monotonic, ts_delta);
- wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
- wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
+ xtime = *tv;
- set_normalized_timespec(&xtime, sec, nsec);
- set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
update_xtime_cache(0);
clock->error = 0;
@@ -175,22 +180,17 @@ EXPORT_SYMBOL(do_settimeofday);
static void change_clocksource(void)
{
struct clocksource *new;
- cycle_t now;
- u64 nsec;
new = clocksource_get_next();
if (clock == new)
return;
- new->cycle_last = 0;
- now = clocksource_read(new);
- nsec = __get_nsec_offset();
- timespec_add_ns(&xtime, nsec);
+ clocksource_forward_now();
clock = new;
- clock->cycle_last = now;
-
+ clock->cycle_last = 0;
+ clock->cycle_last = clocksource_read(new);
clock->error = 0;
clock->xtime_nsec = 0;
clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
@@ -205,8 +205,8 @@ static void change_clocksource(void)
*/
}
#else
+static inline void clocksource_forward_now(void) { }
static inline void change_clocksource(void) { }
-static inline s64 __get_nsec_offset(void) { return 0; }
#endif
/**
@@ -268,8 +268,6 @@ void __init timekeeping_init(void)
/* time in seconds when suspend began */
static unsigned long timekeeping_suspend_time;
-/* xtime offset when we went into suspend */
-static s64 timekeeping_suspend_nsecs;
/**
* timekeeping_resume - Resumes the generic timekeeping subsystem.
@@ -295,8 +293,6 @@ static int timekeeping_resume(struct sys
wall_to_monotonic.tv_sec -= sleep_length;
total_sleep_time += sleep_length;
}
- /* Make sure that we have the correct xtime reference */
- timespec_add_ns(&xtime, timekeeping_suspend_nsecs);
update_xtime_cache(0);
/* re-base the last cycle value */
clock->cycle_last = 0;
@@ -322,8 +318,7 @@ static int timekeeping_suspend(struct sy
timekeeping_suspend_time = read_persistent_clock();
write_seqlock_irqsave(&xtime_lock, flags);
- /* Get the current xtime offset */
- timekeeping_suspend_nsecs = __get_nsec_offset();
+ clocksource_forward_now();
timekeeping_suspended = 1;
write_sequnlock_irqrestore(&xtime_lock, flags);
@@ -464,10 +459,10 @@ void update_wall_time(void)
*/
while (offset >= clock->cycle_interval) {
/* accumulate one interval */
- clock->xtime_nsec += clock->xtime_interval;
- clock->cycle_last += clock->cycle_interval;
offset -= clock->cycle_interval;
+ clock->cycle_last += clock->cycle_interval;
+ clock->xtime_nsec += clock->xtime_interval;
if (clock->xtime_nsec >= (u64)NSEC_PER_SEC << clock->shift) {
clock->xtime_nsec -= (u64)NSEC_PER_SEC << clock->shift;
xtime.tv_sec++;
next prev parent reply other threads:[~2009-01-23 6:24 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090123001330.046404396@mini.kroah.org>
2009-01-23 0:19 ` [patch 00/40] 2.6.27-stable review Greg KH
2009-01-23 6:12 ` [patch 01/40] pkt_sched: sch_htb: Fix deadlock in hrtimers triggered by HTB Greg KH
2009-01-23 6:12 ` [patch 02/40] ipv6: Fix fib6_dump_table walker leak Greg KH
2009-01-23 6:12 ` [patch 03/40] sctp: Avoid memory overflow while FWD-TSN chunk is received with bad stream ID Greg KH
2009-01-23 6:13 ` [patch 04/40] pkt_sched: cls_u32: Fix locking in u32_change() Greg KH
2009-01-23 6:13 ` [patch 05/40] r6040: fix wrong logic in mdio code Greg KH
2009-01-23 6:13 ` [patch 06/40] r6040: save and restore MIER correctly in the interrupt routine Greg KH
2009-01-23 6:13 ` [patch 07/40] r6040: bump release number to 0.19 Greg KH
2009-01-23 6:13 ` [patch 08/40] tcp: dont mask EOF and socket errors on nonblocking splice receive Greg KH
2009-01-23 6:13 ` [patch 09/40] usb-storage: add last-sector hacks Greg KH
2009-01-23 6:13 ` [patch 10/40] usb-storage: set CAPACITY_HEURISTICS flag for bad vendors Greg KH
2009-01-23 6:13 ` [patch 11/40] ALSA: hda - Add automatic model setting for Samsung Q45 Greg KH
2009-01-23 6:13 ` [patch 12/40] ALSA: hda - make laptop-eapd model back for AD1986A Greg KH
2009-01-23 6:13 ` [patch 13/40] drivers/net/irda/irda-usb.c: fix buffer overflow Greg KH
2009-01-23 6:13 ` [patch 14/40] IA64: Turn on CONFIG_HAVE_UNSTABLE_CLOCK Greg KH
2009-01-23 6:13 ` [patch 15/40] kill sig -1 must only apply to callers namespace Greg KH
2009-01-23 6:13 ` [patch 16/40] lib/idr.c: use kmem_cache_zalloc() for the idr_layer cache Greg KH
2009-01-23 6:13 ` [patch 17/40] p54usb: Add USB ID for Thomson Speedtouch 121g Greg KH
2009-01-23 6:13 ` [patch 18/40] PCI: keep ASPM link state consistent throughout PCIe hierarchy Greg KH
2009-01-23 6:14 ` [patch 19/40] rt2x00: add USB ID for the Linksys WUSB200 Greg KH
2009-01-23 6:14 ` [patch 20/40] security: introduce missing kfree Greg KH
2009-01-23 6:14 ` [patch 21/40] sgi-xp: eliminate false detection of no heartbeat Greg KH
2009-01-23 6:14 ` Greg KH [this message]
2009-01-23 6:14 ` [patch 23/40] hwmon-vid: Add support for AMD family 10h CPUs Greg KH
2009-01-23 6:14 ` [patch 24/40] ath9k: quiet harmless ForceXPAon messages Greg KH
2009-01-23 6:14 ` [patch 25/40] dell_rbu: use scnprintf() instead of less secure sprintf() Greg KH
2009-01-23 6:14 ` [patch 26/40] hwmon: (abituguru3) Fix CONFIG_DMI=n fallback to probe Greg KH
2009-01-23 6:14 ` [patch 27/40] powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices Greg KH
2009-01-23 6:14 ` [patch 28/40] mm: write_cache_pages cyclic fix Greg KH
2009-01-23 6:14 ` [patch 29/40] mm: write_cache_pages early loop termination Greg KH
2009-01-23 6:14 ` [patch 30/40] mm: write_cache_pages writepage error fix Greg KH
2009-01-23 6:14 ` [patch 31/40] mm: write_cache_pages integrity fix Greg KH
2009-01-23 6:14 ` [patch 32/40] mm: write_cache_pages cleanups Greg KH
2009-01-23 6:14 ` [patch 33/40] mm: write_cache_pages optimise page cleaning Greg KH
2009-01-23 6:14 ` [patch 34/40] mm: write_cache_pages terminate quickly Greg KH
2009-01-23 6:14 ` [patch 35/40] mm: write_cache_pages more " Greg KH
2009-01-23 6:14 ` [patch 36/40] mm: do_sync_mapping_range integrity fix Greg KH
2009-01-23 6:14 ` [patch 37/40] mm: direct IO starvation improvement Greg KH
2009-01-23 6:14 ` [patch 38/40] fs: remove WB_SYNC_HOLD Greg KH
2009-01-23 6:14 ` [patch 39/40] fs: sync_sb_inodes fix Greg KH
2009-01-23 6:15 ` [patch 40/40] fs: sys_sync fix Greg KH
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=20090123061409.GV2922@kroah.com \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=zippel@linux-m68k.org \
--cc=zwane@arm.linux.org.uk \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox