Re: early printk timings way off

From: Tim Bird
Date: Fri Sep 16 2005 - 12:37:54 EST


Tim Schmielau wrote:
> So, one jump (probably the first) happens when time_init sets use_tsc.
> Do we understand the other jump as well?

I haven't specifically tested, but I'd put good money on it being
a result of the initialization of cyc2ns_scale. Before this
is set, cycles_2_ns() returns 0 (which would explain the _exactly_
0 value). The value of 27.<something> seconds is very likely the
real value based on the TSC (which would mean the BIOS took
a good long time during boot).

So, in summary, this is probably what's happening:

* from start_kernel - sched_clock() returns jiffies_64 (which
is pre-initialized high and is not incrementing yet)
* when use_tsc is set, sched_clock returns 0, until
* when cyc2ns_scale is set, sched_clock returns TSC-based values,
representing time from cold machine start

On other platforms, I have sometimes replaced the call to sched_clock()
in printk() with something else that gives valid data from the very first
kernel instruction.

A while ago Andrew Morton said that maybe the clock used here should be
replaceable, using something like the code below. Does anyone know
if someone worked on this. If not I'll take a stab at submitting it.

--- devel/kernel/printk.c~printk_clock 2005-08-21 02:14:05.000000000
-0700
+++ devel-akpm/kernel/printk.c 2005-08-21 02:15:14.000000000 -0700
@@ -488,6 +488,11 @@ static int __init printk_time_setup(char

__setup("time", printk_time_setup);

+__attribute__((weak)) unsigned long long printk_clock(void)
+{
+ return sched_clock();
+}
+
/*
* This is printk. It can be called from any context. We want it to
work.
*
@@ -558,7 +563,7 @@ asmlinkage int vprintk(const char *fmt,
loglev_char =
default_message_loglevel
+ '0';
}
- t = sched_clock();
+ t = printk_clock();
nanosec_rem = do_div(t, 1000000000);
tlen = sprintf(tbuf,
"<%c>[%5lu.%06lu] ",

Regards,
-- Tim

=============================
Tim Bird
Architecture Group Chair, CE Linux Forum
Senior Staff Engineer, Sony Electronics
=============================

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/