lkml.org 
[lkml]   [2019]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv5 11/37] kernel: Add do_timens_ktime_to_host() helper
    Date
    From: Andrei Vagin <avagin@gmail.com>

    The helper subtracts namespace's clock offset from the given time
    and checks that the result is in [0, KTIME_MAX].

    Signed-off-by: Andrei Vagin <avagin@gmail.com>
    Co-developed-by: Dmitry Safonov <dima@arista.com>
    Signed-off-by: Dmitry Safonov <dima@arista.com>
    ---
    include/linux/time_namespace.h | 17 ++++++++++++++
    kernel/time_namespace.c | 43 ++++++++++++++++++++++++++++++++++
    2 files changed, 60 insertions(+)

    diff --git a/include/linux/time_namespace.h b/include/linux/time_namespace.h
    index 334c1a1c6607..9ba9664ff0ab 100644
    --- a/include/linux/time_namespace.h
    +++ b/include/linux/time_namespace.h
    @@ -56,6 +56,18 @@ static inline void timens_add_boottime(struct timespec64 *ts)
    *ts = timespec64_add(*ts, ns_offsets->boottime);
    }

    +ktime_t do_timens_ktime_to_host(clockid_t clockid, ktime_t tim,
    + struct timens_offsets *offsets);
    +static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
    +{
    + struct timens_offsets *offsets = current->nsproxy->time_ns->offsets;
    +
    + if (!offsets)
    + return tim;
    +
    + return do_timens_ktime_to_host(clockid, tim, offsets);
    +}
    +
    #else
    static inline struct time_namespace *get_time_ns(struct time_namespace *ns)
    {
    @@ -82,6 +94,11 @@ static inline int timens_on_fork(struct nsproxy *nsproxy, struct task_struct *ts

    static inline void timens_add_monotonic(struct timespec64 *ts) {}
    static inline void timens_add_boottime(struct timespec64 *ts) {}
    +
    +static inline ktime_t timens_ktime_to_host(clockid_t clockid, ktime_t tim)
    +{
    + return tim;
    +}
    #endif

    #endif /* _LINUX_TIMENS_H */
    diff --git a/kernel/time_namespace.c b/kernel/time_namespace.c
    index f849c59f1108..9807c5c90cb2 100644
    --- a/kernel/time_namespace.c
    +++ b/kernel/time_namespace.c
    @@ -16,6 +16,49 @@
    #include <linux/err.h>
    #include <linux/mm.h>

    +ktime_t do_timens_ktime_to_host(clockid_t clockid, ktime_t tim,
    + struct timens_offsets *ns_offsets)
    +{
    + ktime_t offset;
    +
    + switch (clockid) {
    + case CLOCK_MONOTONIC:
    + offset = timespec64_to_ktime(ns_offsets->monotonic);
    + break;
    + case CLOCK_BOOTTIME:
    + case CLOCK_BOOTTIME_ALARM:
    + offset = timespec64_to_ktime(ns_offsets->boottime);
    + break;
    + default:
    + return tim;
    + }
    +
    + /*
    + * Check that @tim value is in [offset, KTIME_MAX + offset]
    + * and subtract offset.
    + */
    + if (tim < offset) {
    + /*
    + * User can specify @tim *absolute* value - if it's lesser than
    + * the time namespace's offset - it's already expired.
    + */
    + tim = 0;
    + } else if (KTIME_MAX - tim < -offset) {
    + /*
    + * User-supplied @tim may be close or even equal KTIME_MAX
    + * and time namespace offset can be negative.
    + * Let's check (tim - offset) for an overflow.
    + * Return KTIME_MAX in such case, as the time value is
    + * thousands *years* in future anyway.
    + */
    + tim = KTIME_MAX;
    + } else {
    + tim = ktime_sub(tim, offset);
    + }
    +
    + return tim;
    +}
    +
    static struct ucounts *inc_time_namespaces(struct user_namespace *ns)
    {
    return inc_ucount(ns, current_euid(), UCOUNT_TIME_NAMESPACES);
    --
    2.22.0
    \
     
     \ /
      Last update: 2019-07-30 00:03    [W:4.194 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site