Commit 8107d829 authored by Christian Borntraeger's avatar Christian Borntraeger Committed by Martin Schwidefsky

[S390] fix/cleanup sched_clock

CONFIG_PRINTK_TIME reveals that sched_clock has a wrong offset during boot:
..
[    0.000000]   Movable zone: 0 pages used for memmap
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 775679
[    0.000000] Kernel command line: dasd=4b6c root=/dev/dasda1 ro noinitrd
[    0.000000] PID hash table entries: 4096 (order: 12, 32768 bytes)
[6920575.975232] console [ttyS0] enabled
[6920575.987586] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes)
[6920575.991404] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes)
..

The s390 implementation of sched_clock uses the store clock instruction and
subtracts jiffies_timer_cc.
jiffies_timer_cc is a local variable in arch/s390/kernel/time.c and only used
for sched_clock and monotonic clock. For historical reasons there is an offset
on that value. With todays code this offset is unnecessary. By removing that
offset we can get a sched_clock which returns the nanoseconds after time_init.
This improves CONFIG_PRINTK_TIME.

Since sched_clock is the only user, I have also renamed jiffies_timer_cc to
sched_clock_base_cc. In addition, the local variable init_timer_cc is redundant
and can be romved as well.
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 59da2139
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
static ext_int_info_t ext_int_info_cc; static ext_int_info_t ext_int_info_cc;
static ext_int_info_t ext_int_etr_cc; static ext_int_info_t ext_int_etr_cc;
static u64 jiffies_timer_cc; static u64 sched_clock_base_cc;
static DEFINE_PER_CPU(struct clock_event_device, comparators); static DEFINE_PER_CPU(struct clock_event_device, comparators);
...@@ -68,7 +68,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators); ...@@ -68,7 +68,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators);
*/ */
unsigned long long sched_clock(void) unsigned long long sched_clock(void)
{ {
return ((get_clock_xt() - jiffies_timer_cc) * 125) >> 9; return ((get_clock_xt() - sched_clock_base_cc) * 125) >> 9;
} }
/* /*
...@@ -229,13 +229,10 @@ static struct clocksource clocksource_tod = { ...@@ -229,13 +229,10 @@ static struct clocksource clocksource_tod = {
*/ */
void __init time_init(void) void __init time_init(void)
{ {
u64 init_timer_cc; sched_clock_base_cc = reset_tod_clock();
init_timer_cc = reset_tod_clock();
jiffies_timer_cc = init_timer_cc - jiffies_64 * CLK_TICKS_PER_JIFFY;
/* set xtime */ /* set xtime */
tod_to_timeval(init_timer_cc - TOD_UNIX_EPOCH, &xtime); tod_to_timeval(sched_clock_base_cc - TOD_UNIX_EPOCH, &xtime);
set_normalized_timespec(&wall_to_monotonic, set_normalized_timespec(&wall_to_monotonic,
-xtime.tv_sec, -xtime.tv_nsec); -xtime.tv_sec, -xtime.tv_nsec);
...@@ -289,7 +286,7 @@ static unsigned long long adjust_time(unsigned long long old, ...@@ -289,7 +286,7 @@ static unsigned long long adjust_time(unsigned long long old,
delta = -delta; delta = -delta;
adjust.offset = -ticks * (1000000 / HZ); adjust.offset = -ticks * (1000000 / HZ);
} }
jiffies_timer_cc += delta; sched_clock_base_cc += delta;
if (adjust.offset != 0) { if (adjust.offset != 0) {
printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n", printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n",
adjust.offset); adjust.offset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment