diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-07 04:42:32 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-06-13 18:00:42 -0400 |
commit | ce41aaf47af3d28c4c958e07675a3e0a51f09bd3 (patch) | |
tree | 8bab8f8c31352e11bab4e80a1c0d302a352c7361 | |
parent | edbeda46322fbcb15af2d2d0f2daffb0cd349a5a (diff) |
hrtimers/posix-timers: Merge nanosleep timespec copyout logics into a new helper
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-7-viro@ZenIV.linux.org.uk
-rw-r--r-- | include/linux/hrtimer.h | 2 | ||||
-rw-r--r-- | kernel/time/alarmtimer.c | 10 | ||||
-rw-r--r-- | kernel/time/hrtimer.c | 29 | ||||
-rw-r--r-- | kernel/time/posix-cpu-timers.c | 13 |
4 files changed, 25 insertions, 29 deletions
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index b80c34f6fd4b..38b968f3df4e 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
@@ -452,6 +452,8 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer, | |||
452 | } | 452 | } |
453 | 453 | ||
454 | /* Precise sleep: */ | 454 | /* Precise sleep: */ |
455 | |||
456 | extern int nanosleep_copyout(struct restart_block *, struct timespec *); | ||
455 | extern long hrtimer_nanosleep(struct timespec64 *rqtp, | 457 | extern long hrtimer_nanosleep(struct timespec64 *rqtp, |
456 | const enum hrtimer_mode mode, | 458 | const enum hrtimer_mode mode, |
457 | const clockid_t clockid); | 459 | const clockid_t clockid); |
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 57bcf94ee132..7bed4e44f9bd 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c | |||
@@ -721,15 +721,7 @@ static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp, | |||
721 | return 0; | 721 | return 0; |
722 | rmt = ktime_to_timespec(rem); | 722 | rmt = ktime_to_timespec(rem); |
723 | 723 | ||
724 | #ifdef CONFIG_COMPAT | 724 | return nanosleep_copyout(restart, &rmt); |
725 | if (restart->nanosleep.type == TT_COMPAT) { | ||
726 | if (compat_put_timespec(&rmt, | ||
727 | restart->nanosleep.compat_rmtp)) | ||
728 | return -EFAULT; | ||
729 | } else | ||
730 | #endif | ||
731 | if (copy_to_user(restart->nanosleep.rmtp, &rmt, sizeof(rmt))) | ||
732 | return -EFAULT; | ||
733 | } | 725 | } |
734 | return -ERESTART_RESTARTBLOCK; | 726 | return -ERESTART_RESTARTBLOCK; |
735 | } | 727 | } |
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index 5370da8fc0a4..db2f5f7b4ba5 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c | |||
@@ -1440,6 +1440,25 @@ void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) | |||
1440 | } | 1440 | } |
1441 | EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); | 1441 | EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); |
1442 | 1442 | ||
1443 | int nanosleep_copyout(struct restart_block *restart, struct timespec *ts) | ||
1444 | { | ||
1445 | switch(restart->nanosleep.type) { | ||
1446 | #ifdef CONFIG_COMPAT | ||
1447 | case TT_COMPAT: | ||
1448 | if (compat_put_timespec(ts, restart->nanosleep.compat_rmtp)) | ||
1449 | return -EFAULT; | ||
1450 | break; | ||
1451 | #endif | ||
1452 | case TT_NATIVE: | ||
1453 | if (copy_to_user(restart->nanosleep.rmtp, ts, sizeof(struct timespec))) | ||
1454 | return -EFAULT; | ||
1455 | break; | ||
1456 | default: | ||
1457 | BUG(); | ||
1458 | } | ||
1459 | return -ERESTART_RESTARTBLOCK; | ||
1460 | } | ||
1461 | |||
1443 | static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) | 1462 | static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) |
1444 | { | 1463 | { |
1445 | struct restart_block *restart; | 1464 | struct restart_block *restart; |
@@ -1472,15 +1491,7 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod | |||
1472 | return 0; | 1491 | return 0; |
1473 | rmt = ktime_to_timespec(rem); | 1492 | rmt = ktime_to_timespec(rem); |
1474 | 1493 | ||
1475 | #ifdef CONFIG_COMPAT | 1494 | return nanosleep_copyout(restart, &rmt); |
1476 | if (restart->nanosleep.type == TT_COMPAT) { | ||
1477 | if (compat_put_timespec(&rmt, | ||
1478 | restart->nanosleep.compat_rmtp)) | ||
1479 | return -EFAULT; | ||
1480 | } else | ||
1481 | #endif | ||
1482 | if (copy_to_user(restart->nanosleep.rmtp, &rmt, sizeof(rmt))) | ||
1483 | return -EFAULT; | ||
1484 | } | 1495 | } |
1485 | return -ERESTART_RESTARTBLOCK; | 1496 | return -ERESTART_RESTARTBLOCK; |
1486 | } | 1497 | } |
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 1563ca22cf1f..993a924d1399 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c | |||
@@ -1312,22 +1312,13 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags, | |||
1312 | * Report back to the user the time still remaining. | 1312 | * Report back to the user the time still remaining. |
1313 | */ | 1313 | */ |
1314 | restart = ¤t->restart_block; | 1314 | restart = ¤t->restart_block; |
1315 | restart->nanosleep.expires = timespec64_to_ns(rqtp); | ||
1315 | if (restart->nanosleep.type != TT_NONE) { | 1316 | if (restart->nanosleep.type != TT_NONE) { |
1316 | struct timespec ts; | 1317 | struct timespec ts; |
1317 | 1318 | ||
1318 | ts = timespec64_to_timespec(it.it_value); | 1319 | ts = timespec64_to_timespec(it.it_value); |
1319 | #ifdef CONFIG_COMPAT | 1320 | error = nanosleep_copyout(restart, &ts); |
1320 | if (restart->nanosleep.type == TT_COMPAT) { | ||
1321 | if (compat_put_timespec(&ts, | ||
1322 | restart->nanosleep.compat_rmtp)) | ||
1323 | return -EFAULT; | ||
1324 | } else | ||
1325 | #endif | ||
1326 | if (copy_to_user(restart->nanosleep.rmtp, &ts, | ||
1327 | sizeof(ts))) | ||
1328 | return -EFAULT; | ||
1329 | } | 1321 | } |
1330 | restart->nanosleep.expires = timespec64_to_ns(rqtp); | ||
1331 | } | 1322 | } |
1332 | 1323 | ||
1333 | return error; | 1324 | return error; |