Re: [PATCH v4 1/1] printk: fix zero-valued printk timestamps in early boot

"Roberto A. Foglietta" <[email protected]> Wed, 15 Apr 2026 21:23:32 +0200
Newsgroups org.kernel.vger.linux-embedded,org.kernel.vger.linux-kernel
Message-ID <CAJGKYO4d65gUBr5_hY0Z1XdwsxO31K8c25tDbGNuzBBU2RYXKQ@mail.gmail.com>
--000000000000fa11f9064f84a890
Content-Type: text/plain; charset="UTF-8"

On Wed, 15 Apr 2026 at 20:41, Geert Uytterhoeven <[email protected]> wrote:
>
> Hi Roberto,
...
> Thanks for your patch!
>
> > --- /dev/null
> > +++ kernel/printk/early_times.h
> > @@ -0,0 +1,26 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +
> > +#ifndef _EARLY_TIMES_H
> > +#define _EARLY_TIMES_H
> > +
> > +#include <linux/timekeeping.h>
> > +
> > +/*
> > + * Fencing isn't optional here, otherwise unreliable values displaying
> > + */
> > +#if defined(CONFIG_ARM64)
> > +             #include <asm/sysreg.h>
> > +             #define __early_raw_cycles ({ u64 val; \
> > +                 asm volatile("isb; mrs %0, cntvct_el0" : "=r"(val)); val; })
> > +#elif defined(CONFIG_X86_64)
> > +             #define __early_raw_cycles ({ u64 val; \
> > +                 asm volatile("lfence; rdtsc; shl $32, %%rdx; or %%rdx, %%rax" \
> > +                     : "=a"(val) : : "rdx"); val; })
> > +#elif defined(CONFIG_RISCV_TIMER)
> > +             #define __early_raw_cycles ({ u64 val; \
> > +                 asm volatile("fence; rdtime %0" : "=r"(val)); val; })
> > +#else
>
> All of these should be handled in arch/*/include/asm/early_times.h...
>
> > +             #define __early_raw_cycles 0
>
> ... while this should be in include/asm-generic/early_times.h.

In the last release of the patch, I decided to stick with the "single
point of hacking" approach

https://github.com/robang74/uchaosys/blob/v069/cnfg/printk-early-boot-timestamps-hack-v5.patch

and I developed it in a way that can be proposed in such "exceptional
way" for this very specific case:

+#if CONFIG_PRINTK_EARLY_BOOT_TIMINGS
+#include "early_times.h"
+ /*
+ * Very few developers are using this feature and they're expecting to deal
+ * with it as a single point of change hack to be further customised by them.
+ */
+ if (unlikely(!ts_nsec))
+ ts_nsec = __early_raw_cycles;
+#endif

As you can see the include uses double quotes to indicate that the
header is local and it is not supposed to belong to the formal three:
it is where everyone of us will put it when we are going to do dirty
tricks to reach somewhat result, in the same folder of the printk.c,
out-of-the-three.

Why is this a very special case?

- First of all because just a variable is provided by the macros set.
No hypothesis, just a variable as-is because most of the few users
that might be interested in are going to watch HOW the relative
sequences of events are happening. Moreover, there is no reason to
pretend (sell) a timestamp when the timestamp sub-system is not ready
to provide that feature: fairness first, by clarity. Previously the
time skew was from zeros and something, now from two different ways of
tagging the printk.

- Second, because there is a very limited use of it due to almost
immediate timestamp readiness. Therefore those who are interested,
they were hacking with very LOW level stuff (or BIOS for those are
constraint but that evilness in x86 arch). For those people the ASM
code is fine and it is very useful to have it in the same place. And
it is in the interest of those who maintain the kernel that those
people have a single point of hack for the major arch available.
Easier is for them to test different arches, far more improbable an
under-tested patch will reach a proposal upstream stage... and trust
me about "under-tested" because I am an expert on that field... ;-)
LOL

- Third, because every assumption has been removed, even the basics
>>10 shifts. Just something that appears as a variable emerging from a
local header and these two things together should ring some bells in
the head of those who have a little experience of firmware / embedded.
Few constructs are more vicious than macros that resemble variables...
;-)

> > +             if (unlikely(!ts_nsec))
> > +                     ts_nsec = __early_raw_cycles >> 10;
>
> As there can be lots of variation in the granularity of early timers,
> I think the shift should be moved in the arch-specific __early_raw_cycles,
> so it is only done when useful.
>

