04 Oct, 2018

2 commits

  • [ Upstream commit 6fec64e1c92d5c715c6d0f50786daa7708266bde ]

    The posix timer ti_overrun handling is broken because the forwarding
    functions can return a huge number of overruns which does not fit in an
    int. As a consequence timer_getoverrun(2) and siginfo::si_overrun can turn
    into random number generators.

    As a first step to address that let the timer_forward() callbacks return
    the full 64 bit value.

    Cast it to (int) temporarily until k_itimer::ti_overrun is converted to
    64bit and the conversion to user space visible values is sanitized.

    Reported-by: Team OWL337
    Signed-off-by: Thomas Gleixner
    Acked-by: John Stultz
    Cc: Peter Zijlstra
    Cc: Michael Kerrisk
    Link: https://lkml.kernel.org/r/20180626132704.922098090@linutronix.de
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • [ Upstream commit 5f936e19cc0ef97dbe3a56e9498922ad5ba1edef ]

    Air Icy reported:

    UBSAN: Undefined behaviour in kernel/time/alarmtimer.c:811:7
    signed integer overflow:
    1529859276030040771 + 9223372036854775807 cannot be represented in type 'long long int'
    Call Trace:
    alarm_timer_nsleep+0x44c/0x510 kernel/time/alarmtimer.c:811
    __do_sys_clock_nanosleep kernel/time/posix-timers.c:1235 [inline]
    __se_sys_clock_nanosleep kernel/time/posix-timers.c:1213 [inline]
    __x64_sys_clock_nanosleep+0x326/0x4e0 kernel/time/posix-timers.c:1213
    do_syscall_64+0xb8/0x3a0 arch/x86/entry/common.c:290

    alarm_timer_nsleep() uses ktime_add() to add the current time and the
    relative expiry value. ktime_add() has no sanity checks so the addition
    can overflow when the relative timeout is large enough.

    Use ktime_add_safe() which has the necessary sanity checks in place and
    limits the result to the valid range.

    Fixes: 9a7adcf5c6de ("timers: Posix interface for alarm-timers")
    Reported-by: Team OWL337
    Signed-off-by: Thomas Gleixner
    Cc: John Stultz
    Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1807020926360.1595@nanos.tec.linutronix.de
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

26 Apr, 2018

1 commit

  • commit bd03143007eb9b03a7f2316c677780561b68ba2a upstream.

    syszbot reported the following debugobjects splat:

    ODEBUG: object is on stack, but not annotated
    WARNING: CPU: 0 PID: 4185 at lib/debugobjects.c:328

    RIP: 0010:debug_object_is_on_stack lib/debugobjects.c:327 [inline]
    debug_object_init+0x17/0x20 lib/debugobjects.c:391
    debug_hrtimer_init kernel/time/hrtimer.c:410 [inline]
    debug_init kernel/time/hrtimer.c:458 [inline]
    hrtimer_init+0x8c/0x410 kernel/time/hrtimer.c:1259
    alarm_init kernel/time/alarmtimer.c:339 [inline]
    alarm_timer_nsleep+0x164/0x4d0 kernel/time/alarmtimer.c:787
    SYSC_clock_nanosleep kernel/time/posix-timers.c:1226 [inline]
    SyS_clock_nanosleep+0x235/0x330 kernel/time/posix-timers.c:1204
    do_syscall_64+0x281/0x940 arch/x86/entry/common.c:287
    entry_SYSCALL_64_after_hwframe+0x42/0xb7

    This happens because the hrtimer for the alarm nanosleep is on stack, but
    the code does not use the proper debug objects initialization.

    Split out the code for the allocated use cases and invoke
    hrtimer_init_on_stack() for the nanosleep related functions.

    Reported-by: syzbot+a3e0726462b2e346a31d@syzkaller.appspotmail.com
    Signed-off-by: Thomas Gleixner
    Cc: John Stultz
    Cc: syzkaller-bugs@googlegroups.com
    Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1803261528270.1585@nanos.tec.linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

