• Thomas Gleixner's avatar
    posix-timers: Handle relative posix-timers correctly · 67edab48
    Thomas Gleixner authored
    The recent rework of the posix timer internals broke the magic posix
    mechanism, which requires that relative timers are not affected by
    modifications of the underlying clock. That means relative CLOCK_REALTIME
    timers cannot use CLOCK_REALTIME, because that can be set and adjusted. The
    underlying hrtimer switches the clock for these timers to CLOCK_MONOTONIC.
    
    That still works, but reading the remaining time of such a timer has been
    broken in the rework. The old code used the hrtimer internals directly and
    avoided the posix clock callbacks. Now common_timer_get() uses the
    underlying kclock->timer_get() callback, which is still CLOCK_REALTIME
    based. So the remaining time of such a timer is calculated against the
    wrong time base.
    
    Handle it by switching the k_itimer->kclock pointer according to the
    resulting hrtimer mode. k_itimer->it_clock still contains CLOCK_REALTIME
    because the timer might be set with ABSTIME later and then it needs to
    switch back to the realtime posix clock implementation.
    
    Fixes: eae1c4ae ("posix-timers: Make use of cancel/arm callbacks")
    Reported-by: default avatarAndrei Vagin <avagin@virtuozzo.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Cyrill Gorcunov <gorcunov@openvz.org>
    Link: http://lkml.kernel.org/r/20170609201156.GB21491@outlook.office365.com
    67edab48
posix-timers.c 32.4 KB