hrtimer_nanosleep(): Pass rmtp in restart_block

Store the pointer to the timespec which gets updated with the remaining
time in the restart block and remove the function argument.

[ tglx: Added changelog ]

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-3-viro@ZenIV.linux.org.uk
This commit is contained in:
Al Viro 2017-06-07 09:42:28 +01:00 committed by Thomas Gleixner
parent 15f27ce24c
commit 192a82f900
5 changed files with 17 additions and 11 deletions

View File

@ -453,7 +453,6 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer,
/* Precise sleep: */ /* Precise sleep: */
extern long hrtimer_nanosleep(struct timespec64 *rqtp, extern long hrtimer_nanosleep(struct timespec64 *rqtp,
struct timespec __user *rmtp,
const enum hrtimer_mode mode, const enum hrtimer_mode mode,
const clockid_t clockid); const clockid_t clockid);
extern long hrtimer_nanosleep_restart(struct restart_block *restart_block); extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);

View File

@ -253,9 +253,9 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,
oldfs = get_fs(); oldfs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
ret = hrtimer_nanosleep(&tu64, current->restart_block.nanosleep.rmtp =
rmtp ? (struct timespec __user *)&rmt : NULL, rmtp ? (struct timespec __user *)&rmt : NULL;
HRTIMER_MODE_REL, CLOCK_MONOTONIC); ret = hrtimer_nanosleep(&tu64, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
set_fs(oldfs); set_fs(oldfs);
/* /*

View File

@ -1503,10 +1503,11 @@ out:
return ret; return ret;
} }
long hrtimer_nanosleep(struct timespec64 *rqtp, struct timespec __user *rmtp, long hrtimer_nanosleep(struct timespec64 *rqtp,
const enum hrtimer_mode mode, const clockid_t clockid) const enum hrtimer_mode mode, const clockid_t clockid)
{ {
struct restart_block *restart; struct restart_block *restart = &current->restart_block;
struct timespec __user *rmtp;
struct hrtimer_sleeper t; struct hrtimer_sleeper t;
int ret = 0; int ret = 0;
u64 slack; u64 slack;
@ -1526,16 +1527,15 @@ long hrtimer_nanosleep(struct timespec64 *rqtp, struct timespec __user *rmtp,
goto out; goto out;
} }
rmtp = restart->nanosleep.rmtp;
if (rmtp) { if (rmtp) {
ret = update_rmtp(&t.timer, rmtp); ret = update_rmtp(&t.timer, rmtp);
if (ret <= 0) if (ret <= 0)
goto out; goto out;
} }
restart = &current->restart_block;
restart->fn = hrtimer_nanosleep_restart; restart->fn = hrtimer_nanosleep_restart;
restart->nanosleep.clockid = t.timer.base->clockid; restart->nanosleep.clockid = t.timer.base->clockid;
restart->nanosleep.rmtp = rmtp;
restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer); restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);
ret = -ERESTART_RESTARTBLOCK; ret = -ERESTART_RESTARTBLOCK;
@ -1557,7 +1557,8 @@ SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
if (!timespec64_valid(&tu64)) if (!timespec64_valid(&tu64))
return -EINVAL; return -EINVAL;
return hrtimer_nanosleep(&tu64, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC); current->restart_block.nanosleep.rmtp = rmtp;
return hrtimer_nanosleep(&tu64, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
} }
/* /*

View File

@ -115,7 +115,10 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
t64 = timespec_to_timespec64(t); t64 = timespec_to_timespec64(t);
if (!timespec64_valid(&t64)) if (!timespec64_valid(&t64))
return -EINVAL; return -EINVAL;
return hrtimer_nanosleep(&t64, rmtp, flags & TIMER_ABSTIME ? if (flags & TIMER_ABSTIME)
rmtp = NULL;
current->restart_block.nanosleep.rmtp = rmtp;
return hrtimer_nanosleep(&t64, flags & TIMER_ABSTIME ?
HRTIMER_MODE_ABS : HRTIMER_MODE_REL, HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
which_clock); which_clock);
default: default:

View File

@ -1043,7 +1043,10 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
static int common_nsleep(const clockid_t which_clock, int flags, static int common_nsleep(const clockid_t which_clock, int flags,
struct timespec64 *tsave, struct timespec __user *rmtp) struct timespec64 *tsave, struct timespec __user *rmtp)
{ {
return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ? if (flags & TIMER_ABSTIME)
rmtp = NULL;
current->restart_block.nanosleep.rmtp = rmtp;
return hrtimer_nanosleep(tsave, flags & TIMER_ABSTIME ?
HRTIMER_MODE_ABS : HRTIMER_MODE_REL, HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
which_clock); which_clock);
} }