]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
posix-clocks: Wire up clock_gettime() with timens offsets
authorAndrei Vagin <avagin@openvz.org>
Tue, 12 Nov 2019 01:27:00 +0000 (01:27 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 14 Jan 2020 11:20:52 +0000 (12:20 +0100)
Adjust monotonic and boottime clocks with per-timens offsets.  As the
result a process inside time namespace will see timers and clocks corrected
to offsets that were set when the namespace was created

Note that applications usually go through vDSO to get time, which is not
yet adjusted. Further changes will complete time namespace virtualisation
with vDSO support.

Co-developed-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Andrei Vagin <avagin@gmail.com>
Signed-off-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20191112012724.250792-12-dima@arista.com
kernel/time/alarmtimer.c
kernel/time/posix-stubs.c
kernel/time/posix-timers.c

index 4d8c90546635432f33a254b1f947d26c2c59b828..9a8e81bc4ec2627088a9e15039e9e19a0b1e04b9 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/freezer.h>
 #include <linux/compat.h>
 #include <linux/module.h>
+#include <linux/time_namespace.h>
 
 #include "posix-timers.h"
 
@@ -886,6 +887,12 @@ static struct platform_driver alarmtimer_driver = {
        }
 };
 
+static void get_boottime_timespec(struct timespec64 *tp)
+{
+       ktime_get_boottime_ts64(tp);
+       timens_add_boottime(tp);
+}
+
 /**
  * alarmtimer_init - Initialize alarm timer code
  *
@@ -906,7 +913,7 @@ static int __init alarmtimer_init(void)
        alarm_bases[ALARM_REALTIME].get_timespec = ktime_get_real_ts64,
        alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
        alarm_bases[ALARM_BOOTTIME].get_ktime = &ktime_get_boottime;
-       alarm_bases[ALARM_BOOTTIME].get_timespec = ktime_get_boottime_ts64;
+       alarm_bases[ALARM_BOOTTIME].get_timespec = get_boottime_timespec;
        for (i = 0; i < ALARM_NUMTYPE; i++) {
                timerqueue_init_head(&alarm_bases[i].timerqueue);
                spin_lock_init(&alarm_bases[i].lock);
index 20c65a7d4e3a5190482c5aeff6e408907f71a7b6..bcbaa2045f5e8027129cc174033e8fe0304f1aa3 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/ktime.h>
 #include <linux/timekeeping.h>
 #include <linux/posix-timers.h>
+#include <linux/time_namespace.h>
 #include <linux/compat.h>
 
 #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
@@ -77,9 +78,11 @@ int do_clock_gettime(clockid_t which_clock, struct timespec64 *tp)
                break;
        case CLOCK_MONOTONIC:
                ktime_get_ts64(tp);
+               timens_add_monotonic(tp);
                break;
        case CLOCK_BOOTTIME:
                ktime_get_boottime_ts64(tp);
+               timens_add_boottime(tp);
                break;
        default:
                return -EINVAL;
index fe1de4f71ace6d348ea5915a16a949c25933b573..d26b915b227aee079305e642f44f2ad108fb1b7b 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/hashtable.h>
 #include <linux/compat.h>
 #include <linux/nospec.h>
+#include <linux/time_namespace.h>
 
 #include "timekeeping.h"
 #include "posix-timers.h"
@@ -195,6 +196,7 @@ static int posix_clock_realtime_adj(const clockid_t which_clock,
 static int posix_get_monotonic_timespec(clockid_t which_clock, struct timespec64 *tp)
 {
        ktime_get_ts64(tp);
+       timens_add_monotonic(tp);
        return 0;
 }
 
@@ -209,6 +211,7 @@ static ktime_t posix_get_monotonic_ktime(clockid_t which_clock)
 static int posix_get_monotonic_raw(clockid_t which_clock, struct timespec64 *tp)
 {
        ktime_get_raw_ts64(tp);
+       timens_add_monotonic(tp);
        return 0;
 }
 
@@ -223,6 +226,7 @@ static int posix_get_monotonic_coarse(clockid_t which_clock,
                                                struct timespec64 *tp)
 {
        ktime_get_coarse_ts64(tp);
+       timens_add_monotonic(tp);
        return 0;
 }
 
@@ -235,6 +239,7 @@ static int posix_get_coarse_res(const clockid_t which_clock, struct timespec64 *
 static int posix_get_boottime_timespec(const clockid_t which_clock, struct timespec64 *tp)
 {
        ktime_get_boottime_ts64(tp);
+       timens_add_boottime(tp);
        return 0;
 }