lkml.org 
[lkml]   [2017]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:timers/core] hrtimers/posix-timers: Merge nanosleep timespec copyout logics into a new helper
    Commit-ID:  ce41aaf47af3d28c4c958e07675a3e0a51f09bd3
    Gitweb: http://git.kernel.org/tip/ce41aaf47af3d28c4c958e07675a3e0a51f09bd3
    Author: Al Viro <viro@zeniv.linux.org.uk>
    AuthorDate: Wed, 7 Jun 2017 09:42:32 +0100
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Wed, 14 Jun 2017 00:00:42 +0200

    hrtimers/posix-timers: Merge nanosleep timespec copyout logics into a new helper

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20170607084241.28657-7-viro@ZenIV.linux.org.uk

    ---
    include/linux/hrtimer.h | 2 ++
    kernel/time/alarmtimer.c | 10 +---------
    kernel/time/hrtimer.c | 29 ++++++++++++++++++++---------
    kernel/time/posix-cpu-timers.c | 13 ++-----------
    4 files changed, 25 insertions(+), 29 deletions(-)

    diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
    index b80c34f..38b968f 100644
    --- a/include/linux/hrtimer.h
    +++ b/include/linux/hrtimer.h
    @@ -452,6 +452,8 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer,
    }

    /* Precise sleep: */
    +
    +extern int nanosleep_copyout(struct restart_block *, struct timespec *);
    extern long hrtimer_nanosleep(struct timespec64 *rqtp,
    const enum hrtimer_mode mode,
    const clockid_t clockid);
    diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
    index 57bcf94..7bed4e4 100644
    --- a/kernel/time/alarmtimer.c
    +++ b/kernel/time/alarmtimer.c
    @@ -721,15 +721,7 @@ static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp,
    return 0;
    rmt = ktime_to_timespec(rem);

    -#ifdef CONFIG_COMPAT
    - if (restart->nanosleep.type == TT_COMPAT) {
    - if (compat_put_timespec(&rmt,
    - restart->nanosleep.compat_rmtp))
    - return -EFAULT;
    - } else
    -#endif
    - if (copy_to_user(restart->nanosleep.rmtp, &rmt, sizeof(rmt)))
    - return -EFAULT;
    + return nanosleep_copyout(restart, &rmt);
    }
    return -ERESTART_RESTARTBLOCK;
    }
    diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
    index 5370da8..db2f5f7 100644
    --- a/kernel/time/hrtimer.c
    +++ b/kernel/time/hrtimer.c
    @@ -1440,6 +1440,25 @@ void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task)
    }
    EXPORT_SYMBOL_GPL(hrtimer_init_sleeper);

    +int nanosleep_copyout(struct restart_block *restart, struct timespec *ts)
    +{
    + switch(restart->nanosleep.type) {
    +#ifdef CONFIG_COMPAT
    + case TT_COMPAT:
    + if (compat_put_timespec(ts, restart->nanosleep.compat_rmtp))
    + return -EFAULT;
    + break;
    +#endif
    + case TT_NATIVE:
    + if (copy_to_user(restart->nanosleep.rmtp, ts, sizeof(struct timespec)))
    + return -EFAULT;
    + break;
    + default:
    + BUG();
    + }
    + return -ERESTART_RESTARTBLOCK;
    +}
    +
    static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode)
    {
    struct restart_block *restart;
    @@ -1472,15 +1491,7 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod
    return 0;
    rmt = ktime_to_timespec(rem);

    -#ifdef CONFIG_COMPAT
    - if (restart->nanosleep.type == TT_COMPAT) {
    - if (compat_put_timespec(&rmt,
    - restart->nanosleep.compat_rmtp))
    - return -EFAULT;
    - } else
    -#endif
    - if (copy_to_user(restart->nanosleep.rmtp, &rmt, sizeof(rmt)))
    - return -EFAULT;
    + return nanosleep_copyout(restart, &rmt);
    }
    return -ERESTART_RESTARTBLOCK;
    }
    diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
    index 1563ca2..993a924 100644
    --- a/kernel/time/posix-cpu-timers.c
    +++ b/kernel/time/posix-cpu-timers.c
    @@ -1312,22 +1312,13 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
    * Report back to the user the time still remaining.
    */
    restart = &current->restart_block;
    + restart->nanosleep.expires = timespec64_to_ns(rqtp);
    if (restart->nanosleep.type != TT_NONE) {
    struct timespec ts;

    ts = timespec64_to_timespec(it.it_value);
    -#ifdef CONFIG_COMPAT
    - if (restart->nanosleep.type == TT_COMPAT) {
    - if (compat_put_timespec(&ts,
    - restart->nanosleep.compat_rmtp))
    - return -EFAULT;
    - } else
    -#endif
    - if (copy_to_user(restart->nanosleep.rmtp, &ts,
    - sizeof(ts)))
    - return -EFAULT;
    + error = nanosleep_copyout(restart, &ts);
    }
    - restart->nanosleep.expires = timespec64_to_ns(rqtp);
    }

    return error;
    \
     
     \ /
      Last update: 2017-06-14 00:11    [W:2.686 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site