Commit 5a590f35 authored by Andrei Vagin's avatar Andrei Vagin Committed by Thomas Gleixner

posix-clocks: Wire up clock_gettime() with timens offsets

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: default avatarDmitry Safonov <dima@arista.com>
Signed-off-by: default avatarAndrei Vagin <avagin@gmail.com>
Signed-off-by: default avatarDmitry Safonov <dima@arista.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20191112012724.250792-12-dima@arista.com
parent 198fa445
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/freezer.h> #include <linux/freezer.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/time_namespace.h>
#include "posix-timers.h" #include "posix-timers.h"
...@@ -886,6 +887,12 @@ static struct platform_driver alarmtimer_driver = { ...@@ -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 * alarmtimer_init - Initialize alarm timer code
* *
...@@ -906,7 +913,7 @@ static int __init alarmtimer_init(void) ...@@ -906,7 +913,7 @@ static int __init alarmtimer_init(void)
alarm_bases[ALARM_REALTIME].get_timespec = ktime_get_real_ts64, alarm_bases[ALARM_REALTIME].get_timespec = ktime_get_real_ts64,
alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME; alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
alarm_bases[ALARM_BOOTTIME].get_ktime = &ktime_get_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++) { for (i = 0; i < ALARM_NUMTYPE; i++) {
timerqueue_init_head(&alarm_bases[i].timerqueue); timerqueue_init_head(&alarm_bases[i].timerqueue);
spin_lock_init(&alarm_bases[i].lock); spin_lock_init(&alarm_bases[i].lock);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/ktime.h> #include <linux/ktime.h>
#include <linux/timekeeping.h> #include <linux/timekeeping.h>
#include <linux/posix-timers.h> #include <linux/posix-timers.h>
#include <linux/time_namespace.h>
#include <linux/compat.h> #include <linux/compat.h>
#ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
...@@ -77,9 +78,11 @@ int do_clock_gettime(clockid_t which_clock, struct timespec64 *tp) ...@@ -77,9 +78,11 @@ int do_clock_gettime(clockid_t which_clock, struct timespec64 *tp)
break; break;
case CLOCK_MONOTONIC: case CLOCK_MONOTONIC:
ktime_get_ts64(tp); ktime_get_ts64(tp);
timens_add_monotonic(tp);
break; break;
case CLOCK_BOOTTIME: case CLOCK_BOOTTIME:
ktime_get_boottime_ts64(tp); ktime_get_boottime_ts64(tp);
timens_add_boottime(tp);
break; break;
default: default:
return -EINVAL; return -EINVAL;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/hashtable.h> #include <linux/hashtable.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/nospec.h> #include <linux/nospec.h>
#include <linux/time_namespace.h>
#include "timekeeping.h" #include "timekeeping.h"
#include "posix-timers.h" #include "posix-timers.h"
...@@ -195,6 +196,7 @@ static int posix_clock_realtime_adj(const clockid_t which_clock, ...@@ -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) static int posix_get_monotonic_timespec(clockid_t which_clock, struct timespec64 *tp)
{ {
ktime_get_ts64(tp); ktime_get_ts64(tp);
timens_add_monotonic(tp);
return 0; return 0;
} }
...@@ -209,6 +211,7 @@ static ktime_t posix_get_monotonic_ktime(clockid_t which_clock) ...@@ -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) static int posix_get_monotonic_raw(clockid_t which_clock, struct timespec64 *tp)
{ {
ktime_get_raw_ts64(tp); ktime_get_raw_ts64(tp);
timens_add_monotonic(tp);
return 0; return 0;
} }
...@@ -223,6 +226,7 @@ static int posix_get_monotonic_coarse(clockid_t which_clock, ...@@ -223,6 +226,7 @@ static int posix_get_monotonic_coarse(clockid_t which_clock,
struct timespec64 *tp) struct timespec64 *tp)
{ {
ktime_get_coarse_ts64(tp); ktime_get_coarse_ts64(tp);
timens_add_monotonic(tp);
return 0; return 0;
} }
...@@ -235,6 +239,7 @@ static int posix_get_coarse_res(const clockid_t which_clock, struct timespec64 * ...@@ -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) static int posix_get_boottime_timespec(const clockid_t which_clock, struct timespec64 *tp)
{ {
ktime_get_boottime_ts64(tp); ktime_get_boottime_ts64(tp);
timens_add_boottime(tp);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment