lkml.org 
[lkml]   [2020]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: timers/core] posix-timers: Make clock_nanosleep() time namespace aware
    The following commit has been merged into the timers/core branch of tip:

    Commit-ID: 1088a867c70919d99d513ff00cd622d2988b8114
    Gitweb: https://git.kernel.org/tip/1088a867c70919d99d513ff00cd622d2988b8114
    Author: Andrei Vagin <avagin@openvz.org>
    AuthorDate: Tue, 12 Nov 2019 01:27:06
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitterDate: Mon, 13 Jan 2020 08:10:53 +01:00

    posix-timers: Make clock_nanosleep() time namespace aware

    clock_nanosleep() accepts absolute values of expiration time, if the
    TIMER_ABSTIME flag is set. This value is in the tasks time namespace,
    which has to be converted to the host time namespace.

    Co-developed-by: Dmitry Safonov <dima@arista.com>
    Signed-off-by: Andrei Vagin <avagin@openvz.org>
    Signed-off-by: Dmitry Safonov <dima@arista.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20191112012724.250792-18-dima@arista.com

    ---
    kernel/time/posix-stubs.c | 12 ++++++++++--
    kernel/time/posix-timers.c | 17 +++++++++++++++--
    2 files changed, 25 insertions(+), 4 deletions(-)

    diff --git a/kernel/time/posix-stubs.c b/kernel/time/posix-stubs.c
    index 5745a13..fcb3b21 100644
    --- a/kernel/time/posix-stubs.c
    +++ b/kernel/time/posix-stubs.c
    @@ -129,6 +129,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
    struct __kernel_timespec __user *, rmtp)
    {
    struct timespec64 t;
    + ktime_t texp;

    switch (which_clock) {
    case CLOCK_REALTIME:
    @@ -147,7 +148,10 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
    rmtp = NULL;
    current->restart_block.nanosleep.type = rmtp ? TT_NATIVE : TT_NONE;
    current->restart_block.nanosleep.rmtp = rmtp;
    - return hrtimer_nanosleep(timespec64_to_ktime(t), flags & TIMER_ABSTIME ?
    + texp = timespec64_to_ktime(t);
    + if (flags & TIMER_ABSTIME)
    + texp = timens_ktime_to_host(which_clock, texp);
    + return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
    HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
    which_clock);
    }
    @@ -218,6 +222,7 @@ SYSCALL_DEFINE4(clock_nanosleep_time32, clockid_t, which_clock, int, flags,
    struct old_timespec32 __user *, rmtp)
    {
    struct timespec64 t;
    + ktime_t texp;

    switch (which_clock) {
    case CLOCK_REALTIME:
    @@ -236,7 +241,10 @@ SYSCALL_DEFINE4(clock_nanosleep_time32, clockid_t, which_clock, int, flags,
    rmtp = NULL;
    current->restart_block.nanosleep.type = rmtp ? TT_COMPAT : TT_NONE;
    current->restart_block.nanosleep.compat_rmtp = rmtp;
    - return hrtimer_nanosleep(timespec64_to_ktime(t), flags & TIMER_ABSTIME ?
    + texp = timespec64_to_ktime(t);
    + if (flags & TIMER_ABSTIME)
    + texp = timens_ktime_to_host(which_clock, texp);
    + return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
    HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
    which_clock);
    }
    diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c
    index 75fee6e..ff0eb30 100644
    --- a/kernel/time/posix-timers.c
    +++ b/kernel/time/posix-timers.c
    @@ -1228,6 +1228,19 @@ static int common_nsleep(const clockid_t which_clock, int flags,
    which_clock);
    }

    +static int common_nsleep_timens(const clockid_t which_clock, int flags,
    + const struct timespec64 *rqtp)
    +{
    + ktime_t texp = timespec64_to_ktime(*rqtp);
    +
    + if (flags & TIMER_ABSTIME)
    + texp = timens_ktime_to_host(which_clock, texp);
    +
    + return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
    + HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
    + which_clock);
    +}
    +
    SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
    const struct __kernel_timespec __user *, rqtp,
    struct __kernel_timespec __user *, rmtp)
    @@ -1305,7 +1318,7 @@ static const struct k_clock clock_monotonic = {
    .clock_getres = posix_get_hrtimer_res,
    .clock_get_timespec = posix_get_monotonic_timespec,
    .clock_get_ktime = posix_get_monotonic_ktime,
    - .nsleep = common_nsleep,
    + .nsleep = common_nsleep_timens,
    .timer_create = common_timer_create,
    .timer_set = common_timer_set,
    .timer_get = common_timer_get,
    @@ -1354,7 +1367,7 @@ static const struct k_clock clock_boottime = {
    .clock_getres = posix_get_hrtimer_res,
    .clock_get_ktime = posix_get_boottime_ktime,
    .clock_get_timespec = posix_get_boottime_timespec,
    - .nsleep = common_nsleep,
    + .nsleep = common_nsleep_timens,
    .timer_create = common_timer_create,
    .timer_set = common_timer_set,
    .timer_get = common_timer_get,
    \
     
     \ /
      Last update: 2020-01-13 20:12    [W:3.242 / U:0.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site