2021-02-10 10:45:19

by Hikaru Nishida

[permalink] [raw]
Subject: [RFC PATCH 1/2] timekeeping: Add timekeeping_adjust_boottime

From: Hikaru Nishida <[email protected]>

This introduces timekeeping_adjust_boottime() to give an interface to
modules that enables to advance CLOCK_BOOTTIME from userspace for
virtualized environments. Later patch introduces a sysfs interface
which calls this function.

Signed-off-by: Hikaru Nishida <[email protected]>
---

include/linux/timekeeping.h | 2 ++
kernel/time/timekeeping.c | 26 ++++++++++++++++++++++++++
2 files changed, 28 insertions(+)

diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h
index c6792cf01bc7..9bb91fbd945c 100644
--- a/include/linux/timekeeping.h
+++ b/include/linux/timekeeping.h
@@ -221,6 +221,8 @@ extern bool timekeeping_rtc_skipresume(void);

extern void timekeeping_inject_sleeptime64(const struct timespec64 *delta);

+extern int timekeeping_adjust_boottime(const struct timespec64 *delta);
+
/*
* struct ktime_timestanps - Simultaneous mono/boot/real timestamps
* @mono: Monotonic timestamp
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 6aee5768c86f..02892deede62 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1740,6 +1740,32 @@ void timekeeping_inject_sleeptime64(const struct timespec64 *delta)
}
#endif

+#if defined(CONFIG_BOOTTIME_ADJUSTMENT)
+/**
+ * timekeeping_adjust_boottime - Adjust CLOCK_BOOTTIME by adding a given delta
+ */
+int timekeeping_adjust_boottime(const struct timespec64 *delta)
+{
+ struct timekeeper *tk = &tk_core.timekeeper;
+ unsigned long flags;
+
+ if (!timespec64_valid_strict(delta))
+ return -EINVAL;
+
+ raw_spin_lock_irqsave(&timekeeper_lock, flags);
+ write_seqcount_begin(&tk_core.seq);
+
+ tk_update_sleep_time(tk, timespec64_to_ktime(*delta));
+ timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET);
+
+ write_seqcount_end(&tk_core.seq);
+ raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(timekeeping_adjust_boottime);
+#endif
+
/**
* timekeeping_resume - Resumes the generic timekeeping subsystem.
*/
--
2.30.0.478.g8a0d178c01-goog


2021-02-10 13:16:13

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [RFC PATCH 1/2] timekeeping: Add timekeeping_adjust_boottime

On Wed, Feb 10 2021 at 19:39, Hikaru Nishida wrote:
> From: Hikaru Nishida <[email protected]>
>
> This introduces timekeeping_adjust_boottime() to give an interface to
> modules that enables to advance CLOCK_BOOTTIME from userspace for
> virtualized environments. Later patch introduces a sysfs interface
> which calls this function.

Not going to happen. That's just wrong in several ways.

The underlying problem of virt and timekeeping needs to be fixed not
hacked around it.

Thanks,

tglx