From: Alexander Sverdlin <[email protected]> Add CLOCK_MONOTONIC_RAW to the existing clock_gettime() vDSO implementation. This is based on the ideas of Jason Vas Dias and comments of Thomas Gleixner.
Test program from the previous patch shows the following improvement: Clock Before After Diff ----- ------ ----- ---- CLOCK_MONOTONIC_RAW 44.9M 359.6M +700% Link: https://lore.kernel.org/patchwork/patch/933583/ Link: https://bugzilla.kernel.org/show_bug.cgi?id=198961 Cc: Thomas Gleixner <[email protected]> Cc: Jason Vas Dias <[email protected]> Cc: Andy Lutomirski <[email protected]> Signed-off-by: Alexander Sverdlin <[email protected]> --- arch/x86/entry/vsyscall/vsyscall_gtod.c | 6 ++++++ arch/x86/include/asm/vgtod.h | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/x86/entry/vsyscall/vsyscall_gtod.c b/arch/x86/entry/vsyscall/vsyscall_gtod.c index 64b1e7c..402c3b3 100644 --- a/arch/x86/entry/vsyscall/vsyscall_gtod.c +++ b/arch/x86/entry/vsyscall/vsyscall_gtod.c @@ -69,6 +69,12 @@ void update_vsyscall(struct timekeeper *tk) base->mult = tk->tkr_mono.mult; base->shift = tk->tkr_mono.shift; + base = &vdata->basetime[CLOCK_MONOTONIC_RAW]; + base->sec = tk->raw_sec; + base->nsec = tk->tkr_raw.xtime_nsec; + base->mult = tk->tkr_raw.mult; + base->shift = tk->tkr_raw.shift; + base = &vdata->basetime[CLOCK_REALTIME_COARSE]; base->sec = tk->xtime_sec; base->nsec = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift; diff --git a/arch/x86/include/asm/vgtod.h b/arch/x86/include/asm/vgtod.h index b1f6df3..1fb7048 100644 --- a/arch/x86/include/asm/vgtod.h +++ b/arch/x86/include/asm/vgtod.h @@ -30,7 +30,8 @@ struct vgtod_ts { }; #define VGTOD_BASES (CLOCK_TAI + 1) -#define VGTOD_HRES (BIT(CLOCK_REALTIME) | BIT(CLOCK_MONOTONIC) | BIT(CLOCK_TAI)) +#define VGTOD_HRES (BIT(CLOCK_REALTIME) | BIT(CLOCK_MONOTONIC) | \ + BIT(CLOCK_MONOTONIC_RAW) | BIT(CLOCK_TAI)) #define VGTOD_COARSE (BIT(CLOCK_REALTIME_COARSE) | BIT(CLOCK_MONOTONIC_COARSE)) /* -- 2.4.6