I am attaching the matured V5 patch that I tested against the 5.15.202
LTS kernel. Please, sit on the approach -- include"local-stuff.h" --
and let your judgement get soothed by time and PoVs. For sure one
change is probably a necessity, moving the Kconfig part into the DEBUG
section from the INIT where it stays by now. However, moving a feature
around the menuconfig is the last and less effort change in a TODO
list.

For sake of completeness, I am attaching the V5 matured patch. Will it
be refused because of its approach? Fine, at least the idea of that
approach has a patch that can be applied to something and people can
give it a try. Which add a practical degree of judgemental because
usually we are attracted by the beauty of perfection and purity,
something that Franco Battiato entitled "Inneres Auge" (a call from
above) but as complementary we are also keen to fall in love for those
bare-simple dirty-practical solution... in the same sense that song
was intending with a convoluted and educated paraphrase... LOL

Cheers, R-

--000000000000fa11f9064f84a890
Content-Type: text/x-patch; charset="US-ASCII"; 
	name="printk-early-boot-timestamps-hack-v5.patch"
Content-Disposition: attachment; 
	filename="printk-early-boot-timestamps-hack-v5.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mo0fht4z0>
X-Attachment-Id: f_mo0fht4z0

VGhpcyBpcyBhIGhlYXZpbHkgInJlZmFjdG9yZWQgYnkgaGFuZHMiIHBhdGNoIGZvciBMaW51eCBL
ZXJuZWwgNS4xNS4yMDIgTFRTCnRyeWluZyB0byBzb2x2ZSB0aGUgc291cmNlIHRyZWUgamFuaXRv
cmluZyB2cyAxLXNpbmdsZSBwbGFjZSBoYWNrIGZvciBoYWNrZXJzCmluIG5lZWQgZm9yIGEgc2lt
cGxlLWJhcmUgcHJvZmlsaW5nIHRvb2wgYW5kIGJhc2VkIG9uIHRoZSBwYXRjaCBWNCBzdWJtaXR0
ZWQgYnkKCkZyb206IFRpbSBCaXJkIDx0aW0uYmlyZEBzb255LmNvbT4KU3ViamVjdDogW1BBVENI
IHY0IDEvMV0gcHJpbnRrOiBmaXggemVyby12YWx1ZWQgcHJpbnRrIHRpbWVzdGFtcHMgaW4gZWFy
bHkgYm9vdApEYXRlOiBGcmksIDEwIEFwciAyMDI2IDE0OjM3OjQxIC0wNjAwCk1lc3NhZ2UtSUQ6
IDwyMDI2MDQxMDIwMzc0MS45OTc0MTAtMi10aW0uYmlyZEBzb255LmNvbT4KCkR1cmluZyBlYXJs
eSBib290LCBwcmludGsgdGltZXN0YW1wcyBhcmUgcmVwb3J0ZWQgYXMgemVybyBiZWZvcmUKa2Vy
bmVsIHRpbWVrZWVwaW5nIHN0YXJ0cyAoaS5lLiBiZWZvcmUgdGltZV9pbml0KCkpLiBUaGlzIGhp
bmRlcnMKYm9vdC10aW1lIG9wdGltaXphdGlvbiBlZmZvcnRzLiBUaGlzIHBlcmlvZCByYW5nZXMg
ZnJvbSAxNyB0byAxNzAwCm1pbGxpc2Vjb25kcyBvbiBkaWZmZXJlbnQgZW1iZWRkZWQgbWFjaGlu
ZXMgcnVubmluZyBMaW51eC4KCkFkZCBzdXBwb3J0IGZvciBlYXJseSB0aW1lc3RhbXBzIGJhc2Vk
IG9uIHByb2Nlc3NvciBjeWNsZS1nZW5lcmF0b3JzCnRoYXQgbmVlZCBubyBrZXJuZWwgaW5pdGlh
bGl6YXRpb24uVGhpcyBmZWF0dXJlIGlzbid0IGludGVuZGVkIGZvciBhIApnZW5lcmljIGRpc3Ry
byBrZXJuZWxzIGJ1dCBmb3IgdGVtcG9yYXJ5IHVzZSBkdXJpbmcga2VybmVsIGRldmVsb3BtZW50
CmFuZCBib290LXRpbWUgcmVzZWFyY2ggYW5kIG9wdGltaXphdGlvbiBieSBrZXJuZWwgaGFja2Vy
cyBvbmx5LgoKVGhpcyB5aWVsZHMgbm9uLXplcm8gdGltZXN0YW1wcyBmb3IgcHJpbnRrcyBmcm9t
IHRoZSB2ZXJ5IHN0YXJ0Cm9mIGtlcm5lbCBleGVjdXRpb24uIFRoZSB0aW1lc3RhbXBzIGFyZSBy
ZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YKYW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvdW50ZXIg
KGUuZy4gdHNjIG9uIHg4Nl82NCBhbmQgY250dmN0X2VsMApvbiBhcm02NCkuIEFmZmVjdGVkIHRp
bWVzdGFtcHMgcmVmbGVjdCBjeWNsZSBjb3VudGVyIHJlbGF0ZWQgdmFsdWVzCnNpbmNlIGluaXQg
KHVzdWFsbHkgbWFjaGluZSBwb3dlci1vbiBvciB2aXJ0dWFsIG1hY2hpbmUgc3RhcnQpIGluc3Rl
YWQKb2YgdGltZSBmcm9tIHRoZSBrZXJuZWwncyB0aW1la2VlcGluZyBpbml0aWFsaXphdGlvbi4g
VGhpcyByZXN1bHRzIGluCmEgZGlzY29udGludWl0eSBpbiB0aGUgcHJpbnRrIHRpbWVzdGFtcCB2
YWx1ZXMsIG9uZSB0aW1lLCB3aGVuCmtlcm5lbCB0aW1la2VlcGluZyBzdGFydHMuCgpTaWduZWQt
b2ZmLWJ5OiBUaW0gQmlyZCA8dGltLmJpcmRAc29ueS5jb20+ClNpZ25lZC1vZmYtYnk6IFJvYmVy
dG8gQS4gRm9nbGlldHRhIDxyb2JlcnRvLmZvZ2xpZXR0YUBnbWFpbC5jb20+Ci0tLQpWNSAtPiBW
NAogIFJhdGlvbmFsZTogc2luZ2xlIHBvaW50IG9mIGNoYW5nZSBoYWNrIGZvciBwcmludGsuIENv
ZGUgcmV3cml0dGVuLCBlbnRpcmVseS4KICBJdCBwcm92aWRlcyBhIGZlYXR1cmUgZm9yIGtlcm5l
bCBoYWNrZXJzIHdpbGxpbmcgdG8gcHJvZmlsaW5nIHRoZSBlYXJseSBib290CiAgd2l0aCBhIGJh
c2ljIHByaW50ayBhcHByb2FjaCAocmF0aGVyIHRoYW4gdXNpbmcgSFcgbW9uaXRvcnMgd2hpY2gg
bWlnaHQgbm90CiAgYmUgYXZhaWxhYmxlIG9yIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSkuIFRodXMs
IGl0IGlzIGEgZmlyc3QtbG9vayBvciBhIGxhc3QKICByZXNvcnQgaGFjayBwcm9maWxpbmcgZmVh
dHVyZS4gU29tZXRoaW5nIHRoYXQgaXNuJ3QgZ29vZCB0byBzcHJlYWQgYXJvdW5kCiAgdGhlIGtl
cm5lbCBzb3VyY2VzIHRyZWUgYW5kIGl0IGlzIGZpbmUgdG8gaGF2ZSBpbnRvIGEgc2luZ2xlIGhl
YWRlciBmaWxlLgpWMyAtPiBWNAogIFJlcGxhY2UgY29uZmlnIHZhcnMgd2l0aCBzaW5nbGUgb25l
OiBDT05GSUdfRUFSTFlfQ1lDTEVTX0tIWgogIFJlcGxhY2UgcnVudGltZSBjYWxpYnJhdGlvbiB3
aXRoIHN0YXRpYyBjb25maWcgdmFyaWFibGUKICBSZW1vdmUgcmVmZXJlbmNlIHRvIGdldF9jeWNs
ZXMoKQogIEFkZCBzdXBwb3J0IGZvciBSSVNDViBwbGF0Zm9ybXMKVjIgLT4gVjMKICBEZWZhdWx0
IENPTkZJRyBvcHRpb24gdG8gJ24nCiAgTW92ZSBtb3JlIGNvZGUgaW50byBlYXJseV90aW1lcy5o
IChyZWR1Y2UgaWZkZWZzIGluIGluaXQvbWFpbi5jKQogIFVzZSBtYXRjaDY0IGhlbHBlciByb3V0
aW5lcwogIFVzZSBjeWNsZXNfdCBpbnN0ZWFkIG9mIHU2NCB0eXBlCiAgQWRkICNkZWZpbmVzIGZv
ciBFQVJMWV9DWUNMRVNfQklUIGFuZCBFQVJMWV9DWUNMRVNfTUFTSwogIEludmVydCBpZiBsb2dp
YyBpbiBhZGp1c3RfZWFybHlfdHMoKQpWMSAtPiBWMgogIFJlbW92ZSBjYWxpYnJhdGlvbiBDT05G
SUcgdmFycwogIEFkZCAnZGVwZW5kcyBvbicgdG8gcmVzdHJpY3QgYXJjaGVzICh0byBoYW5kbGUg
cHBjIGJ1ZykKICBBZGQgZWFybHlfdHNfb2Zmc2V0IHRvIGF2b2lkIGRpc2NvbnRpbnVpdHkKICBT
YXZlIGN5Y2xlcyBpbiB0c19uc2VjLCBhbmQgY29udmVydCBvbiBvdXRwdXQKICBNb3ZlIGNvbmRp
dGlvbmFsIGNvZGUgdG8gaW5jbHVkZSBmaWxlIGVhcmx5X3RpbWVzLmgKCi0tLSBhL2luaXQvS2Nv
bmZpZwkyMDI2LTA0LTE1IDExOjM0OjA1LjgyMzQzMzcxMiArMDIwMAorKysgYi9pbml0L0tjb25m
aWcJMjAyNi0wNC0xNSAxMTozNjoxMi43MDMzMzQ2MDQgKzAyMDAKQEAgLTgzMyw2ICs4MzMsMjcg
QEAgY29uZmlnIFBSSU5US19JTkRFWAogCiAJICBUaGVyZSBpcyBubyBhZGRpdGlvbmFsIHJ1bnRp
bWUgY29zdCB0byBwcmludGsgd2l0aCB0aGlzIGVuYWJsZWQuCiAKK2NvbmZpZyBQUklOVEtfRUFS
TFlfQk9PVF9USU1JTkdTCisJYm9vbCAiRWFybHkgYm9vdCBwcmludGsgc2hvd3MgdGltZXMgaW4g
cmF3IGN5Y2xlIGNvdW50ZXIgc3R5bGUiCisJZGVmYXVsdCAwCisJZGVwZW5kcyBvbiBQUklOVEsK
KwlkZXBlbmRzIG9uIEFSTTY0IHx8IFg4Nl82NCB8fCBSSVNDVl9USU1FUgorCXNlbGVjdCBQUklO
VEtfVElNRQorCWhlbHAKKwkgIEJvb2xlYW4gdmFsdWUsIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisK
KwkgIFNldCB0aGlzIHRvIHByb3ZpZGUgY3ljbGVzIGluZm9ybWF0aW9uIGZvciBwcmludGtzIGlu
IGVhcmx5IGJvb3QKKwkgIChiZWZvcmUgdGhlIHN0YXJ0IG9mIGtlcm5lbCB0aW1la2VlcGluZyks
IHRoYXQgd291bGQgb3RoZXJ3aXNlCisJICBzaG93IGFzIDAuIFByb2ZpbGluZyBieSByZWxhdGl2
ZSBtb25vdG9uaWMgdmFsdWVzLCBub3QgdGltZS4KKworCSAgTm90ZSB0aGF0IHRoaXMgY2F1c2Vz
IHRoZSBrZXJuZWwgdG8gc2hvdywgZm9yIHNvbWUgZWFybHkgcHJpbnRrcywKKwkgIGN5Y2xlcyB0
aGF0IGFyZSByZWxhdGl2ZSB0byBwcm9jZXNzb3IgcG93ZXIgb24sIGluc3RlYWQgb2YKKwkgIHJl
bGF0aXZlIHRvIHRoZSBzdGFydCBvZiBrZXJuZWwgdGltZWtlZXBpbmcuIFdoZW4ga2VybmVsCisJ
ICB0aW1la2VlcGluZyBzdGFydHMsIHRoZSB0aW1lc3RhbXBzIHZhbHVlcyByZXNldCwgY2F1c2lu
ZworCSAgYSBkaXNjb250aW51aXR5IGluIHRoZSB0aW1lc3RhbXAgdmFsdWVzLgorCisJICBJZiB1
bnN1cmUsIGtlZXAgaXQgZGlzYWJsZWQgYXMgcGVyIGl0cyBkZWZhdWx0LgorCiAjCiAjIEFyY2hp
dGVjdHVyZXMgd2l0aCBhbiB1bnJlbGlhYmxlIHNjaGVkX2Nsb2NrKCkgc2hvdWxkIHNlbGVjdCB0
aGlzOgogIwotLS0gL2Rldi9udWxsCTIwMjYtMDQtMTAgMTU6MzU6NDkuNjU5NzQxNjQ0ICswMjAw
CisrKyBiL2tlcm5lbC9wcmludGsvZWFybHlfdGltZXMuaAkyMDI2LTA0LTE1IDExOjMyOjQ5Ljc4
NjcyODYwMiArMDIwMApAQCAtMCwwICsxLDI2IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll
cjogR1BMLTIuMCAqLworCisjaWZuZGVmIF9FQVJMWV9USU1FU19ICisjZGVmaW5lIF9FQVJMWV9U
SU1FU19ICisKKyNpbmNsdWRlIDxsaW51eC90aW1la2VlcGluZy5oPgorCisvKgorICogRmVuY2lu
ZyBpc24ndCBvcHRpb25hbCBoZXJlLCBvdGhlcndpc2UgdW5yZWxpYWJsZSB2YWx1ZXMgZGlzcGxh
eWluZworICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJNNjQpCisJI2luY2x1ZGUgPGFzbS9zeXNy
ZWcuaD4KKwkjZGVmaW5lIF9fZWFybHlfcmF3X2N5Y2xlcyAoeyB1NjQgdmFsOyBcCisJCWFzbSB2
b2xhdGlsZSgiaXNiOyBtcnMgJTAsIGNudHZjdF9lbDAiIDogIj1yIih2YWwpKTsgdmFsOyB9KQor
I2VsaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCSNkZWZpbmUgX19lYXJseV9yYXdfY3ljbGVz
ICh7IHU2NCB2YWw7IFwKKwkJYXNtIHZvbGF0aWxlKCJsZmVuY2U7IHJkdHNjOyBzaGwgJDMyLCAl
JXJkeDsgb3IgJSVyZHgsICUlcmF4IiBcCisJCQk6ICI9YSIodmFsKSA6IDogInJkeCIpOyB2YWw7
IH0pCisjZWxpZiBkZWZpbmVkKENPTkZJR19SSVNDVl9USU1FUikKKwkjZGVmaW5lIF9fZWFybHlf
cmF3X2N5Y2xlcyAoeyB1NjQgdmFsOyBcCisJCWFzbSB2b2xhdGlsZSgiZmVuY2U7IHJkdGltZSAl
MCIgOiAiPXIiKHZhbCkpOyB2YWw7IH0pCisjZWxzZQorCSNkZWZpbmUgX19lYXJseV9yYXdfY3lj
bGVzIDAKKyNlbmRpZgorCisjZW5kaWYgLyogX0VBUkxZX1RJTUVTX0ggKi8KLS0tIGEva2VybmVs
L3ByaW50ay9wcmludGsuYwkyMDI2LTA0LTE1IDExOjM5OjU1LjM3MjA2NjgwMiArMDIwMAorKysg
Yi9rZXJuZWwvcHJpbnRrL3ByaW50ay5jCTIwMjYtMDQtMTUgMTE6Mzk6MzMuNDU4OTUzNTgyICsw
MjAwCkBAIC0yMTUxLDYgKzIxNTEsMTYgQEAgaW50IHZwcmludGtfc3RvcmUoaW50IGZhY2lsaXR5
LCBpbnQgbGV2ZQogCSAqLwogCXRzX25zZWMgPSBsb2NhbF9jbG9jaygpOwogCisjaWYgQ09ORklH
X1BSSU5US19FQVJMWV9CT09UX1RJTUlOR1MKKyNpbmNsdWRlICJlYXJseV90aW1lcy5oIgorCS8q
CisJICogVmVyeSBmZXcgZGV2ZWxvcGVycyBhcmUgdXNpbmcgdGhpcyBmZWF0dXJlIGFuZCB0aGV5
J3JlIGV4cGVjdGluZyB0byBkZWFsCisJICogd2l0aCBpdCBhcyBhIHNpbmdsZSBwb2ludCBvZiBj
aGFuZ2UgaGFjayB0byBiZSBmdXJ0aGVyIGN1c3RvbWlzZWQgYnkgdGhlbS4KKwkgKi8KKwlpZiAo
dW5saWtlbHkoIXRzX25zZWMpKQorCQl0c19uc2VjID0gX19lYXJseV9yYXdfY3ljbGVzOworI2Vu
ZGlmCisKIAlpZiAoIXByaW50a19lbnRlcl9pcnFzYXZlKHJlY3Vyc2lvbl9wdHIsIGlycWZsYWdz
KSkKIAkJcmV0dXJuIDA7CiAK
--000000000000fa11f9064f84a890--