lkml.org 
[lkml]   [2019]   [Nov]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv8 16/34] hrtimers: Prepare hrtimer_nanosleep() for time namespaces
    Date
    From: Andrei Vagin <avagin@gmail.com>

    clock_nanosleep() accepts absolute values of expiration time when
    TIMER_ABSTIME flag is set. This absolute value is inside the task's
    time namespace, and has to be converted to the host's time.

    There is timens_ktime_to_host() helper for converting time, but
    it accepts ktime argument.

    As a preparation, make hrtimer_nanosleep() accept a clock value in ktime
    instead of timespec64.

    Signed-off-by: Andrei Vagin <avagin@openvz.org>
    Co-developed-by: Dmitry Safonov <dima@arista.com>
    Signed-off-by: Dmitry Safonov <dima@arista.com>
    ---
    include/linux/hrtimer.h | 2 +-
    kernel/time/hrtimer.c | 8 ++++----
    kernel/time/posix-stubs.c | 4 ++--
    kernel/time/posix-timers.c | 4 +++-
    tools/perf/examples/bpf/5sec.c | 6 ++++--
    5 files changed, 14 insertions(+), 10 deletions(-)

    diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
    index 1f98b52118f0..07c7c7b8b5cc 100644
    --- a/include/linux/hrtimer.h
    +++ b/include/linux/hrtimer.h
    @@ -508,7 +508,7 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer,
    /* Precise sleep: */

    extern int nanosleep_copyout(struct restart_block *, struct timespec64 *);
    -extern long hrtimer_nanosleep(const struct timespec64 *rqtp,
    +extern long hrtimer_nanosleep(ktime_t rqtp,
    const enum hrtimer_mode mode,
    const clockid_t clockid);

    diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
    index 7f31932216a1..b331128bd585 100644
    --- a/kernel/time/hrtimer.c
    +++ b/kernel/time/hrtimer.c
    @@ -1910,7 +1910,7 @@ static long __sched hrtimer_nanosleep_restart(struct restart_block *restart)
    return ret;
    }

    -long hrtimer_nanosleep(const struct timespec64 *rqtp,
    +long hrtimer_nanosleep(ktime_t rqtp,
    const enum hrtimer_mode mode, const clockid_t clockid)
    {
    struct restart_block *restart;
    @@ -1923,7 +1923,7 @@ long hrtimer_nanosleep(const struct timespec64 *rqtp,
    slack = 0;

    hrtimer_init_sleeper_on_stack(&t, clockid, mode);
    - hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack);
    + hrtimer_set_expires_range_ns(&t.timer, rqtp, slack);
    ret = do_nanosleep(&t, mode);
    if (ret != -ERESTART_RESTARTBLOCK)
    goto out;
    @@ -1958,7 +1958,7 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,

    current->restart_block.nanosleep.type = rmtp ? TT_NATIVE : TT_NONE;
    current->restart_block.nanosleep.rmtp = rmtp;
    - return hrtimer_nanosleep(&tu, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
    + return hrtimer_nanosleep(timespec64_to_ktime(tu), HRTIMER_MODE_REL, CLOCK_MONOTONIC);
    }

    #endif
    @@ -1978,7 +1978,7 @@ SYSCALL_DEFINE2(nanosleep_time32, struct old_timespec32 __user *, rqtp,

    current->restart_block.nanosleep.type = rmtp ? TT_COMPAT : TT_NONE;
    current->restart_block.nanosleep.compat_rmtp = rmtp;
    - return hrtimer_nanosleep(&tu, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
    + return hrtimer_nanosleep(timespec64_to_ktime(tu), HRTIMER_MODE_REL, CLOCK_MONOTONIC);
    }
    #endif

    diff --git a/kernel/time/posix-stubs.c b/kernel/time/posix-stubs.c
    index edaf075d1ee4..2ccefc9ce184 100644
    --- a/kernel/time/posix-stubs.c
    +++ b/kernel/time/posix-stubs.c
    @@ -147,7 +147,7 @@ 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(&t, flags & TIMER_ABSTIME ?
    + return hrtimer_nanosleep(timespec64_to_ktime(t), flags & TIMER_ABSTIME ?
    HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
    which_clock);
    }
    @@ -233,7 +233,7 @@ 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(&t, flags & TIMER_ABSTIME ?
    + return hrtimer_nanosleep(timespec64_to_ktime(t), 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 473082b0b57f..75fee6e39e5a 100644
    --- a/kernel/time/posix-timers.c
    +++ b/kernel/time/posix-timers.c
    @@ -1221,7 +1221,9 @@ SYSCALL_DEFINE2(clock_getres_time32, clockid_t, which_clock,
    static int common_nsleep(const clockid_t which_clock, int flags,
    const struct timespec64 *rqtp)
    {
    - return hrtimer_nanosleep(rqtp, flags & TIMER_ABSTIME ?
    + ktime_t texp = timespec64_to_ktime(*rqtp);
    +
    + return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
    HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
    which_clock);
    }
    diff --git a/tools/perf/examples/bpf/5sec.c b/tools/perf/examples/bpf/5sec.c
    index b9c203219691..e6b6181c6dc6 100644
    --- a/tools/perf/examples/bpf/5sec.c
    +++ b/tools/perf/examples/bpf/5sec.c
    @@ -41,9 +41,11 @@

    #include <bpf.h>

    -int probe(hrtimer_nanosleep, rqtp->tv_sec)(void *ctx, int err, long sec)
    +#define NSEC_PER_SEC 1000000000L
    +
    +int probe(hrtimer_nanosleep, rqtp)(void *ctx, int err, long long sec)
    {
    - return sec == 5;
    + return sec / NSEC_PER_SEC == 5ULL;
    }

    license(GPL);
    --
    2.24.0
    \
     
     \ /
      Last update: 2019-11-12 02:29    [W:5.100 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site