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:
parent
15f27ce24c
commit
192a82f900
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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 = ¤t->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 = ¤t->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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue