aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-06-07 04:42:32 -0400
committerThomas Gleixner <tglx@linutronix.de>2017-06-13 18:00:42 -0400
commitce41aaf47af3d28c4c958e07675a3e0a51f09bd3 (patch)
tree8bab8f8c31352e11bab4e80a1c0d302a352c7361
parentedbeda46322fbcb15af2d2d0f2daffb0cd349a5a (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.h2
-rw-r--r--kernel/time/alarmtimer.c10
-rw-r--r--kernel/time/hrtimer.c29
-rw-r--r--kernel/time/posix-cpu-timers.c13
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
456extern int nanosleep_copyout(struct restart_block *, struct timespec *);
455extern long hrtimer_nanosleep(struct timespec64 *rqtp, 457extern 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}
1441EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); 1441EXPORT_SYMBOL_GPL(hrtimer_init_sleeper);
1442 1442
1443int 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
1443static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) 1462static 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 = &current->restart_block; 1314 restart = &current->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;