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

Commit 99e6c0e6 authored by Al Viro's avatar Al Viro Committed by Thomas Gleixner
Browse files

posix-timers: Store rmtp into restart_block in sys_clock_nanosleep()



... instead of doing that in every ->nsleep() instance

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-5-viro@ZenIV.linux.org.uk
parent a7602681
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -753,8 +753,7 @@ static long __sched alarm_timer_nsleep_restart(struct restart_block *restart)
 * Handles clock_nanosleep calls against _ALARM clockids
 */
static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
			      struct timespec64 *tsreq,
			      struct timespec __user *rmtp)
			      struct timespec64 *tsreq)
{
	enum  alarmtimer_type type = clock2alarm(which_clock);
	struct restart_block *restart = &current->restart_block;
@@ -762,11 +761,6 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
	ktime_t exp;
	int ret = 0;

	if (flags & TIMER_ABSTIME)
		rmtp = NULL;

	restart->nanosleep.rmtp = rmtp;

	if (!alarmtimer_get_rtcdev())
		return -ENOTSUPP;

+3 −9
Original line number Diff line number Diff line
@@ -1328,16 +1328,11 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
static long posix_cpu_nsleep_restart(struct restart_block *restart_block);

static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
			    struct timespec64 *rqtp, struct timespec __user *rmtp)
			    struct timespec64 *rqtp)
{
	struct restart_block *restart_block = &current->restart_block;
	int error;

	if (flags & TIMER_ABSTIME)
		rmtp = NULL;

	restart_block->nanosleep.rmtp = rmtp;

	/*
	 * Diagnose required errors first.
	 */
@@ -1388,10 +1383,9 @@ static int process_cpu_timer_create(struct k_itimer *timer)
	return posix_cpu_timer_create(timer);
}
static int process_cpu_nsleep(const clockid_t which_clock, int flags,
			      struct timespec64 *rqtp,
			      struct timespec __user *rmtp)
			      struct timespec64 *rqtp)
{
	return posix_cpu_nsleep(PROCESS_CLOCK, flags, rqtp, rmtp);
	return posix_cpu_nsleep(PROCESS_CLOCK, flags, rqtp);
}
static long process_cpu_nsleep_restart(struct restart_block *restart_block)
{
+5 −5
Original line number Diff line number Diff line
@@ -1041,11 +1041,8 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
 * nanosleep for monotonic and realtime clocks
 */
static int common_nsleep(const clockid_t which_clock, int flags,
			 struct timespec64 *tsave, struct timespec __user *rmtp)
			 struct timespec64 *tsave)
{
	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);
@@ -1070,8 +1067,11 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
	t64 = timespec_to_timespec64(t);
	if (!timespec64_valid(&t64))
		return -EINVAL;
	if (flags & TIMER_ABSTIME)
		rmtp = NULL;
	current->restart_block.nanosleep.rmtp = rmtp;

	return kc->nsleep(which_clock, flags, &t64, rmtp);
	return kc->nsleep(which_clock, flags, &t64);
}

/*
+1 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ struct k_clock {
	int	(*clock_adj)(const clockid_t which_clock, struct timex *tx);
	int	(*timer_create)(struct k_itimer *timer);
	int	(*nsleep)(const clockid_t which_clock, int flags,
			  struct timespec64 *, struct timespec __user *);
			  struct timespec64 *);
	long	(*nsleep_restart)(struct restart_block *restart_block);
	int	(*timer_set)(struct k_itimer *timr, int flags,
			     struct itimerspec64 *new_setting,