01 Sep, 2017

1 commit

  • When registering the rtc device to be used to handle alarm timers,
    get_device is used to ensure the device doesn't go away but the module can
    still be unloaded.

    Call try_module_get to ensure the rtc driver will not go away.

    Reported-and-tested-by: Michal Simek
    Signed-off-by: Alexandre Belloni
    Signed-off-by: Thomas Gleixner
    Acked-by: John Stultz
    Cc: Stephen Boyd
    Link: http://lkml.kernel.org/r/20170820220146.30969-1-alexandre.belloni@free-electrons.com

    Alexandre Belloni
     

18 Aug, 2017

1 commit

  • Currently the alarmtimer registers a wake-up source unconditionally,
    regardless of the system having a (wake-up capable) RTC or not.
    Hence the alarmtimer will always show up in
    /sys/kernel/debug/wakeup_sources, even if it is not available, and thus
    cannot be a wake-up source.

    To fix this, postpone registration until a wake-up capable RTC device is
    added.

    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: Miroslav Lichvar
    Cc: Richard Cochran
    Cc: Prarit Bhargava
    Cc: Stephen Boyd
    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: John Stultz

    Geert Uytterhoeven
     

30 Jun, 2017

1 commit

  • Usage of these apis and their compat versions makes
    the syscalls: clock_nanosleep and nanosleep and
    their compat implementations simpler.

    This is a preparatory patch to isolate data conversions to
    struct timespec64 at userspace boundaries. This helps contain
    the changes needed to transition to new y2038 safe types.

    Signed-off-by: Deepa Dinamani
    Signed-off-by: Al Viro

    Deepa Dinamani
     

14 Jun, 2017

5 commits


04 Jun, 2017

12 commits

  • All required callbacks are in place. Switch the alarm timer based posix
    interval timer callbacks to the common implementation and remove the
    incorrect private implementation.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211657.825471962@linutronix.de

    Thomas Gleixner
     
  • Preparatory change to utilize the common posix timer mechanisms.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211657.747567162@linutronix.de

    Thomas Gleixner
     
  • Preparatory change to utilize the common posix timer mechanisms.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211657.670026824@linutronix.de

    Thomas Gleixner
     
  • Preparatory change to utilize the common posix timer mechanisms.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211657.592676753@linutronix.de

    Thomas Gleixner
     
  • Preparatory change to utilize the common posix timer mechanisms.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211657.513694229@linutronix.de

    Thomas Gleixner
     
  • Preparatory change to utilize the common posix timer mechanisms.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211657.434598989@linutronix.de

    Thomas Gleixner
     
  • Preparatory patch to unify the alarm timer and hrtimer based posix interval
    timer handling.

    The interval is used as a criteria for rearming decisions so moving it out
    of the clock specific data structures allows later unification.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211656.563922908@linutronix.de

    Thomas Gleixner
     
  • None of these declarations is required outside of kernel/time. Move them to
    an internal header.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Cc: Christoph Hellwig
    Link: http://lkml.kernel.org/r/20170530211656.394803853@linutronix.de

    Thomas Gleixner
     
  • Having a IF_ENABLED(CONFIG_POSIX_TIMERS) inside of a
    #ifdef CONFIG_POSIX_TIMERS section is pointless.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20170530211655.975218056@linutronix.de

    Thomas Gleixner
     
  • Pick up urgent fixes to avoid conflicts.

    Thomas Gleixner
     
  • The alarmtimer code has another source of potentially rearming itself too
    fast. Interval timers with a very samll interval have a similar CPU hog
    effect as the previously fixed overflow issue.

    The reason is that alarmtimers do not implement the normal protection
    against this kind of problem which the other posix timer use:

    timer expires -> queue signal -> deliver signal -> rearm timer

    This scheme brings the rearming under scheduler control and prevents
    permanently firing timers which hog the CPU.

    Bringing this scheme to the alarm timer code is a major overhaul because it
    lacks all the necessary mechanisms completely.

    So for a quick fix limit the interval to one jiffie. This is not
    problematic in practice as alarmtimers are usually backed by an RTC for
    suspend which have 1 second resolution. It could be therefor argued that
    the resolution of this clock should be set to 1 second in general, but
    that's outside the scope of this fix.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: Kostya Serebryany
    Cc: syzkaller
    Cc: John Stultz
    Cc: Dmitry Vyukov
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20170530211655.896767100@linutronix.de

    Thomas Gleixner
     
  • Andrey reported a alartimer related RCU stall while fuzzing the kernel with
    syzkaller.

    The reason for this is an overflow in ktime_add() which brings the
    resulting time into negative space and causes immediate expiry of the
    timer. The following rearm with a small interval does not bring the timer
    back into positive space due to the same issue.

    This results in a permanent firing alarmtimer which hogs the CPU.

    Use ktime_add_safe() instead which detects the overflow and clamps the
    result to KTIME_SEC_MAX.

    Reported-by: Andrey Konovalov
    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: Kostya Serebryany
    Cc: syzkaller
    Cc: John Stultz
    Cc: Dmitry Vyukov
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20170530211655.802921648@linutronix.de

    Thomas Gleixner
     

