lkml.org 
[lkml]   [2019]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 182/350] s390/time: ensure get_clock_monotonic() returns monotonic values
    Date
    From: Heiko Carstens <heiko.carstens@de.ibm.com>

    [ Upstream commit 011620688a71f2f1fe9901dbc2479a7c01053196 ]

    The current implementation of get_clock_monotonic() leaves it up to
    the caller to call the function with preemption disabled. The only
    core kernel caller (sched_clock) however does not disable preemption.

    In order to make sure that all callers of this function see monotonic
    values handle disabling preemption within the function itself.

    Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/s390/include/asm/timex.h | 16 ++++++++++------
    1 file changed, 10 insertions(+), 6 deletions(-)

    diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h
    index 64539c221672b..0f12a3f912820 100644
    --- a/arch/s390/include/asm/timex.h
    +++ b/arch/s390/include/asm/timex.h
    @@ -10,8 +10,9 @@
    #ifndef _ASM_S390_TIMEX_H
    #define _ASM_S390_TIMEX_H

    -#include <asm/lowcore.h>
    +#include <linux/preempt.h>
    #include <linux/time64.h>
    +#include <asm/lowcore.h>

    /* The value of the TOD clock for 1.1.1970. */
    #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL
    @@ -186,15 +187,18 @@ extern unsigned char tod_clock_base[16] __aligned(8);
    /**
    * get_clock_monotonic - returns current time in clock rate units
    *
    - * The caller must ensure that preemption is disabled.
    * The clock and tod_clock_base get changed via stop_machine.
    - * Therefore preemption must be disabled when calling this
    - * function, otherwise the returned value is not guaranteed to
    - * be monotonic.
    + * Therefore preemption must be disabled, otherwise the returned
    + * value is not guaranteed to be monotonic.
    */
    static inline unsigned long long get_tod_clock_monotonic(void)
    {
    - return get_tod_clock() - *(unsigned long long *) &tod_clock_base[1];
    + unsigned long long tod;
    +
    + preempt_disable();
    + tod = get_tod_clock() - *(unsigned long long *) &tod_clock_base[1];
    + preempt_enable();
    + return tod;
    }

    /**
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-10 22:28    [W:4.023 / U:0.860 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site