RE: [PATCH v2] Added "Preserve Boot Time Support"

From: Mirea, Bogdan-Stefan
Date: Thu May 04 2017 - 06:55:02 EST


Hi Oleksij,

On Thursday, May 04, 2017 12:27 PM, Oleksij Rempel wrote:
> Hi Bogdan,
>
> are there any example what and how bootloader should do to provide
> correct values?

I will give you an example with a real behavior on Renesas RCAR Gen3
Salvator-x:

We have an ARM64 SOC with the following boot stages:
ARM Trusted Firmware BL2 -> ARM Trusted Firmware BL31 -> U-Boot -> Linux

[First]
On ARM Trusted Firmware BL31 "programs the CNTFRQ_EL0 register with the
clock frequency of the system counter, which is provided by the
platform"(Aarch64 Bl31 documentation [1]). And after this step the timer
is up and running so every timer cycle is counted in the CCNT register.

[Step A]
After this step BL31 will load and start execution of U-Boot(BL33). In
U-Boot we will spend for example 4 seconds and then load and start
execution of Linux Kernel.

[Step B]
Linux Kernel starts and after kernel timer is initiallized the
sched_clock_register will be called.

[Step C]
Testing with "$: uptime > /dev/kmsg"



Test 1: Testing with default kernel (no patch added)
Log will be:
[Step A]
[ 0.165573]
[ 0.167127] U-Boot 2015.04 (Apr 06 2017 - 12:28:41)
...
[ 4.364556]
[ 4.366065] Starting kernel ...

[Step B]
...
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff
max_cycles: 0x1ec02923e, max_idle_ns: 440795202125 ns
[ 0.000003] sched_clock: 56 bits at 8MHz, resolution 120ns, wraps
every 2199023255496ns
[ 0.000214] Console: colour dummy device 80x25
[ 0.000594] console [tty0] enabled
...
[Step C]
$ uptime > /dev/kmsg
[ 9.148458] 00:00:09 up 0 min, load average: 0.00, 0.00, 0.00

There is no inconsistency between kmsg and uptime, but from [Step B] we
observe that the time spent before kernel start is not added.



Test 2: Testing only with preserve boot time "kernel/time/sched_clock"
modifications:
Log will be:
[Step A]
[ 0.164567]
[ 0.166122] U-Boot 2015.04 (Apr 06 2017 - 12:28:41)
...
[ 4.357793]
[ 4.359301] Starting kernel ...

[Step B]
...
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff
max_cycles: 0x1ec02923e, max_idle_ns: 440795202125 ns
[ 4.641512] sched_clock: 56 bits at 8MHz, resolution 120ns, wraps
every 2199023255496ns
[ 4.641724] Console: colour dummy device 80x25
[ 4.642105] console [tty0] enabled
...

[Step C]
uptime > /dev/kmsg
[ 13.933217] 00:00:09 up 0 min, load average: 0.00, 0.00, 0.00

We can see that the preserve boottime changes in
"kernel/time/sched_clock" updates the kmsg time [Step B], but there is
an inconsistency between kmsg time and uptime since uptime is not
updated accordingly to the timer's CCNT value [Step C]. The uptime
starts from 0, and dt~=4sec inconsistency between kmsg and uptime is
observable.



Test 3: Testing with the full preserve boot time support with
"kernel/time/sched_clock" and "drivers/clocksource/arm_arch_timer":
Log will be:
[Step A]
[ 0.164564]
[ 0.166119] U-Boot 2015.04 (Apr 06 2017 - 12:28:41)
...
[ 4.357751]
[ 4.359259] Starting kernel ...
[Step B]
...
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff
max_cycles: 0x1ec02923e, max_idle_ns: 440795202125 ns
[ 4.638667] sched_clock: 56 bits at 8MHz, resolution 120ns, wraps
every 2199023255496ns
[ 4.638884] Console: colour dummy device 80x25
[ 4.639265] console [tty0] enabled
...

[Step C]
$ uptime > /dev/kmsg
[ 17.728591] 00:00:17 up 0 min, load average: 0.00, 0.00, 0.00

We can observe that the patch updates kmsg time with the time spent
before kernel starts [Step B]("kernel/time/sched_clock") and also
updates kernel uptime("drivers/clocksource/arm_arch_timer") in [Step C]
no inconsistency being present between kmsg and uptime.


Best Regards,
Bogdan
[1]
https://github.com/ARM-software/arm-trusted-firmware/blob/master/docs/firmware-design.md