27 May, 2017

2 commits

  • Some freezer related variables are only used when either CONFIG_POSIX_TIMER
    or CONFIG_RTC_CLASS are enabled. Hide them when both are off.

    Fixes: d3ba5a9a345b ("posix-timers: Make posix_clocks immutable")
    Reported-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner
    Cc: Christoph Helwig

    Thomas Gleixner
     
  • There are no more modular users providing a posix clock. The register
    function is now pointless so the posix clock array can be initialized
    statically at compile time and the array including the various k_clock
    structs can be marked 'const'.

    Inspired by changes in the Grsecurity patch set, but done proper.

    [ tglx: Massaged changelog and fixed the POSIX_TIMER=n case ]

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Thomas Gleixner
    Cc: Mike Travis
    Cc: Dimitri Sivanich
    Link: http://lkml.kernel.org/r/20170526090311.3377-3-hch@lst.de

    Christoph Hellwig
     

15 Apr, 2017

4 commits

  • struct timespec is not y2038 safe on 32 bit machines. Replace uses of
    struct timespec with struct timespec64 in the kernel.

    The syscall interfaces themselves will be changed in a separate series.

    Note that the restart_block parameter for nanosleep has also been left
    unchanged and will be part of syscall series noted above.

    Signed-off-by: Deepa Dinamani
    Cc: y2038@lists.linaro.org
    Cc: john.stultz@linaro.org
    Cc: arnd@arndb.de
    Link: http://lkml.kernel.org/r/1490555058-4603-8-git-send-email-deepa.kernel@gmail.com
    Signed-off-by: Thomas Gleixner

    Deepa Dinamani
     
  • struct timespec is not y2038 safe on 32 bit machines. Replace uses of
    struct timespec with struct timespec64 in the kernel.

    struct itimerspec internally uses struct timespec. Use struct itimerspec64
    which uses struct timespec64.

    The syscall interfaces themselves will be changed in a separate series.

    Signed-off-by: Deepa Dinamani
    Cc: y2038@lists.linaro.org
    Cc: john.stultz@linaro.org
    Cc: arnd@arndb.de
    Link: http://lkml.kernel.org/r/1490555058-4603-7-git-send-email-deepa.kernel@gmail.com
    Signed-off-by: Thomas Gleixner

    Deepa Dinamani
     
  • struct timespec is not y2038 safe on 32 bit machines. Replace uses of
    struct timespec with struct timespec64 in the kernel. The syscall
    interfaces themselves will be changed in a separate series.

    The clock_getres() interface has also been changed to use timespec64 even
    though this particular interface is not affected by the y2038 problem. This
    helps verification for internal kernel code for y2038 readiness by getting
    rid of time_t/ timeval/ timespec completely.

    Signed-off-by: Deepa Dinamani
    Cc: y2038@lists.linaro.org
    Cc: john.stultz@linaro.org
    Cc: arnd@arndb.de
    Link: http://lkml.kernel.org/r/1490555058-4603-5-git-send-email-deepa.kernel@gmail.com
    Signed-off-by: Thomas Gleixner

    Deepa Dinamani
     
  • struct timespec is not y2038 safe on 32 bit machines. Replace uses of
    struct timespec with struct timespec64 in the kernel.

    The syscall interfaces themselves will be changed in a separate series.

    Signed-off-by: Deepa Dinamani
    Cc: y2038@lists.linaro.org
    Cc: john.stultz@linaro.org
    Cc: arnd@arndb.de
    Link: http://lkml.kernel.org/r/1490555058-4603-4-git-send-email-deepa.kernel@gmail.com
    Signed-off-by: Thomas Gleixner

    Deepa Dinamani
     

