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

Reply via email to