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 06/37] alarmtimer: Provide get_timespec() callback
    Date
    From: Andrei Vagin <avagin@gmail.com>

    The upcoming support for time namespaces requires to have access to:
    - The time in a task's time namespace for sys_clock_gettime()
    - The time in the root name space for common_timer_get()

    Wire up alarm bases with get_timespec().

    Suggested-by: Thomas Gleixner <tglx@linutronix.de>
    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/posix-timers.h | 3 +++
    kernel/time/alarmtimer.c | 8 ++++++--
    kernel/time/posix-timers.c | 4 ++--
    3 files changed, 11 insertions(+), 4 deletions(-)

    diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h
    index b20798fc5191..fe13ab265213 100644
    --- a/include/linux/posix-timers.h
    +++ b/include/linux/posix-timers.h
    @@ -127,4 +127,7 @@ void set_process_cpu_timer(struct task_struct *task, unsigned int clock_idx,
    void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new);

    void posixtimer_rearm(struct kernel_siginfo *info);
    +
    +int posix_get_timespec(clockid_t which_clock, struct timespec64 *tp);
    +int posix_get_boottime_timespec(const clockid_t which_clock, struct timespec64 *tp);
    #endif
    diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
    index 37254eb64459..d9e6baa9976a 100644
    --- a/kernel/time/alarmtimer.c
    +++ b/kernel/time/alarmtimer.c
    @@ -37,12 +37,15 @@
    * @lock: Lock for syncrhonized access to the base
    * @timerqueue: Timerqueue head managing the list of events
    * @get_ktime: Function to read the time correlating to the base
    + * @get_timespec: Function to read the namespace time correlating to the base
    * @base_clockid: clockid for the base
    */
    static struct alarm_base {
    spinlock_t lock;
    struct timerqueue_head timerqueue;
    ktime_t (*get_ktime)(void);
    + int (*get_timespec)(const clockid_t which_clock,
    + struct timespec64 *tp);
    clockid_t base_clockid;
    } alarm_bases[ALARM_NUMTYPE];

    @@ -657,8 +660,7 @@ static int alarm_clock_get_timespec(clockid_t which_clock, struct timespec64 *tp
    if (!alarmtimer_get_rtcdev())
    return -EINVAL;

    - *tp = ktime_to_timespec64(base->get_ktime());
    - return 0;
    + return base->get_timespec(base->base_clockid, tp);
    }

    /**
    @@ -869,8 +871,10 @@ static int __init alarmtimer_init(void)
    /* Initialize alarm bases */
    alarm_bases[ALARM_REALTIME].base_clockid = CLOCK_REALTIME;
    alarm_bases[ALARM_REALTIME].get_ktime = &ktime_get_real;
    + alarm_bases[ALARM_REALTIME].get_timespec = posix_get_timespec,
    alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
    alarm_bases[ALARM_BOOTTIME].get_ktime = &ktime_get_boottime;
    + alarm_bases[ALARM_BOOTTIME].get_timespec = posix_get_boottime_timespec;
    for (i = 0; i < ALARM_NUMTYPE; i++) {
    timerqueue_init_head(&alarm_bases[i].timerqueue);
    spin_lock_init(&alarm_bases[i].lock);
    diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c
    index a71e43178a7d..a600b8b3e9bf 100644
    --- a/kernel/time/posix-timers.c
    +++ b/kernel/time/posix-timers.c
    @@ -188,7 +188,7 @@ static int posix_clock_realtime_adj(const clockid_t which_clock,
    /*
    * Get monotonic time for posix timers
    */
    -static int posix_get_timespec(clockid_t which_clock, struct timespec64 *tp)
    +int posix_get_timespec(clockid_t which_clock, struct timespec64 *tp)
    {
    ktime_get_ts64(tp);
    return 0;
    @@ -223,7 +223,7 @@ static int posix_get_coarse_res(const clockid_t which_clock, struct timespec64 *
    return 0;
    }

    -static int posix_get_boottime_timespec(const clockid_t which_clock, struct timespec64 *tp)
    +int posix_get_boottime_timespec(const clockid_t which_clock, struct timespec64 *tp)
    {
    ktime_get_boottime_ts64(tp);
    return 0;
    --
    2.22.0
    \
     
     \ /
      Last update: 2019-07-30 00:03    [W:4.923 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site