02 Mar, 2017

2 commits


26 Dec, 2016

2 commits

  • ktime_set(S,N) was required for the timespec storage type and is still
    useful for situations where a Seconds and Nanoseconds part of a time value
    needs to be converted. For anything where the Seconds argument is 0, this
    is pointless and can be replaced with a simple assignment.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra

    Thomas Gleixner
     
  • ktime is a union because the initial implementation stored the time in
    scalar nanoseconds on 64 bit machine and in a endianess optimized timespec
    variant for 32bit machines. The Y2038 cleanup removed the timespec variant
    and switched everything to scalar nanoseconds. The union remained, but
    become completely pointless.

    Get rid of the union and just keep ktime_t as simple typedef of type s64.

    The conversion was done with coccinelle and some manual mopping up.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra

    Thomas Gleixner
     

15 Dec, 2016

1 commit

  • The OpenRISC compiler (so far) fails to optimize away a large portion of
    code containing a reference to posix_timer_event in alarmtimer.c when
    CONFIG_POSIX_TIMERS is unset. Let's give it a direct clue to let the
    build succeed.

    This fixes
    [linux-next:master 6682/7183] alarmtimer.c:undefined reference to `posix_timer_event'
    reported by kbuild test robot.

    Signed-off-by: Nicolas Pitre
    Cc: Thomas Gleixner
    Cc: Josh Triplett

    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Nicolas Pitre
     

01 Dec, 2016

1 commit

  • Alarm timers are one of the mechanisms to wake up a system from suspend,
    but there exist no tracepoints to analyse which process/thread armed an
    alarmtimer.

    Add tracepoints for start/cancel/expire of individual alarm timers and one
    for tracing the suspend time decision when to resume the system.

    The following trace excerpt illustrates the new mechanism:

    Binder:3292_2-3304 [000] d..2 149.981123: alarmtimer_cancel:
    alarmtimer:ffffffc1319a7800 type:REALTIME
    expires:1325463120000000000 now:1325376810370370245

    Binder:3292_2-3304 [000] d..2 149.981136: alarmtimer_start:
    alarmtimer:ffffffc1319a7800 type:REALTIME
    expires:1325376840000000000 now:1325376810370384591

    Binder:3292_9-3953 [000] d..2 150.212991: alarmtimer_cancel:
    alarmtimer:ffffffc1319a5a00 type:BOOTTIME
    expires:179552000000 now:150154008122

    Binder:3292_9-3953 [000] d..2 150.213006: alarmtimer_start:
    alarmtimer:ffffffc1319a5a00 type:BOOTTIME
    expires:179551000000 now:150154025622

    system_server-3000 [002] ...1 162.701940: alarmtimer_suspend:
    alarmtimer type:REALTIME expires:1325376840000000000

    The wakeup time which is selected at suspend time allows to map it back to
    the task arming the timer: Binder:3292_2.

    [ tglx: Store alarm timer expiry time instead of some useless RTC relative
    information, add proper type information for wakeups which are
    handled via the clock_nanosleep/freezer and massage the changelog. ]

    Signed-off-by: Baolin Wang
    Signed-off-by: John Stultz
    Acked-by: Steven Rostedt
    Cc: Prarit Bhargava
    Cc: Richard Cochran
    Link: http://lkml.kernel.org/r/1480372524-15181-5-git-send-email-john.stultz@linaro.org
    Signed-off-by: Thomas Gleixner

    Baolin Wang
     

16 Nov, 2016

1 commit

  • Some embedded systems have no use for them. This removes about
    25KB from the kernel binary size when configured out.

    Corresponding syscalls are routed to a stub logging the attempt to
    use those syscalls which should be enough of a clue if they were
    disabled without proper consideration. They are: timer_create,
    timer_gettime: timer_getoverrun, timer_settime, timer_delete,
    clock_adjtime, setitimer, getitimer, alarm.

    The clock_settime, clock_gettime, clock_getres and clock_nanosleep
    syscalls are replaced by simple wrappers compatible with CLOCK_REALTIME,
    CLOCK_MONOTONIC and CLOCK_BOOTTIME only which should cover the vast
    majority of use cases with very little code.

    Signed-off-by: Nicolas Pitre
    Acked-by: Richard Cochran
    Acked-by: Thomas Gleixner
    Acked-by: John Stultz
    Reviewed-by: Josh Triplett
    Cc: Paul Bolle
    Cc: linux-kbuild@vger.kernel.org
    Cc: netdev@vger.kernel.org
    Cc: Michal Marek
    Cc: Edward Cree
    Link: http://lkml.kernel.org/r/1478841010-28605-7-git-send-email-nicolas.pitre@linaro.org
    Signed-off-by: Thomas Gleixner

    Nicolas Pitre
     

17 Oct, 2016

1 commit

  • Remove the set but unused variable base in alarm_clock_get to fix the
    following warning when building with 'W=1':

    kernel/time/alarmtimer.c: In function ‘alarm_timer_create’:
    kernel/time/alarmtimer.c:545:21: warning: variable ‘base’ set but not used [-Wunused-but-set-variable]

    Signed-off-by: Tobias Klauser
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20161017094702.10873-1-tklauser@distanz.ch
    Signed-off-by: Thomas Gleixner

    Tobias Klauser
     

21 Jun, 2016

1 commit


04 Dec, 2015

1 commit

  • Before the system go to suspend (S3), if user create a timer
    with clockid CLOCK_REALTIME_ALARM/CLOCK_BOOTTIME_ALARM and set a
    "large" timeout value to this timer. The function
    alarmtimer_suspend will be called to setup a timeout value to
    RTC timer to avoid the system sleep over time. However, if the
    system wakeup early than RTC timeout, the RTC timer will not be
    cleared. And this will cause the hpet_rtc_interrupt come
    unexpectedly until the RTC timeout. To fix this problem, just
    adding alarmtimer_resume to cancel the RTC timer.

    This was noticed because the HPET RTC emulation fires an
    interrupt every 16ms(=1/2^DEFAULT_RTC_SHIFT) up to the point
    where the alarm time is reached.

    This program always hits this situation
    (https://lkml.org/lkml/2015/11/8/326), if system wake up earlier
    than alarm time.

    Cc: Thomas Gleixner
    Cc: John Stultz
    Signed-off-by: Zhuo-hao Lee
    [jstultz: Tweak commit subject & formatting slightly]
    Signed-off-by: John Stultz

    zhuo-hao
     

22 Apr, 2015

1 commit

  • We want to get rid of the hrtimer_start() return value and the alarm
    timer return value is nowhere used. Remove it.

    Signed-off-by: Thomas Gleixner
    Acked-by: Peter Zijlstra
    Cc: Preeti U Murthy
    Cc: Viresh Kumar
    Cc: Marcelo Tosatti
    Cc: Frederic Weisbecker
    Cc: John Stultz
    Link: http://lkml.kernel.org/r/20150414203503.243910615@linutronix.de
    Signed-off-by: Thomas Gleixner

    Thomas Gleixner