Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1659533
| From | Al Viro <viro@ZenIV.linux.org.uk> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 01/16] move copyout of timespec into do_cpu_nanosleep() |
| Date | 2017-06-07 10:50 +0200 |
| Message-ID | <tPEP7-4gO-7@gated-at.bofh.it> (permalink) |
| References | <tPEP7-4gO-5@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
kernel/time/posix-cpu-timers.c | 62 ++++++++++++++++++------------------------
1 file changed, 27 insertions(+), 35 deletions(-)
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index cb4a4eb44279..ef1f2bdc896e 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -1226,9 +1226,10 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,
}
static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
- struct timespec64 *rqtp, struct itimerspec64 *it)
+ struct timespec64 *rqtp)
{
struct k_itimer timer;
+ struct itimerspec64 it;
int error;
/*
@@ -1242,12 +1243,14 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
timer.it_process = current;
if (!error) {
static struct itimerspec64 zero_it;
+ struct restart_block *restart = ¤t->restart_block;
+ struct timespec __user *rmtp;
- memset(it, 0, sizeof *it);
- it->it_value = *rqtp;
+ memset(&it, 0, sizeof it);
+ it.it_value = *rqtp;
spin_lock_irq(&timer.it_lock);
- error = posix_cpu_timer_set(&timer, flags, it, NULL);
+ error = posix_cpu_timer_set(&timer, flags, &it, NULL);
if (error) {
spin_unlock_irq(&timer.it_lock);
return error;
@@ -1277,7 +1280,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
* We were interrupted by a signal.
*/
*rqtp = ns_to_timespec64(timer.it.cpu.expires);
- error = posix_cpu_timer_set(&timer, 0, &zero_it, it);
+ error = posix_cpu_timer_set(&timer, 0, &zero_it, &it);
if (!error) {
/*
* Timer is now unarmed, deletion can not fail.
@@ -1297,7 +1300,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
spin_unlock_irq(&timer.it_lock);
}
- if ((it->it_value.tv_sec | it->it_value.tv_nsec) == 0) {
+ if ((it.it_value.tv_sec | it.it_value.tv_nsec) == 0) {
/*
* It actually did fire already.
*/
@@ -1305,6 +1308,17 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
}
error = -ERESTART_RESTARTBLOCK;
+ /*
+ * Report back to the user the time still remaining.
+ */
+ rmtp = restart->nanosleep.rmtp;
+ if (rmtp) {
+ struct timespec ts;
+ ts = timespec64_to_timespec(it.it_value);
+ if (copy_to_user(rmtp, &ts, sizeof(*rmtp)))
+ return -EFAULT;
+ }
+ restart->nanosleep.expires = timespec64_to_ns(rqtp);
}
return error;
@@ -1316,10 +1330,13 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
struct timespec64 *rqtp, struct timespec __user *rmtp)
{
struct restart_block *restart_block = ¤t->restart_block;
- struct itimerspec64 it;
- struct timespec ts;
int error;
+ if (flags & TIMER_ABSTIME)
+ rmtp = NULL;
+
+ restart_block->nanosleep.rmtp = rmtp;
+
/*
* Diagnose required errors first.
*/
@@ -1328,23 +1345,15 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
CPUCLOCK_PID(which_clock) == task_pid_vnr(current)))
return -EINVAL;
- error = do_cpu_nanosleep(which_clock, flags, rqtp, &it);
+ error = do_cpu_nanosleep(which_clock, flags, rqtp);
if (error == -ERESTART_RESTARTBLOCK) {
if (flags & TIMER_ABSTIME)
return -ERESTARTNOHAND;
- /*
- * Report back to the user the time still remaining.
- */
- ts = timespec64_to_timespec(it.it_value);
- if (rmtp && copy_to_user(rmtp, &ts, sizeof(*rmtp)))
- return -EFAULT;
restart_block->fn = posix_cpu_nsleep_restart;
restart_block->nanosleep.clockid = which_clock;
- restart_block->nanosleep.rmtp = rmtp;
- restart_block->nanosleep.expires = timespec64_to_ns(rqtp);
}
return error;
}
@@ -1352,28 +1361,11 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
static long posix_cpu_nsleep_restart(struct restart_block *restart_block)
{
clockid_t which_clock = restart_block->nanosleep.clockid;
- struct itimerspec64 it;
struct timespec64 t;
- struct timespec tmp;
- int error;
t = ns_to_timespec64(restart_block->nanosleep.expires);
- error = do_cpu_nanosleep(which_clock, TIMER_ABSTIME, &t, &it);
-
- if (error == -ERESTART_RESTARTBLOCK) {
- struct timespec __user *rmtp = restart_block->nanosleep.rmtp;
- /*
- * Report back to the user the time still remaining.
- */
- tmp = timespec64_to_timespec(it.it_value);
- if (rmtp && copy_to_user(rmtp, &tmp, sizeof(*rmtp)))
- return -EFAULT;
-
- restart_block->nanosleep.expires = timespec64_to_ns(&t);
- }
- return error;
-
+ return do_cpu_nanosleep(which_clock, TIMER_ABSTIME, &t);
}
#define PROCESS_CLOCK MAKE_PROCESS_CPUCLOCK(0, CPUCLOCK_SCHED)
--
2.11.0
Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread
[PATCH 01/16] move copyout of timespec into do_cpu_nanosleep() Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[PATCH 06/16] nanosleep/clock_nanosleep: teach to do compat copyouts Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
Re: [PATCH 06/16] nanosleep/clock_nanosleep: teach to do compat copyouts Peter Zijlstra <peterz@infradead.org> - 2017-06-07 12:10 +0200
[tip:timers/core] time/posix-timers: Move the compat copyouts to the nanosleep implementations tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:20 +0200
[PATCH 15/16] time()/stime(): move compat to native Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] time: Move compat_time()/stime() to native tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:20 +0200
[PATCH 12/16] move compat itimer syscalls to native ones Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] itimers: Move compat itimer syscalls to native ones tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:20 +0200
[PATCH 04/16] move copyout to do_nanosleel() Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] hrtimer: Move copyout of remaining time to do_nanosleep() tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:10 +0200
[PATCH 14/16] timer_create(): move compat to native, get rid of set_fs() Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] posix-timers: Move compat_timer_create() to native, get rid of set_fs() tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:20 +0200
[PATCH 09/16] move adjtimex-related compat syscalls to native counterparts Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] ntp: Move adjtimex related compat syscalls to native counterparts tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:20 +0200
[PATCH 03/16] hrtimer_nanosleep(): pass rmtp in restart_block Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] hrtimer_nanosleep(): Pass rmtp in restart_block tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:10 +0200
[PATCH 08/16] kill ->nsleep_restart() Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] posix-timers: Kill ->nsleep_restart() tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:20 +0200
[PATCH 10/16] take compat timer_settime(2) to native one Al Viro <viro@ZenIV.linux.org.uk> - 2017-06-07 10:50 +0200
[tip:timers/core] posix-timers: Take compat timer_settime(2) to native one tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:20 +0200
Re: [PATCH 01/16] move copyout of timespec into do_cpu_nanosleep() Thomas Gleixner <tglx@linutronix.de> - 2017-06-13 01:10 +0200
Re: [PATCH 01/16] move copyout of timespec into do_cpu_nanosleep() Thomas Gleixner <tglx@linutronix.de> - 2017-06-13 09:50 +0200
[tip:timers/core] posix-cpu-timers: Move copyout of timespec into do_cpu_nanosleep() tip-bot for Al Viro <tipbot@zytor.com> - 2017-06-14 00:10 +0200
csiph-web