Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 192a82f9 authored by Al Viro's avatar Al Viro Committed by Thomas Gleixner
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarThomas 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
parent 15f27ce2
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -453,7 +453,6 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer,

/* Precise sleep: */
extern long hrtimer_nanosleep(struct timespec64 *rqtp,
			      struct timespec __user *rmtp,
			      const enum hrtimer_mode mode,
			      const clockid_t clockid);
extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);
+3 −3
Original line number Diff line number Diff line
@@ -253,9 +253,9 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,

	oldfs = get_fs();
	set_fs(KERNEL_DS);
	ret = hrtimer_nanosleep(&tu64,
				rmtp ? (struct timespec __user *)&rmt : NULL,
				HRTIMER_MODE_REL, CLOCK_MONOTONIC);
	current->restart_block.nanosleep.rmtp =
				rmtp ? (struct timespec __user *)&rmt : NULL;
	ret = hrtimer_nanosleep(&tu64, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
	set_fs(oldfs);

	/*
+6 −5
Original line number Diff line number Diff line
@@ -1503,10 +1503,11 @@ long __sched hrtimer_nanosleep_restart(struct restart_block *restart)
	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)
{
	struct restart_block *restart;
	struct restart_block *restart = &current->restart_block;
	struct timespec __user *rmtp;
	struct hrtimer_sleeper t;
	int ret = 0;
	u64 slack;
@@ -1526,16 +1527,15 @@ long hrtimer_nanosleep(struct timespec64 *rqtp, struct timespec __user *rmtp,
		goto out;
	}

	rmtp = restart->nanosleep.rmtp;
	if (rmtp) {
		ret = update_rmtp(&t.timer, rmtp);
		if (ret <= 0)
			goto out;
	}

	restart = &current->restart_block;
	restart->fn = hrtimer_nanosleep_restart;
	restart->nanosleep.clockid = t.timer.base->clockid;
	restart->nanosleep.rmtp = rmtp;
	restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);

	ret = -ERESTART_RESTARTBLOCK;
@@ -1557,7 +1557,8 @@ SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
	if (!timespec64_valid(&tu64))
		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);
}

/*
+4 −1
Original line number Diff line number Diff line
@@ -115,7 +115,10 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
		t64 = timespec_to_timespec64(t);
		if (!timespec64_valid(&t64))
			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,
					 which_clock);
	default:
+4 −1
Original line number Diff line number Diff line
@@ -1043,7 +1043,10 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
static int common_nsleep(const clockid_t which_clock, int flags,
			 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,
				 which_clock);
}