Change k_clock interfaces to use timespec64
Subsystems (8)
v2 cover Change k_clock interfaces to use timespec64
The series is aimed at replacing struct timespec which is not y2038 safe with y2038 safe struct timespec64 for k_clock interfaces. The series also replaces struct itimerspec which uses struct timespec internally with struct itimerspec64 for the k_clock interfaces.
The series does not change the syscall interface.
This will be done in a follow up series.
A few existing checkpatch-noted style issues, such as the 80 line character limit, have been left as-is to facilitate easier review.
Changes since v1:
* Address review comments for change logs and coding style.
* Fix kbuild test error for alpha.
Deepa Dinamani (7):
time: Delete do_sys_setimeofday()
time: Change posix clocks ops interfaces to use timespec64 Change k_clock clock_get() to use timespec64 Change k_clock clock_getres() to use timespec64 Change k_clock clock_set() to use timespec64 Change k_clock timer_set() and timer_get() to use timespec64 Change k_clock nsleep() to use timespec64
arch/alpha/kernel/osf_sys.c | 4 +- drivers/char/mmtimer.c | 28 ++++++------- drivers/ptp/ptp_clock.c | 18 ++++---- include/linux/hrtimer.h | 2 +- include/linux/posix-clock.h | 10 ++--- include/linux/posix-timers.h | 20 ++++----- include/linux/timekeeping.h | 20 +++------ kernel/compat.c | 10 +++-- kernel/time/alarmtimer.c | 24 +++++------ kernel/time/hrtimer.c | 10 +++-- kernel/time/posix-clock.c | 10 ++--- kernel/time/posix-cpu-timers.c | 66 +++++++++++++++-------------- kernel/time/posix-stubs.c | 20 ++++++--- kernel/time/posix-timers.c | 95 ++++++++++++++++++++++++------------------ kernel/time/time.c | 4 +- 15 files changed, 179 insertions(+), 162 deletions(-)
Signature · 9 lines
2.7.4 Cc: Richard Cochran <[email protected]> Cc: [email protected] Cc: [email protected] _______________________________________________ Y2038 mailing list [email protected] https://lists.linaro.org/mailman/listinfo/y2038
PATCH v2 1/7 time: Delete do_sys_setimeofday()
struct timespec is not y2038 safe on 32 bit machines and needs to be replaced with struct timespec64.
do_sys_timeofday() is just a wrapper function. Replace all calls to this function with direct calls to do_sys_timeofday64() instead and delete do_sys_timeofday().
--- arch/alpha/kernel/osf_sys.c | 4 +++- include/linux/timekeeping.h | 15 --------------- kernel/compat.c | 4 ++-- kernel/time/posix-stubs.c | 5 ++++- kernel/time/posix-timers.c | 5 ++++- kernel/time/time.c | 4 ++-- 6 files changed, 15 insertions(+), 22 deletions(-)
arch/alpha/kernel/osf_sys.c +3 -1
@@ -1016,6 +1016,7 @@ SYSCALL_DEFINE2(osf_gettimeofday, struct timeval32 __user *, tv, SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv, struct timezone __user *, tz) { +struct timespec64 kts64;struct timespec kts;struct timezone ktz;
@@ -1023,13 +1024,14 @@ SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv,if (get_tv32 ((struct timeval *)&kts, tv))return -EFAULT ; kts.tv_nsec *=1000 ; + kts64 =timespec_to_timespec64 (kts); }if (tz) {if (copy_from_user (&ktz, tz,sizeof (*tz)))return -EFAULT ; } -return do_sys_settimeofday (tv ? &kts :NULL , tz ? &ktz :NULL ); +return do_sys_settimeofday64 (tv ? &kts64 :NULL , tz ? &ktz :NULL ); }asmlinkage long sys_ni_posix_timers (void );
include/linux/timekeeping.h +0 -15
@@ -19,21 +19,6 @@ extern void do_gettimeofday(struct timeval *tv);extern int do_settimeofday64 (const struct timespec64 *ts);extern int do_sys_settimeofday64 (const struct timespec64 *tv,const struct timezone *tz); -static inline int do_sys_settimeofday (const struct timespec *tv, -const struct timezone *tz) -{ -struct timespec64 ts64; - -if (!tv) -return do_sys_settimeofday64 (NULL , tz); - -if (!timespec_valid (tv)) -return -EINVAL ; - - ts64 =timespec_to_timespec64 (*tv); -return do_sys_settimeofday64 (&ts64, tz); -} -/* * Kernel time accessors */
kernel/compat.c +2 -2
@@ -109,7 +109,7 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv, struct timezone __user *, tz) {struct timeval user_tv; -struct timespec new_ts; +struct timespec64 new_ts;struct timezone new_tz;if (tv) {
@@ -123,7 +123,7 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,return -EFAULT ; } -return do_sys_settimeofday (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); +return do_sys_settimeofday64 (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); }static int __compat_get_timeval (struct timeval *tv,const struct compat_timeval __user *ctv)
kernel/time/posix-stubs.c +4 -1
@@ -49,13 +49,16 @@ SYS_NI(alarm); SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, const struct timespec __user *, tp) { +struct timespec64 new_tp64;struct timespec new_tp;if (which_clock !=CLOCK_REALTIME )return -EINVAL ;if (copy_from_user (&new_tp, tp,sizeof (*tp)))return -EFAULT ; -return do_sys_settimeofday (&new_tp,NULL ); + + new_tp64 =timespec_to_timespec64 (new_tp); +return do_sys_settimeofday64 (&new_tp64,NULL ); } SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
kernel/time/posix-timers.c +4 -1
@@ -214,7 +214,10 @@ static int posix_clock_realtime_get(clockid_t which_clock, struct timespec *tp)static int posix_clock_realtime_set (const clockid_t which_clock,const struct timespec *tp) { -return do_sys_settimeofday (tp,NULL ); +struct timespec64 tp64; + + tp64 =timespec_to_timespec64 (*tp); +return do_sys_settimeofday64 (&tp64,NULL ); } static int posix_clock_realtime_adj(const clockid_t which_clock,
kernel/time/time.c +2 -2
@@ -193,8 +193,8 @@ int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv, struct timezone __user *, tz) { +struct timespec64 new_ts;struct timeval user_tv; -struct timespec new_ts;struct timezone new_tz;if (tv) {
@@ -212,7 +212,7 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,return -EFAULT ; } -return do_sys_settimeofday (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); +return do_sys_settimeofday64 (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); } SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
Signature · 6 lines
2.7.4 _______________________________________________ Y2038 mailing list [email protected] https://lists.linaro.org/mailman/listinfo/y2038
tip-bot for Deepa Dinamani
merge bot[tip:timers/core] time: Delete do_sys_setimeofday()
time: Delete do_sys_setimeofday()
Commit-ID: 2ac00f17b2e110c67ed2af3713bc04aec62e4608 Gitweb: http://git.kernel.org/tip/2ac00f17b2e110c67ed2af3713bc04aec62e4608 Author: Deepa Dinamani <[email protected]> AuthorDate: Sun, 26 Mar 2017 12:04:12 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 14 Apr 2017 21:49:54 +0200
time: Delete do_sys_setimeofday()
struct timespec is not y2038 safe on 32 bit machines and needs to be replaced with struct timespec64.
do_sys_timeofday() is just a wrapper function. Replace all calls to this function with direct calls to do_sys_timeofday64() instead and delete do_sys_timeofday().
--- arch/alpha/kernel/osf_sys.c | 4 +++- include/linux/timekeeping.h | 15 --------------- kernel/compat.c | 4 ++-- kernel/time/posix-stubs.c | 5 ++++- kernel/time/posix-timers.c | 5 ++++- kernel/time/time.c | 4 ++-- 6 files changed, 15 insertions(+), 22 deletions(-)
arch/alpha/kernel/osf_sys.c +3 -1
@@ -1016,6 +1016,7 @@ SYSCALL_DEFINE2(osf_gettimeofday, struct timeval32 __user *, tv, SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv, struct timezone __user *, tz) { +struct timespec64 kts64;struct timespec kts;struct timezone ktz;
@@ -1023,13 +1024,14 @@ SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv,if (get_tv32 ((struct timeval *)&kts, tv))return -EFAULT ; kts.tv_nsec *=1000 ; + kts64 =timespec_to_timespec64 (kts); }if (tz) {if (copy_from_user (&ktz, tz,sizeof (*tz)))return -EFAULT ; } -return do_sys_settimeofday (tv ? &kts :NULL , tz ? &ktz :NULL ); +return do_sys_settimeofday64 (tv ? &kts64 :NULL , tz ? &ktz :NULL ); }asmlinkage long sys_ni_posix_timers (void );
include/linux/timekeeping.h +0 -15
@@ -19,21 +19,6 @@ extern void do_gettimeofday(struct timeval *tv);extern int do_settimeofday64 (const struct timespec64 *ts);extern int do_sys_settimeofday64 (const struct timespec64 *tv,const struct timezone *tz); -static inline int do_sys_settimeofday (const struct timespec *tv, -const struct timezone *tz) -{ -struct timespec64 ts64; - -if (!tv) -return do_sys_settimeofday64 (NULL , tz); - -if (!timespec_valid (tv)) -return -EINVAL ; - - ts64 =timespec_to_timespec64 (*tv); -return do_sys_settimeofday64 (&ts64, tz); -} -/* * Kernel time accessors */
kernel/compat.c +2 -2
@@ -108,8 +108,8 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv, COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv, struct timezone __user *, tz) { +struct timespec64 new_ts;struct timeval user_tv; -struct timespec new_ts;struct timezone new_tz;if (tv) {
@@ -123,7 +123,7 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,return -EFAULT ; } -return do_sys_settimeofday (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); +return do_sys_settimeofday64 (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); }static int __compat_get_timeval (struct timeval *tv,const struct compat_timeval __user *ctv)
kernel/time/posix-stubs.c +4 -1
@@ -49,13 +49,16 @@ SYS_NI(alarm); SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, const struct timespec __user *, tp) { +struct timespec64 new_tp64;struct timespec new_tp;if (which_clock !=CLOCK_REALTIME )return -EINVAL ;if (copy_from_user (&new_tp, tp,sizeof (*tp)))return -EFAULT ; -return do_sys_settimeofday (&new_tp,NULL ); + + new_tp64 =timespec_to_timespec64 (new_tp); +return do_sys_settimeofday64 (&new_tp64,NULL ); } SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
kernel/time/posix-timers.c +4 -1
@@ -214,7 +214,10 @@ static int posix_clock_realtime_get(clockid_t which_clock, struct timespec *tp)static int posix_clock_realtime_set (const clockid_t which_clock,const struct timespec *tp) { -return do_sys_settimeofday (tp,NULL ); +struct timespec64 tp64; + + tp64 =timespec_to_timespec64 (*tp); +return do_sys_settimeofday64 (&tp64,NULL ); } static int posix_clock_realtime_adj(const clockid_t which_clock,
kernel/time/time.c +2 -2
@@ -193,8 +193,8 @@ int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv, struct timezone __user *, tz) { +struct timespec64 new_ts;struct timeval user_tv; -struct timespec new_ts;struct timezone new_tz;if (tv) {
@@ -212,7 +212,7 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,return -EFAULT ; } -return do_sys_settimeofday (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); +return do_sys_settimeofday64 (tv ? &new_ts :NULL , tz ? &new_tz :NULL ); } SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
PATCH v2 2/7 time: Change posix clocks ops interfaces to use timespec64
In reply to Deepa Dinamanistruct timespec is not y2038 safe on 32 bit machines.
The posix clocks apis use struct timespec directly and through struct itimerspec.
Replace the posix clock interfaces to use struct timespec64 and struct itimerspec64 instead. Also fix up their implementations accordingly.
Note that the clock_getres() interface has also been changed to use timespec64 even though this particular interface is not affected by the y2038 problem. This helps verification for internal kernel code for y2038 readiness by getting rid of time_t/ timeval/ timespec.
--- drivers/ptp/ptp_clock.c | 18 +++++++----------- include/linux/posix-clock.h | 10 +++++----- kernel/time/posix-clock.c | 34 ++++++++++++++++++++++++---------- 3 files changed, 36 insertions(+), 26 deletions(-)
drivers/ptp/ptp_clock.c +7 -11
@@ -97,30 +97,26 @@ static s32 scaled_ppm_to_ppb(long ppm)/* posix clock implementation */ -static int ptp_clock_getres (struct posix_clock *pc,struct timespec *tp) +static int ptp_clock_getres (struct posix_clock *pc,struct timespec64 *tp) { tp->tv_sec =0 ; tp->tv_nsec =1 ;return 0 ; } -static int ptp_clock_settime (struct posix_clock *pc,const struct timespec *tp) +static int ptp_clock_settime (struct posix_clock *pc,const struct timespec64 *tp) { struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); -struct timespec64 ts =timespec_to_timespec64 (*tp); -return ptp->info->settime64 (ptp->info, &ts); +return ptp->info->settime64 (ptp->info, tp); } -static int ptp_clock_gettime (struct posix_clock *pc,struct timespec *tp) +static int ptp_clock_gettime (struct posix_clock *pc,struct timespec64 *tp) { struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); -struct timespec64 ts;int err; - err = ptp->info->gettime64 (ptp->info, &ts); -if (!err) - *tp =timespec64_to_timespec (ts); + err = ptp->info->gettime64 (ptp->info, tp);return err; }
@@ -133,7 +129,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct timex *tx) ops = ptp->info;if (tx->modes &ADJ_SETOFFSET ) { -struct timespec ts; +struct timespec64 ts;ktime_t kt;s64 delta;
@@ -146,7 +142,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct timex *tx)if ((unsigned long ) ts.tv_nsec >=NSEC_PER_SEC )return -EINVAL ; - kt =timespec_to_ktime (ts); + kt =timespec64_to_ktime (ts); delta =ktime_to_ns (kt); err = ops->adjtime (ops, delta); }else if (tx->modes &ADJ_FREQUENCY ) {
include/linux/posix-clock.h +5 -5
@@ -59,23 +59,23 @@ struct posix_clock_operations {int (*clock_adjtime)(struct posix_clock *pc,struct timex *tx); -int (*clock_gettime)(struct posix_clock *pc,struct timespec *ts); +int (*clock_gettime)(struct posix_clock *pc,struct timespec64 *ts); -int (*clock_getres) (struct posix_clock *pc,struct timespec *ts); +int (*clock_getres) (struct posix_clock *pc,struct timespec64 *ts);int (*clock_settime)(struct posix_clock *pc, -const struct timespec *ts); +const struct timespec64 *ts);int (*timer_create) (struct posix_clock *pc,struct k_itimer *kit);int (*timer_delete) (struct posix_clock *pc,struct k_itimer *kit);void (*timer_gettime)(struct posix_clock *pc, -struct k_itimer *kit,struct itimerspec *tsp); +struct k_itimer *kit,struct itimerspec64 *tsp);int (*timer_settime)(struct posix_clock *pc,struct k_itimer *kit,int flags, -struct itimerspec *tsp,struct itimerspec *old); +struct itimerspec64 *tsp,struct itimerspec64 *old);/* * Optional character device methods: */
kernel/time/posix-clock.c +24 -10
@@ -300,14 +300,17 @@ static int pc_clock_adjtime(clockid_t id, struct timex *tx)static int pc_clock_gettime (clockid_t id,struct timespec *ts) {struct posix_clock_desc cd; +struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_gettime) - err = cd.clk->ops.clock_gettime (cd.clk, ts); +if (cd.clk->ops.clock_gettime) { + err = cd.clk->ops.clock_gettime (cd.clk, &ts64); + *ts =timespec64_to_timespec (ts64); + }else err = -EOPNOTSUPP ;
@@ -319,14 +322,17 @@ static int pc_clock_gettime(clockid_t id, struct timespec *ts)static int pc_clock_getres (clockid_t id,struct timespec *ts) {struct posix_clock_desc cd; +struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_getres) - err = cd.clk->ops.clock_getres (cd.clk, ts); +if (cd.clk->ops.clock_getres) { + err = cd.clk->ops.clock_getres (cd.clk, &ts64); + *ts =timespec64_to_timespec (ts64); + }else err = -EOPNOTSUPP ;
@@ -337,6 +343,7 @@ static int pc_clock_getres(clockid_t id, struct timespec *ts)static int pc_clock_settime (clockid_t id,const struct timespec *ts) { +struct timespec64 ts64 =timespec_to_timespec64 (*ts);struct posix_clock_desc cd;int err;
@@ -350,7 +357,7 @@ static int pc_clock_settime(clockid_t id, const struct timespec *ts) }if (cd.clk->ops.clock_settime) - err = cd.clk->ops.clock_settime (cd.clk, ts); + err = cd.clk->ops.clock_settime (cd.clk, &ts64);else err = -EOPNOTSUPP ; out:
@@ -403,29 +410,36 @@ static void pc_timer_gettime(struct k_itimer *kit, struct itimerspec *ts) {clockid_t id = kit->it_clock;struct posix_clock_desc cd; +struct itimerspec64 ts64;if (get_clock_desc (id, &cd))return ; -if (cd.clk->ops.timer_gettime) - cd.clk->ops.timer_gettime (cd.clk, kit, ts); - +if (cd.clk->ops.timer_gettime) { + cd.clk->ops.timer_gettime (cd.clk, kit, &ts64); + *ts =itimerspec64_to_itimerspec (&ts64); + }put_clock_desc (&cd); }static int pc_timer_settime (struct k_itimer *kit,int flags,struct itimerspec *ts,struct itimerspec *old) { +struct itimerspec64 ts64 =itimerspec_to_itimerspec64 (ts);clockid_t id = kit->it_clock;struct posix_clock_desc cd; +struct itimerspec64 old64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.timer_settime) - err = cd.clk->ops.timer_settime (cd.clk, kit, flags, ts, old); +if (cd.clk->ops.timer_settime) { + err = cd.clk->ops.timer_settime (cd.clk, kit, flags, &ts64, &old64); +if (old) + *old =itimerspec64_to_itimerspec (&old64); + }else err = -EOPNOTSUPP ;
Signature · 6 lines
2.7.4 _______________________________________________ Y2038 mailing list [email protected] https://lists.linaro.org/mailman/listinfo/y2038
tip-bot for Deepa Dinamani
merge bot[tip:timers/core] time: Change posix clocks ops interfaces to use timespec64
time: Change posix clocks ops interfaces to use timespec64
Commit-ID: d340266e19ddb70dbd608f9deedcfb35fdb9d419 Gitweb: http://git.kernel.org/tip/d340266e19ddb70dbd608f9deedcfb35fdb9d419 Author: Deepa Dinamani <[email protected]> AuthorDate: Sun, 26 Mar 2017 12:04:13 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 14 Apr 2017 21:49:54 +0200
time: Change posix clocks ops interfaces to use timespec64
struct timespec is not y2038 safe on 32 bit machines.
The posix clocks apis use struct timespec directly and through struct itimerspec.
Replace the posix clock interfaces to use struct timespec64 and struct itimerspec64 instead. Also fix up their implementations accordingly.
Note that the clock_getres() interface has also been changed to use timespec64 even though this particular interface is not affected by the y2038 problem. This helps verification for internal kernel code for y2038 readiness by getting rid of time_t/ timeval/ timespec.
--- drivers/ptp/ptp_clock.c | 18 +++++++----------- include/linux/posix-clock.h | 10 +++++----- kernel/time/posix-clock.c | 34 ++++++++++++++++++++++++---------- 3 files changed, 36 insertions(+), 26 deletions(-)
drivers/ptp/ptp_clock.c +7 -11
@@ -97,30 +97,26 @@ static s32 scaled_ppm_to_ppb(long ppm)/* posix clock implementation */ -static int ptp_clock_getres (struct posix_clock *pc,struct timespec *tp) +static int ptp_clock_getres (struct posix_clock *pc,struct timespec64 *tp) { tp->tv_sec =0 ; tp->tv_nsec =1 ;return 0 ; } -static int ptp_clock_settime (struct posix_clock *pc,const struct timespec *tp) +static int ptp_clock_settime (struct posix_clock *pc,const struct timespec64 *tp) { struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); -struct timespec64 ts =timespec_to_timespec64 (*tp); -return ptp->info->settime64 (ptp->info, &ts); +return ptp->info->settime64 (ptp->info, tp); } -static int ptp_clock_gettime (struct posix_clock *pc,struct timespec *tp) +static int ptp_clock_gettime (struct posix_clock *pc,struct timespec64 *tp) { struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); -struct timespec64 ts;int err; - err = ptp->info->gettime64 (ptp->info, &ts); -if (!err) - *tp =timespec64_to_timespec (ts); + err = ptp->info->gettime64 (ptp->info, tp);return err; }
@@ -133,7 +129,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct timex *tx) ops = ptp->info;if (tx->modes &ADJ_SETOFFSET ) { -struct timespec ts; +struct timespec64 ts;ktime_t kt;s64 delta;
@@ -146,7 +142,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct timex *tx)if ((unsigned long ) ts.tv_nsec >=NSEC_PER_SEC )return -EINVAL ; - kt =timespec_to_ktime (ts); + kt =timespec64_to_ktime (ts); delta =ktime_to_ns (kt); err = ops->adjtime (ops, delta); }else if (tx->modes &ADJ_FREQUENCY ) {
include/linux/posix-clock.h +5 -5
@@ -59,23 +59,23 @@ struct posix_clock_operations {int (*clock_adjtime)(struct posix_clock *pc,struct timex *tx); -int (*clock_gettime)(struct posix_clock *pc,struct timespec *ts); +int (*clock_gettime)(struct posix_clock *pc,struct timespec64 *ts); -int (*clock_getres) (struct posix_clock *pc,struct timespec *ts); +int (*clock_getres) (struct posix_clock *pc,struct timespec64 *ts);int (*clock_settime)(struct posix_clock *pc, -const struct timespec *ts); +const struct timespec64 *ts);int (*timer_create) (struct posix_clock *pc,struct k_itimer *kit);int (*timer_delete) (struct posix_clock *pc,struct k_itimer *kit);void (*timer_gettime)(struct posix_clock *pc, -struct k_itimer *kit,struct itimerspec *tsp); +struct k_itimer *kit,struct itimerspec64 *tsp);int (*timer_settime)(struct posix_clock *pc,struct k_itimer *kit,int flags, -struct itimerspec *tsp,struct itimerspec *old); +struct itimerspec64 *tsp,struct itimerspec64 *old);/* * Optional character device methods: */
kernel/time/posix-clock.c +24 -10
@@ -300,14 +300,17 @@ out:static int pc_clock_gettime (clockid_t id,struct timespec *ts) {struct posix_clock_desc cd; +struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_gettime) - err = cd.clk->ops.clock_gettime (cd.clk, ts); +if (cd.clk->ops.clock_gettime) { + err = cd.clk->ops.clock_gettime (cd.clk, &ts64); + *ts =timespec64_to_timespec (ts64); + }else err = -EOPNOTSUPP ;
@@ -319,14 +322,17 @@ static int pc_clock_gettime(clockid_t id, struct timespec *ts)static int pc_clock_getres (clockid_t id,struct timespec *ts) {struct posix_clock_desc cd; +struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_getres) - err = cd.clk->ops.clock_getres (cd.clk, ts); +if (cd.clk->ops.clock_getres) { + err = cd.clk->ops.clock_getres (cd.clk, &ts64); + *ts =timespec64_to_timespec (ts64); + }else err = -EOPNOTSUPP ;
@@ -337,6 +343,7 @@ static int pc_clock_getres(clockid_t id, struct timespec *ts)static int pc_clock_settime (clockid_t id,const struct timespec *ts) { +struct timespec64 ts64 =timespec_to_timespec64 (*ts);struct posix_clock_desc cd;int err;
@@ -350,7 +357,7 @@ static int pc_clock_settime(clockid_t id, const struct timespec *ts) }if (cd.clk->ops.clock_settime) - err = cd.clk->ops.clock_settime (cd.clk, ts); + err = cd.clk->ops.clock_settime (cd.clk, &ts64);else err = -EOPNOTSUPP ; out:
@@ -403,29 +410,36 @@ static void pc_timer_gettime(struct k_itimer *kit, struct itimerspec *ts) {clockid_t id = kit->it_clock;struct posix_clock_desc cd; +struct itimerspec64 ts64;if (get_clock_desc (id, &cd))return ; -if (cd.clk->ops.timer_gettime) - cd.clk->ops.timer_gettime (cd.clk, kit, ts); - +if (cd.clk->ops.timer_gettime) { + cd.clk->ops.timer_gettime (cd.clk, kit, &ts64); + *ts =itimerspec64_to_itimerspec (&ts64); + }put_clock_desc (&cd); }static int pc_timer_settime (struct k_itimer *kit,int flags,struct itimerspec *ts,struct itimerspec *old) { +struct itimerspec64 ts64 =itimerspec_to_itimerspec64 (ts);clockid_t id = kit->it_clock;struct posix_clock_desc cd; +struct itimerspec64 old64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.timer_settime) - err = cd.clk->ops.timer_settime (cd.clk, kit, flags, ts, old); +if (cd.clk->ops.timer_settime) { + err = cd.clk->ops.timer_settime (cd.clk, kit, flags, &ts64, &old64); +if (old) + *old =itimerspec64_to_itimerspec (&old64); + }else err = -EOPNOTSUPP ;
PATCH v2 3/7 Change k_clock clock_get() to use timespec64
In reply to Deepa Dinamanistruct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
The syscall interfaces themselves will be changed
in a separate series.
--- drivers/char/mmtimer.c | 4 ++-- include/linux/posix-timers.h | 2 +- include/linux/timekeeping.h | 5 +++++ kernel/time/alarmtimer.c | 4 ++-- kernel/time/posix-clock.c | 9 +++------ kernel/time/posix-cpu-timers.c | 10 +++++----- kernel/time/posix-stubs.c | 9 ++++++--- kernel/time/posix-timers.c | 32 +++++++++++++++++--------------- 8 files changed, 41 insertions(+), 34 deletions(-)
drivers/char/mmtimer.c +2 -2
@@ -478,13 +478,13 @@ static int sgi_clock_period;static struct timespec sgi_clock_offset;static int sgi_clock_period; -static int sgi_clock_get (clockid_t clockid,struct timespec *tp) +static int sgi_clock_get (clockid_t clockid,struct timespec64 *tp) {u64 nsec; nsec =rtc_time () * sgi_clock_period + sgi_clock_offset.tv_nsec; - *tp =ns_to_timespec (nsec); + *tp =ns_to_timespec64 (nsec); tp->tv_sec += sgi_clock_offset.tv_sec;return 0 ; };
include/linux/posix-timers.h +1 -1
@@ -90,7 +90,7 @@ struct k_clock {int (*clock_getres) (const clockid_t which_clock,struct timespec *tp);int (*clock_set) (const clockid_t which_clock,const struct timespec *tp); -int (*clock_get) (const clockid_t which_clock,struct timespec * tp); +int (*clock_get) (const clockid_t which_clock,struct timespec64 *tp);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,
include/linux/timekeeping.h +5 -0
@@ -258,6 +258,11 @@ static inline void timekeeping_clocktai(struct timespec *ts) *ts =ktime_to_timespec (ktime_get_clocktai ()); } +static inline void timekeeping_clocktai64 (struct timespec64 *ts) +{ + *ts =ktime_to_timespec64 (ktime_get_clocktai ()); +} +/* * RTC specific */
kernel/time/alarmtimer.c +2 -2
@@ -558,14 +558,14 @@ static int alarm_clock_getres(const clockid_t which_clock, struct timespec *tp)* * Provides the underlying alarm base time. */ -static int alarm_clock_get (clockid_t which_clock,struct timespec *tp) +static int alarm_clock_get (clockid_t which_clock,struct timespec64 *tp) {struct alarm_base *base = &alarm_bases[clock2alarm (which_clock)];if (!alarmtimer_get_rtcdev ())return -EINVAL ; - *tp =ktime_to_timespec (base->gettime ()); + *tp =ktime_to_timespec64 (base->gettime ());return 0 ; }
kernel/time/posix-clock.c +3 -6
@@ -297,20 +297,17 @@ static int pc_clock_adjtime(clockid_t id, struct timex *tx)return err; } -static int pc_clock_gettime (clockid_t id,struct timespec *ts) +static int pc_clock_gettime (clockid_t id,struct timespec64 *ts) {struct posix_clock_desc cd; -struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_gettime) { - err = cd.clk->ops.clock_gettime (cd.clk, &ts64); - *ts =timespec64_to_timespec (ts64); - } +if (cd.clk->ops.clock_gettime) + err = cd.clk->ops.clock_gettime (cd.clk, ts);else err = -EOPNOTSUPP ;
kernel/time/posix-cpu-timers.c +5 -5
@@ -261,7 +261,7 @@ static int cpu_clock_sample_group(const clockid_t which_clock,static int posix_cpu_clock_get_task (struct task_struct *tsk,const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {int err = -EINVAL ;u64 rtn;
@@ -275,13 +275,13 @@ static int posix_cpu_clock_get_task(struct task_struct *tsk, }if (!err) - *tp =ns_to_timespec (rtn); + *tp =ns_to_timespec64 (rtn);return err; } -static int posix_cpu_clock_get (const clockid_t which_clock,struct timespec *tp) +static int posix_cpu_clock_get (const clockid_t which_clock,struct timespec64 *tp) {const pid_t pid =CPUCLOCK_PID (which_clock);int err = -EINVAL ;
@@ -1374,7 +1374,7 @@ static int process_cpu_clock_getres(const clockid_t which_clock,return posix_cpu_clock_getres (PROCESS_CLOCK , tp); }static int process_cpu_clock_get (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_get (PROCESS_CLOCK , tp); }
@@ -1399,7 +1399,7 @@ static int thread_cpu_clock_getres(const clockid_t which_clock,return posix_cpu_clock_getres (THREAD_CLOCK , tp); }static int thread_cpu_clock_get (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_get (THREAD_CLOCK , tp); }
kernel/time/posix-stubs.c +6 -3
@@ -64,14 +64,17 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock, struct timespec __user *,tp) { +struct timespec64 kernel_tp64;struct timespec kernel_tp;switch (which_clock) { -case CLOCK_REALTIME :ktime_get_real_ts (&kernel_tp);break ; -case CLOCK_MONOTONIC :ktime_get_ts (&kernel_tp);break ; -case CLOCK_BOOTTIME :get_monotonic_boottime (&kernel_tp);break ; +case CLOCK_REALTIME :ktime_get_real_ts64 (&kernel_tp64);break ; +case CLOCK_MONOTONIC :ktime_get_ts64 (&kernel_tp64);break ; +case CLOCK_BOOTTIME :get_monotonic_boottime64 (&kernel_tp64);break ;default :return -EINVAL ; } + + kernel_tp =timespec64_to_timespec (kernel_tp64);if (copy_to_user (tp, &kernel_tp,sizeof (kernel_tp)))return -EFAULT ;return 0 ;
kernel/time/posix-timers.c +17 -15
@@ -204,9 +204,9 @@ static inline void unlock_timer(struct k_itimer *timr, unsigned long flags) }/* Get clock_realtime */ -static int posix_clock_realtime_get (clockid_t which_clock,struct timespec *tp) +static int posix_clock_realtime_get (clockid_t which_clock,struct timespec64 *tp) { -ktime_get_real_ts (tp); +ktime_get_real_ts64 (tp);return 0 ; }
@@ -229,32 +229,32 @@ static int posix_clock_realtime_adj(const clockid_t which_clock,/* * Get monotonic time for posix timers */ -static int posix_ktime_get_ts (clockid_t which_clock,struct timespec *tp) +static int posix_ktime_get_ts (clockid_t which_clock,struct timespec64 *tp) { -ktime_get_ts (tp); +ktime_get_ts64 (tp);return 0 ; }/* * Get monotonic-raw time for posix timers */ -static int posix_get_monotonic_raw (clockid_t which_clock,struct timespec *tp) +static int posix_get_monotonic_raw (clockid_t which_clock,struct timespec64 *tp) { -getrawmonotonic (tp); +getrawmonotonic64 (tp);return 0 ; } -static int posix_get_realtime_coarse (clockid_t which_clock,struct timespec *tp) +static int posix_get_realtime_coarse (clockid_t which_clock,struct timespec64 *tp) { - *tp =current_kernel_time (); + *tp =current_kernel_time64 ();return 0 ; }static int posix_get_monotonic_coarse (clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) { - *tp =get_monotonic_coarse (); + *tp =get_monotonic_coarse64 ();return 0 ; }
@@ -264,15 +264,15 @@ static int posix_get_coarse_res(const clockid_t which_clock, struct timespec *tpreturn 0 ; } -static int posix_get_boottime (const clockid_t which_clock,struct timespec *tp) +static int posix_get_boottime (const clockid_t which_clock,struct timespec64 *tp) { -get_monotonic_boottime (tp); +get_monotonic_boottime64 (tp);return 0 ; } -static int posix_get_tai (clockid_t which_clock,struct timespec *tp) +static int posix_get_tai (clockid_t which_clock,struct timespec64 *tp) { -timekeeping_clocktai (tp); +timekeeping_clocktai64 (tp);return 0 ; }
@@ -1032,13 +1032,15 @@ SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock, struct timespec __user *,tp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 kernel_tp64;struct timespec kernel_tp;int error;if (!kc)return -EINVAL ; - error = kc->clock_get (which_clock, &kernel_tp); + error = kc->clock_get (which_clock, &kernel_tp64); + kernel_tp =timespec64_to_timespec (kernel_tp64);if (!error &©_to_user (tp, &kernel_tp,sizeof (kernel_tp))) error = -EFAULT ;
Signature · 1 line
2.7.4
tip-bot for Deepa Dinamani
merge bot[tip:timers/core] time: Change k_clock clock_get() to use timespec64
time: Change k_clock clock_get() to use timespec64
Commit-ID: 3c9c12f4b4610dba864038c7822b427816f5893c Gitweb: http://git.kernel.org/tip/3c9c12f4b4610dba864038c7822b427816f5893c Author: Deepa Dinamani <[email protected]> AuthorDate: Sun, 26 Mar 2017 12:04:14 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 14 Apr 2017 21:49:55 +0200
time: Change k_clock clock_get() to use timespec64
struct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
The syscall interfaces themselves will be changed in a separate series.
--- drivers/char/mmtimer.c | 4 ++-- include/linux/posix-timers.h | 2 +- include/linux/timekeeping.h | 5 +++++ kernel/time/alarmtimer.c | 4 ++-- kernel/time/posix-clock.c | 9 +++------ kernel/time/posix-cpu-timers.c | 10 +++++----- kernel/time/posix-stubs.c | 9 ++++++--- kernel/time/posix-timers.c | 32 +++++++++++++++++--------------- 8 files changed, 41 insertions(+), 34 deletions(-)
drivers/char/mmtimer.c +2 -2
@@ -478,13 +478,13 @@ static int sgi_clock_period;static struct timespec sgi_clock_offset;static int sgi_clock_period; -static int sgi_clock_get (clockid_t clockid,struct timespec *tp) +static int sgi_clock_get (clockid_t clockid,struct timespec64 *tp) {u64 nsec; nsec =rtc_time () * sgi_clock_period + sgi_clock_offset.tv_nsec; - *tp =ns_to_timespec (nsec); + *tp =ns_to_timespec64 (nsec); tp->tv_sec += sgi_clock_offset.tv_sec;return 0 ; };
include/linux/posix-timers.h +1 -1
@@ -90,7 +90,7 @@ struct k_clock {int (*clock_getres) (const clockid_t which_clock,struct timespec *tp);int (*clock_set) (const clockid_t which_clock,const struct timespec *tp); -int (*clock_get) (const clockid_t which_clock,struct timespec * tp); +int (*clock_get) (const clockid_t which_clock,struct timespec64 *tp);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,
include/linux/timekeeping.h +5 -0
@@ -258,6 +258,11 @@ static inline void timekeeping_clocktai(struct timespec *ts) *ts =ktime_to_timespec (ktime_get_clocktai ()); } +static inline void timekeeping_clocktai64 (struct timespec64 *ts) +{ + *ts =ktime_to_timespec64 (ktime_get_clocktai ()); +} +/* * RTC specific */
kernel/time/alarmtimer.c +2 -2
@@ -558,14 +558,14 @@ static int alarm_clock_getres(const clockid_t which_clock, struct timespec *tp)* * Provides the underlying alarm base time. */ -static int alarm_clock_get (clockid_t which_clock,struct timespec *tp) +static int alarm_clock_get (clockid_t which_clock,struct timespec64 *tp) {struct alarm_base *base = &alarm_bases[clock2alarm (which_clock)];if (!alarmtimer_get_rtcdev ())return -EINVAL ; - *tp =ktime_to_timespec (base->gettime ()); + *tp =ktime_to_timespec64 (base->gettime ());return 0 ; }
kernel/time/posix-clock.c +3 -6
@@ -297,20 +297,17 @@ out:return err; } -static int pc_clock_gettime (clockid_t id,struct timespec *ts) +static int pc_clock_gettime (clockid_t id,struct timespec64 *ts) {struct posix_clock_desc cd; -struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_gettime) { - err = cd.clk->ops.clock_gettime (cd.clk, &ts64); - *ts =timespec64_to_timespec (ts64); - } +if (cd.clk->ops.clock_gettime) + err = cd.clk->ops.clock_gettime (cd.clk, ts);else err = -EOPNOTSUPP ;
kernel/time/posix-cpu-timers.c +5 -5
@@ -261,7 +261,7 @@ static int cpu_clock_sample_group(const clockid_t which_clock,static int posix_cpu_clock_get_task (struct task_struct *tsk,const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {int err = -EINVAL ;u64 rtn;
@@ -275,13 +275,13 @@ static int posix_cpu_clock_get_task(struct task_struct *tsk, }if (!err) - *tp =ns_to_timespec (rtn); + *tp =ns_to_timespec64 (rtn);return err; } -static int posix_cpu_clock_get (const clockid_t which_clock,struct timespec *tp) +static int posix_cpu_clock_get (const clockid_t which_clock,struct timespec64 *tp) {const pid_t pid =CPUCLOCK_PID (which_clock);int err = -EINVAL ;
@@ -1374,7 +1374,7 @@ static int process_cpu_clock_getres(const clockid_t which_clock,return posix_cpu_clock_getres (PROCESS_CLOCK , tp); }static int process_cpu_clock_get (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_get (PROCESS_CLOCK , tp); }
@@ -1399,7 +1399,7 @@ static int thread_cpu_clock_getres(const clockid_t which_clock,return posix_cpu_clock_getres (THREAD_CLOCK , tp); }static int thread_cpu_clock_get (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_get (THREAD_CLOCK , tp); }
kernel/time/posix-stubs.c +6 -3
@@ -64,14 +64,17 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock, struct timespec __user *,tp) { +struct timespec64 kernel_tp64;struct timespec kernel_tp;switch (which_clock) { -case CLOCK_REALTIME :ktime_get_real_ts (&kernel_tp);break ; -case CLOCK_MONOTONIC :ktime_get_ts (&kernel_tp);break ; -case CLOCK_BOOTTIME :get_monotonic_boottime (&kernel_tp);break ; +case CLOCK_REALTIME :ktime_get_real_ts64 (&kernel_tp64);break ; +case CLOCK_MONOTONIC :ktime_get_ts64 (&kernel_tp64);break ; +case CLOCK_BOOTTIME :get_monotonic_boottime64 (&kernel_tp64);break ;default :return -EINVAL ; } + + kernel_tp =timespec64_to_timespec (kernel_tp64);if (copy_to_user (tp, &kernel_tp,sizeof (kernel_tp)))return -EFAULT ;return 0 ;
kernel/time/posix-timers.c +17 -15
@@ -204,9 +204,9 @@ static inline void unlock_timer(struct k_itimer *timr, unsigned long flags) }/* Get clock_realtime */ -static int posix_clock_realtime_get (clockid_t which_clock,struct timespec *tp) +static int posix_clock_realtime_get (clockid_t which_clock,struct timespec64 *tp) { -ktime_get_real_ts (tp); +ktime_get_real_ts64 (tp);return 0 ; }
@@ -229,32 +229,32 @@ static int posix_clock_realtime_adj(const clockid_t which_clock,/* * Get monotonic time for posix timers */ -static int posix_ktime_get_ts (clockid_t which_clock,struct timespec *tp) +static int posix_ktime_get_ts (clockid_t which_clock,struct timespec64 *tp) { -ktime_get_ts (tp); +ktime_get_ts64 (tp);return 0 ; }/* * Get monotonic-raw time for posix timers */ -static int posix_get_monotonic_raw (clockid_t which_clock,struct timespec *tp) +static int posix_get_monotonic_raw (clockid_t which_clock,struct timespec64 *tp) { -getrawmonotonic (tp); +getrawmonotonic64 (tp);return 0 ; } -static int posix_get_realtime_coarse (clockid_t which_clock,struct timespec *tp) +static int posix_get_realtime_coarse (clockid_t which_clock,struct timespec64 *tp) { - *tp =current_kernel_time (); + *tp =current_kernel_time64 ();return 0 ; }static int posix_get_monotonic_coarse (clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) { - *tp =get_monotonic_coarse (); + *tp =get_monotonic_coarse64 ();return 0 ; }
@@ -264,15 +264,15 @@ static int posix_get_coarse_res(const clockid_t which_clock, struct timespec *tpreturn 0 ; } -static int posix_get_boottime (const clockid_t which_clock,struct timespec *tp) +static int posix_get_boottime (const clockid_t which_clock,struct timespec64 *tp) { -get_monotonic_boottime (tp); +get_monotonic_boottime64 (tp);return 0 ; } -static int posix_get_tai (clockid_t which_clock,struct timespec *tp) +static int posix_get_tai (clockid_t which_clock,struct timespec64 *tp) { -timekeeping_clocktai (tp); +timekeeping_clocktai64 (tp);return 0 ; }
@@ -1032,13 +1032,15 @@ SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock, struct timespec __user *,tp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 kernel_tp64;struct timespec kernel_tp;int error;if (!kc)return -EINVAL ; - error = kc->clock_get (which_clock, &kernel_tp); + error = kc->clock_get (which_clock, &kernel_tp64); + kernel_tp =timespec64_to_timespec (kernel_tp64);if (!error &©_to_user (tp, &kernel_tp,sizeof (kernel_tp))) error = -EFAULT ;
PATCH v2 4/7 Change k_clock clock_getres() to use timespec64
In reply to Deepa Dinamanistruct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
The syscall interfaces themselves will be changed
in a separate series.
Note that the clock_getres() interface has also been changed to use timespec64 even though this particular interface is not affected by the y2038 problem. This helps verification for internal kernel code for y2038 readiness by getting rid of time_t/ timeval/ timespec.
--- drivers/char/mmtimer.c | 2 +- include/linux/posix-timers.h | 2 +- kernel/time/alarmtimer.c | 2 +- kernel/time/posix-clock.c | 9 +++------ kernel/time/posix-cpu-timers.c | 6 +++--- kernel/time/posix-timers.c | 10 ++++++---- 6 files changed, 15 insertions(+), 16 deletions(-)
drivers/char/mmtimer.c +1 -1
@@ -765,7 +765,7 @@ static int sgi_timer_set(struct k_itimer *timr, int flags,return err; } -static int sgi_clock_getres (const clockid_t which_clock,struct timespec *tp) +static int sgi_clock_getres (const clockid_t which_clock,struct timespec64 *tp) { tp->tv_sec =0 ; tp->tv_nsec = sgi_clock_period;
include/linux/posix-timers.h +1 -1
@@ -87,7 +87,7 @@ struct k_itimer { };struct k_clock { -int (*clock_getres) (const clockid_t which_clock,struct timespec *tp); +int (*clock_getres) (const clockid_t which_clock,struct timespec64 *tp);int (*clock_set) (const clockid_t which_clock,const struct timespec *tp);int (*clock_get) (const clockid_t which_clock,struct timespec64 *tp);
kernel/time/alarmtimer.c +1 -1
@@ -541,7 +541,7 @@ static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,* * Returns the granularity of underlying alarm base clock */ -static int alarm_clock_getres (const clockid_t which_clock,struct timespec *tp) +static int alarm_clock_getres (const clockid_t which_clock,struct timespec64 *tp) {if (!alarmtimer_get_rtcdev ())return -EINVAL ;
kernel/time/posix-clock.c +3 -6
@@ -316,20 +316,17 @@ static int pc_clock_gettime(clockid_t id, struct timespec64 *ts)return err; } -static int pc_clock_getres (clockid_t id,struct timespec *ts) +static int pc_clock_getres (clockid_t id,struct timespec64 *ts) {struct posix_clock_desc cd; -struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_getres) { - err = cd.clk->ops.clock_getres (cd.clk, &ts64); - *ts =timespec64_to_timespec (ts64); - } +if (cd.clk->ops.clock_getres) + err = cd.clk->ops.clock_getres (cd.clk, ts);else err = -EOPNOTSUPP ;
kernel/time/posix-cpu-timers.c +3 -3
@@ -116,7 +116,7 @@ static inline u64 virt_ticks(struct task_struct *p) }static int -posix_cpu_clock_getres (const clockid_t which_clock,struct timespec *tp) +posix_cpu_clock_getres (const clockid_t which_clock,struct timespec64 *tp) {int error =check_clock (which_clock);if (!error) {
@@ -1369,7 +1369,7 @@ static long posix_cpu_nsleep_restart(struct restart_block *restart_block)#define THREAD_CLOCK MAKE_THREAD_CPUCLOCK(0, CPUCLOCK_SCHED)static int process_cpu_clock_getres (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_getres (PROCESS_CLOCK , tp); }
@@ -1394,7 +1394,7 @@ static long process_cpu_nsleep_restart(struct restart_block *restart_block)return -EINVAL ; }static int thread_cpu_clock_getres (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_getres (THREAD_CLOCK , tp); }
kernel/time/posix-timers.c +6 -4
@@ -258,9 +258,9 @@ static int posix_get_monotonic_coarse(clockid_t which_clock,return 0 ; } -static int posix_get_coarse_res (const clockid_t which_clock,struct timespec *tp) +static int posix_get_coarse_res (const clockid_t which_clock,struct timespec64 *tp) { - *tp =ktime_to_timespec (KTIME_LOW_RES ); + *tp =ktime_to_timespec64 (KTIME_LOW_RES );return 0 ; }
@@ -276,7 +276,7 @@ static int posix_get_tai(clockid_t which_clock, struct timespec64 *tp)return 0 ; } -static int posix_get_hrtimer_res (clockid_t which_clock,struct timespec *tp) +static int posix_get_hrtimer_res (clockid_t which_clock,struct timespec64 *tp) { tp->tv_sec =0 ; tp->tv_nsec = hrtimer_resolution;
@@ -1075,13 +1075,15 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct timespec __user *, tp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 rtn_tp64;struct timespec rtn_tp;int error;if (!kc)return -EINVAL ; - error = kc->clock_getres (which_clock, &rtn_tp); + error = kc->clock_getres (which_clock, &rtn_tp64); + rtn_tp =timespec64_to_timespec (rtn_tp64);if (!error && tp &©_to_user (tp, &rtn_tp,sizeof (rtn_tp))) error = -EFAULT ;
Signature · 1 line
2.7.4
tip-bot for Deepa Dinamani
merge bot[tip:timers/core] time: Change k_clock clock_getres() to use timespec64
time: Change k_clock clock_getres() to use timespec64
Commit-ID: d2e3e0ca5df7f4ffe90a04790b3be20485df056a Gitweb: http://git.kernel.org/tip/d2e3e0ca5df7f4ffe90a04790b3be20485df056a Author: Deepa Dinamani <[email protected]> AuthorDate: Sun, 26 Mar 2017 12:04:15 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 14 Apr 2017 21:49:55 +0200
time: Change k_clock clock_getres() to use timespec64
struct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel. The syscall interfaces themselves will be changed in a separate series.
The clock_getres() interface has also been changed to use timespec64 even though this particular interface is not affected by the y2038 problem. This helps verification for internal kernel code for y2038 readiness by getting rid of time_t/ timeval/ timespec completely.
--- drivers/char/mmtimer.c | 2 +- include/linux/posix-timers.h | 2 +- kernel/time/alarmtimer.c | 2 +- kernel/time/posix-clock.c | 9 +++------ kernel/time/posix-cpu-timers.c | 6 +++--- kernel/time/posix-timers.c | 10 ++++++---- 6 files changed, 15 insertions(+), 16 deletions(-)
drivers/char/mmtimer.c +1 -1
@@ -765,7 +765,7 @@ static int sgi_timer_set(struct k_itimer *timr, int flags,return err; } -static int sgi_clock_getres (const clockid_t which_clock,struct timespec *tp) +static int sgi_clock_getres (const clockid_t which_clock,struct timespec64 *tp) { tp->tv_sec =0 ; tp->tv_nsec = sgi_clock_period;
include/linux/posix-timers.h +1 -1
@@ -87,7 +87,7 @@ struct k_itimer { };struct k_clock { -int (*clock_getres) (const clockid_t which_clock,struct timespec *tp); +int (*clock_getres) (const clockid_t which_clock,struct timespec64 *tp);int (*clock_set) (const clockid_t which_clock,const struct timespec *tp);int (*clock_get) (const clockid_t which_clock,struct timespec64 *tp);
kernel/time/alarmtimer.c +1 -1
@@ -541,7 +541,7 @@ static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,* * Returns the granularity of underlying alarm base clock */ -static int alarm_clock_getres (const clockid_t which_clock,struct timespec *tp) +static int alarm_clock_getres (const clockid_t which_clock,struct timespec64 *tp) {if (!alarmtimer_get_rtcdev ())return -EINVAL ;
kernel/time/posix-clock.c +3 -6
@@ -316,20 +316,17 @@ static int pc_clock_gettime(clockid_t id, struct timespec64 *ts)return err; } -static int pc_clock_getres (clockid_t id,struct timespec *ts) +static int pc_clock_getres (clockid_t id,struct timespec64 *ts) {struct posix_clock_desc cd; -struct timespec64 ts64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.clock_getres) { - err = cd.clk->ops.clock_getres (cd.clk, &ts64); - *ts =timespec64_to_timespec (ts64); - } +if (cd.clk->ops.clock_getres) + err = cd.clk->ops.clock_getres (cd.clk, ts);else err = -EOPNOTSUPP ;
kernel/time/posix-cpu-timers.c +3 -3
@@ -116,7 +116,7 @@ static inline u64 virt_ticks(struct task_struct *p) }static int -posix_cpu_clock_getres (const clockid_t which_clock,struct timespec *tp) +posix_cpu_clock_getres (const clockid_t which_clock,struct timespec64 *tp) {int error =check_clock (which_clock);if (!error) {
@@ -1369,7 +1369,7 @@ static long posix_cpu_nsleep_restart(struct restart_block *restart_block)#define THREAD_CLOCK MAKE_THREAD_CPUCLOCK(0, CPUCLOCK_SCHED)static int process_cpu_clock_getres (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_getres (PROCESS_CLOCK , tp); }
@@ -1394,7 +1394,7 @@ static long process_cpu_nsleep_restart(struct restart_block *restart_block)return -EINVAL ; }static int thread_cpu_clock_getres (const clockid_t which_clock, -struct timespec *tp) +struct timespec64 *tp) {return posix_cpu_clock_getres (THREAD_CLOCK , tp); }
kernel/time/posix-timers.c +6 -4
@@ -258,9 +258,9 @@ static int posix_get_monotonic_coarse(clockid_t which_clock,return 0 ; } -static int posix_get_coarse_res (const clockid_t which_clock,struct timespec *tp) +static int posix_get_coarse_res (const clockid_t which_clock,struct timespec64 *tp) { - *tp =ktime_to_timespec (KTIME_LOW_RES ); + *tp =ktime_to_timespec64 (KTIME_LOW_RES );return 0 ; }
@@ -276,7 +276,7 @@ static int posix_get_tai(clockid_t which_clock, struct timespec64 *tp)return 0 ; } -static int posix_get_hrtimer_res (clockid_t which_clock,struct timespec *tp) +static int posix_get_hrtimer_res (clockid_t which_clock,struct timespec64 *tp) { tp->tv_sec =0 ; tp->tv_nsec = hrtimer_resolution;
@@ -1075,13 +1075,15 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct timespec __user *, tp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 rtn_tp64;struct timespec rtn_tp;int error;if (!kc)return -EINVAL ; - error = kc->clock_getres (which_clock, &rtn_tp); + error = kc->clock_getres (which_clock, &rtn_tp64); + rtn_tp =timespec64_to_timespec (rtn_tp64);if (!error && tp &©_to_user (tp, &rtn_tp,sizeof (rtn_tp))) error = -EFAULT ;
PATCH v2 5/7 Change k_clock clock_set() to use timespec64
In reply to Deepa Dinamanistruct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
The syscall interfaces themselves will be changed
in a separate series.
--- drivers/char/mmtimer.c | 2 +- include/linux/posix-timers.h | 2 +- kernel/time/posix-clock.c | 5 ++--- kernel/time/posix-cpu-timers.c | 2 +- kernel/time/posix-timers.c | 11 +++++------ 5 files changed, 10 insertions(+), 12 deletions(-)
drivers/char/mmtimer.c +1 -1
@@ -489,7 +489,7 @@ static int sgi_clock_get(clockid_t clockid, struct timespec64 *tp)return 0 ; }; -static int sgi_clock_set (const clockid_t clockid,const struct timespec *tp) +static int sgi_clock_set (const clockid_t clockid,const struct timespec64 *tp) {u64 nsec;
include/linux/posix-timers.h +1 -1
@@ -89,7 +89,7 @@ struct k_itimer {struct k_clock {int (*clock_getres) (const clockid_t which_clock,struct timespec64 *tp);int (*clock_set) (const clockid_t which_clock, -const struct timespec *tp); +const struct timespec64 *tp);int (*clock_get) (const clockid_t which_clock,struct timespec64 *tp);int (*clock_adj) (const clockid_t which_clock,struct timex *tx);int (*timer_create) (struct k_itimer *timer);
kernel/time/posix-clock.c +2 -3
@@ -335,9 +335,8 @@ static int pc_clock_getres(clockid_t id, struct timespec64 *ts)return err; } -static int pc_clock_settime (clockid_t id,const struct timespec *ts) +static int pc_clock_settime (clockid_t id,const struct timespec64 *ts) { -struct timespec64 ts64 =timespec_to_timespec64 (*ts);struct posix_clock_desc cd;int err;
@@ -351,7 +350,7 @@ static int pc_clock_settime(clockid_t id, const struct timespec *ts) }if (cd.clk->ops.clock_settime) - err = cd.clk->ops.clock_settime (cd.clk, &ts64); + err = cd.clk->ops.clock_settime (cd.clk, ts);else err = -EOPNOTSUPP ; out:
kernel/time/posix-cpu-timers.c +1 -1
@@ -135,7 +135,7 @@ posix_cpu_clock_getres(const clockid_t which_clock, struct timespec64 *tp) }static int -posix_cpu_clock_set (const clockid_t which_clock,const struct timespec *tp) +posix_cpu_clock_set (const clockid_t which_clock,const struct timespec64 *tp) {/* * You can never reset a CPU clock, but we check for other errors
kernel/time/posix-timers.c +5 -6
@@ -212,12 +212,9 @@ static int posix_clock_realtime_get(clockid_t which_clock, struct timespec64 *tp/* Set clock_realtime */ static int posix_clock_realtime_set (const clockid_t which_clock, -const struct timespec *tp) +const struct timespec64 *tp) { -struct timespec64 tp64; - - tp64 =timespec_to_timespec64 (*tp); -return do_sys_settimeofday64 (&tp64,NULL ); +return do_sys_settimeofday64 (tp,NULL ); } static int posix_clock_realtime_adj(const clockid_t which_clock,
@@ -1017,6 +1014,7 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, const struct timespec __user *, tp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 new_tp64;struct timespec new_tp;if (!kc || !kc->clock_set)
@@ -1024,8 +1022,9 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,if (copy_from_user (&new_tp, tp,sizeof (*tp)))return -EFAULT ; + new_tp64 =timespec_to_timespec64 (new_tp); -return kc->clock_set (which_clock, &new_tp); +return kc->clock_set (which_clock, &new_tp64); } SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
Signature · 1 line
2.7.4
tip-bot for Deepa Dinamani
merge bot[tip:timers/core] time: Change k_clock clock_set() to use timespec64
time: Change k_clock clock_set() to use timespec64
Commit-ID: 0fe6afe3834ba13d75fa1168f0f66f08b427e1c0 Gitweb: http://git.kernel.org/tip/0fe6afe3834ba13d75fa1168f0f66f08b427e1c0 Author: Deepa Dinamani <[email protected]> AuthorDate: Sun, 26 Mar 2017 12:04:16 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 14 Apr 2017 21:49:56 +0200
time: Change k_clock clock_set() to use timespec64
struct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
The syscall interfaces themselves will be changed in a separate series.
--- drivers/char/mmtimer.c | 2 +- include/linux/posix-timers.h | 2 +- kernel/time/posix-clock.c | 5 ++--- kernel/time/posix-cpu-timers.c | 2 +- kernel/time/posix-timers.c | 11 +++++------ 5 files changed, 10 insertions(+), 12 deletions(-)
drivers/char/mmtimer.c +1 -1
@@ -489,7 +489,7 @@ static int sgi_clock_get(clockid_t clockid, struct timespec64 *tp)return 0 ; }; -static int sgi_clock_set (const clockid_t clockid,const struct timespec *tp) +static int sgi_clock_set (const clockid_t clockid,const struct timespec64 *tp) {u64 nsec;
include/linux/posix-timers.h +1 -1
@@ -89,7 +89,7 @@ struct k_itimer {struct k_clock {int (*clock_getres) (const clockid_t which_clock,struct timespec64 *tp);int (*clock_set) (const clockid_t which_clock, -const struct timespec *tp); +const struct timespec64 *tp);int (*clock_get) (const clockid_t which_clock,struct timespec64 *tp);int (*clock_adj) (const clockid_t which_clock,struct timex *tx);int (*timer_create) (struct k_itimer *timer);
kernel/time/posix-clock.c +2 -3
@@ -335,9 +335,8 @@ static int pc_clock_getres(clockid_t id, struct timespec64 *ts)return err; } -static int pc_clock_settime (clockid_t id,const struct timespec *ts) +static int pc_clock_settime (clockid_t id,const struct timespec64 *ts) { -struct timespec64 ts64 =timespec_to_timespec64 (*ts);struct posix_clock_desc cd;int err;
@@ -351,7 +350,7 @@ static int pc_clock_settime(clockid_t id, const struct timespec *ts) }if (cd.clk->ops.clock_settime) - err = cd.clk->ops.clock_settime (cd.clk, &ts64); + err = cd.clk->ops.clock_settime (cd.clk, ts);else err = -EOPNOTSUPP ; out:
kernel/time/posix-cpu-timers.c +1 -1
@@ -135,7 +135,7 @@ posix_cpu_clock_getres(const clockid_t which_clock, struct timespec64 *tp) }static int -posix_cpu_clock_set (const clockid_t which_clock,const struct timespec *tp) +posix_cpu_clock_set (const clockid_t which_clock,const struct timespec64 *tp) {/* * You can never reset a CPU clock, but we check for other errors
kernel/time/posix-timers.c +5 -6
@@ -212,12 +212,9 @@ static int posix_clock_realtime_get(clockid_t which_clock, struct timespec64 *tp/* Set clock_realtime */ static int posix_clock_realtime_set (const clockid_t which_clock, -const struct timespec *tp) +const struct timespec64 *tp) { -struct timespec64 tp64; - - tp64 =timespec_to_timespec64 (*tp); -return do_sys_settimeofday64 (&tp64,NULL ); +return do_sys_settimeofday64 (tp,NULL ); } static int posix_clock_realtime_adj(const clockid_t which_clock,
@@ -1017,6 +1014,7 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, const struct timespec __user *, tp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 new_tp64;struct timespec new_tp;if (!kc || !kc->clock_set)
@@ -1024,8 +1022,9 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,if (copy_from_user (&new_tp, tp,sizeof (*tp)))return -EFAULT ; + new_tp64 =timespec_to_timespec64 (new_tp); -return kc->clock_set (which_clock, &new_tp); +return kc->clock_set (which_clock, &new_tp64); } SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
PATCH v2 6/7 Change k_clock timer_set() and timer_get() to use timespec64
In reply to Deepa Dinamanistruct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
struct itimerspec internally uses struct timespec. Use struct itimerspec64 which uses struct timespec64.
The syscall interfaces themselves will be changed in a separate series.
--- drivers/char/mmtimer.c | 20 ++++++++++---------- include/linux/posix-timers.h | 12 ++++++------ kernel/time/alarmtimer.c | 14 +++++++------- kernel/time/posix-clock.c | 21 +++++++-------------- kernel/time/posix-cpu-timers.c | 28 ++++++++++++++++------------ kernel/time/posix-timers.c | 35 ++++++++++++++++++++--------------- 6 files changed, 66 insertions(+), 64 deletions(-)
drivers/char/mmtimer.c +10 -10
@@ -657,7 +657,7 @@ static int sgi_timer_del(struct k_itimer *timr) }/* Assumption: it_lock is already held with irq's disabled */ -static void sgi_timer_get (struct k_itimer *timr,struct itimerspec *cur_setting) +static void sgi_timer_get (struct k_itimer *timr,struct itimerspec64 *cur_setting) {if (timr->it.mmtimer.clock ==TIMER_OFF ) {
@@ -668,14 +668,14 @@ static void sgi_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)return ; } - cur_setting->it_interval =ns_to_timespec (timr->it.mmtimer.incr * sgi_clock_period); - cur_setting->it_value =ns_to_timespec ((timr->it.mmtimer.expires -rtc_time ()) * sgi_clock_period); + cur_setting->it_interval =ns_to_timespec64 (timr->it.mmtimer.incr * sgi_clock_period); + cur_setting->it_value =ns_to_timespec64 ((timr->it.mmtimer.expires -rtc_time ()) * sgi_clock_period); }static int sgi_timer_set (struct k_itimer *timr,int flags, -struct itimerspec * new_setting, -struct itimerspec * old_setting) +struct itimerspec64 *new_setting, +struct itimerspec64 *old_setting) {unsigned long when, period, irqflags;int err =0 ;
@@ -687,8 +687,8 @@ static int sgi_timer_set(struct k_itimer *timr, int flags,sgi_timer_get (timr, old_setting);sgi_timer_del (timr); - when =timespec_to_ns (&new_setting->it_value); - period =timespec_to_ns (&new_setting->it_interval); + when =timespec64_to_ns (&new_setting->it_value); + period =timespec64_to_ns (&new_setting->it_interval);if (when ==0 )/* Clear timer */
@@ -699,11 +699,11 @@ static int sgi_timer_set(struct k_itimer *timr, int flags,return -ENOMEM ;if (flags &TIMER_ABSTIME ) { -struct timespec n; +struct timespec64 n;unsigned long now; -getnstimeofday (&n); - now =timespec_to_ns (&n); +getnstimeofday64 (&n); + now =timespec64_to_ns (&n);if (when > now) when -= now;else
include/linux/posix-timers.h +6 -6
@@ -96,13 +96,13 @@ struct k_clock {int (*nsleep) (const clockid_t which_clock,int flags,struct timespec *,struct timespec __user *);long (*nsleep_restart) (struct restart_block *restart_block); -int (*timer_set) (struct k_itimer * timr,int flags, -struct itimerspec * new_setting, -struct itimerspec * old_setting); -int (*timer_del) (struct k_itimer * timr); +int (*timer_set) (struct k_itimer *timr,int flags, +struct itimerspec64 *new_setting, +struct itimerspec64 *old_setting); +int (*timer_del) (struct k_itimer *timr);#define TIMER_RETRY 1 -void (*timer_get) (struct k_itimer * timr, -struct itimerspec * cur_setting); +void (*timer_get) (struct k_itimer *timr, +struct itimerspec64 *cur_setting); };extern struct k_clock clock_posix_cpu;
kernel/time/alarmtimer.c +7 -7
@@ -598,19 +598,19 @@ static int alarm_timer_create(struct k_itimer *new_timer)* Copies out the current itimerspec data */ static void alarm_timer_get (struct k_itimer *timr, -struct itimerspec *cur_setting) +struct itimerspec64 *cur_setting) {ktime_t relative_expiry_time =alarm_expires_remaining (&(timr->it.alarm.alarmtimer));if (ktime_to_ns (relative_expiry_time) >0 ) { - cur_setting->it_value =ktime_to_timespec (relative_expiry_time); + cur_setting->it_value =ktime_to_timespec64 (relative_expiry_time); }else { cur_setting->it_value.tv_sec =0 ; cur_setting->it_value.tv_nsec =0 ; } - cur_setting->it_interval =ktime_to_timespec (timr->it.alarm.interval); + cur_setting->it_interval =ktime_to_timespec64 (timr->it.alarm.interval); }/**
@@ -640,8 +640,8 @@ static int alarm_timer_del(struct k_itimer *timr)* Sets the timer to new_setting, and starts the timer. */ static int alarm_timer_set (struct k_itimer *timr,int flags, -struct itimerspec *new_setting, -struct itimerspec *old_setting) +struct itimerspec64 *new_setting, +struct itimerspec64 *old_setting) {ktime_t exp;
@@ -659,8 +659,8 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,return TIMER_RETRY ;/* start the timer */ - timr->it.alarm.interval =timespec_to_ktime (new_setting->it_interval); - exp =timespec_to_ktime (new_setting->it_value); + timr->it.alarm.interval =timespec64_to_ktime (new_setting->it_interval); + exp =timespec64_to_ktime (new_setting->it_value);/* Convert (if necessary) to absolute time */ if (flags !=TIMER_ABSTIME ) {ktime_t now;
kernel/time/posix-clock.c +7 -14
@@ -399,40 +399,33 @@ static int pc_timer_delete(struct k_itimer *kit)return err; } -static void pc_timer_gettime (struct k_itimer *kit,struct itimerspec *ts) +static void pc_timer_gettime (struct k_itimer *kit,struct itimerspec64 *ts) {clockid_t id = kit->it_clock;struct posix_clock_desc cd; -struct itimerspec64 ts64;if (get_clock_desc (id, &cd))return ; -if (cd.clk->ops.timer_gettime) { - cd.clk->ops.timer_gettime (cd.clk, kit, &ts64); - *ts =itimerspec64_to_itimerspec (&ts64); - } +if (cd.clk->ops.timer_gettime) + cd.clk->ops.timer_gettime (cd.clk, kit, ts); +put_clock_desc (&cd); }static int pc_timer_settime (struct k_itimer *kit,int flags, -struct itimerspec *ts,struct itimerspec *old) +struct itimerspec64 *ts,struct itimerspec64 *old) { -struct itimerspec64 ts64 =itimerspec_to_itimerspec64 (ts);clockid_t id = kit->it_clock;struct posix_clock_desc cd; -struct itimerspec64 old64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.timer_settime) { - err = cd.clk->ops.timer_settime (cd.clk, kit, flags, &ts64, &old64); -if (old) - *old =itimerspec64_to_itimerspec (&old64); - } +if (cd.clk->ops.timer_settime) + err = cd.clk->ops.timer_settime (cd.clk, kit, flags, ts, old);else err = -EOPNOTSUPP ;
kernel/time/posix-cpu-timers.c +16 -12
@@ -562,7 +562,7 @@ static int cpu_timer_sample_group(const clockid_t which_clock,* and try again. (This happens when the timer is in the middle of firing.) */ static int posix_cpu_timer_set (struct k_itimer *timer,int timer_flags, -struct itimerspec *new,struct itimerspec *old) +struct itimerspec64 *new,struct itimerspec64 *old) {unsigned long flags;struct sighand_struct *sighand;
@@ -572,7 +572,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,WARN_ON_ONCE (p ==NULL ); - new_expires =timespec_to_ns (&new->it_value); + new_expires =timespec64_to_ns (&new->it_value);/* * Protect against sighand release/switch in exit/exec and p->cpu_timers
@@ -633,7 +633,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,bump_cpu_timer (timer, val);if (val < timer->it.cpu.expires) { old_expires = timer->it.cpu.expires - val; - old->it_value =ns_to_timespec (old_expires); + old->it_value =ns_to_timespec64 (old_expires); }else { old->it_value.tv_nsec =1 ; old->it_value.tv_sec =0 ;
@@ -671,7 +671,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,* Install the new reload setting, and * set up the signal and overrun bookkeeping. */ - timer->it.cpu.incr =timespec_to_ns (&new->it_interval); + timer->it.cpu.incr =timespec64_to_ns (&new->it_interval);/* * This acts as a modification timestamp for the timer,
@@ -695,12 +695,12 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags, ret =0 ; out:if (old) - old->it_interval =ns_to_timespec (old_incr); + old->it_interval =ns_to_timespec64 (old_incr);return ret; } -static void posix_cpu_timer_get (struct k_itimer *timer,struct itimerspec *itp) +static void posix_cpu_timer_get (struct k_itimer *timer,struct itimerspec64 *itp) {u64 now;struct task_struct *p = timer->it.cpu.task;
@@ -710,7 +710,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)/* * Easy part: convert the reload time. */ - itp->it_interval =ns_to_timespec (timer->it.cpu.incr); + itp->it_interval =ns_to_timespec64 (timer->it.cpu.incr);if (timer->it.cpu.expires ==0 ) {/* Timer not armed at all. */ itp->it_value.tv_sec = itp->it_value.tv_nsec =0 ;
@@ -739,7 +739,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)* Call the timer disarmed, nothing else to do. */ timer->it.cpu.expires =0 ; - itp->it_value =ns_to_timespec (timer->it.cpu.expires); + itp->it_value =ns_to_timespec64 (timer->it.cpu.expires);return ; }else {cpu_timer_sample_group (timer->it_clock, p, &now);
@@ -748,7 +748,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp) }if (now < timer->it.cpu.expires) { - itp->it_value =ns_to_timespec (timer->it.cpu.expires - now); + itp->it_value =ns_to_timespec64 (timer->it.cpu.expires - now); }else {/* * The timer should have expired already, but the firing
@@ -1221,6 +1221,7 @@ 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 timespec *rqtp,struct itimerspec *it) { +struct itimerspec64 it64;struct k_itimer timer;int error;
@@ -1234,13 +1235,14 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags, error =posix_cpu_timer_create (&timer); timer.it_process = current;if (!error) { -static struct itimerspec zero_it; +static struct itimerspec64 zero_it;memset (it,0 ,sizeof *it); it->it_value = *rqtp;spin_lock_irq (&timer.it_lock); - error =posix_cpu_timer_set (&timer, flags, it,NULL ); + it64 =itimerspec_to_itimerspec64 (it); + error =posix_cpu_timer_set (&timer, flags, &it64,NULL );if (error) {spin_unlock_irq (&timer.it_lock);return error;
@@ -1270,7 +1272,9 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,* We were interrupted by a signal. */ *rqtp =ns_to_timespec (timer.it.cpu.expires); - error =posix_cpu_timer_set (&timer,0 , &zero_it, it); + it64 =itimerspec_to_itimerspec64 (it); + error =posix_cpu_timer_set (&timer,0 , &zero_it, &it64); + *it =itimerspec64_to_itimerspec (&it64);if (!error) {/* * Timer is now unarmed, deletion can not fail.
kernel/time/posix-timers.c +20 -15
@@ -133,9 +133,9 @@ static struct k_clock posix_clocks[MAX_CLOCKS];static int common_nsleep (const clockid_t ,int flags,struct timespec *t,struct timespec __user *rmtp);static int common_timer_create (struct k_itimer *new_timer); -static void common_timer_get (struct k_itimer *,struct itimerspec *); +static void common_timer_get (struct k_itimer *,struct itimerspec64 *);static int common_timer_set (struct k_itimer *,int , -struct itimerspec *,struct itimerspec *); +struct itimerspec64 *,struct itimerspec64 *);static int common_timer_del (struct k_itimer *timer);static enum hrtimer_restart posix_timer_fn (struct hrtimer *data);
@@ -734,18 +734,18 @@ static struct k_itimer *__lock_timer(timer_t timer_id, unsigned long *flags)* report. */ static void -common_timer_get (struct k_itimer *timr,struct itimerspec *cur_setting) +common_timer_get (struct k_itimer *timr,struct itimerspec64 *cur_setting) {ktime_t now, remaining, iv;struct hrtimer *timer = &timr->it.real.timer; -memset (cur_setting,0 ,sizeof (struct itimerspec )); +memset (cur_setting,0 ,sizeof (struct itimerspec64 )); iv = timr->it.real.interval;/* interval timer ? */ if (iv) - cur_setting->it_interval =ktime_to_timespec (iv); + cur_setting->it_interval =ktime_to_timespec64 (iv);else if (!hrtimer_active (timer) && (timr->it_sigev_notify & ~SIGEV_THREAD_ID ) !=SIGEV_NONE )return ;
@@ -771,13 +771,14 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)if ((timr->it_sigev_notify & ~SIGEV_THREAD_ID ) !=SIGEV_NONE ) cur_setting->it_value.tv_nsec =1 ; }else - cur_setting->it_value =ktime_to_timespec (remaining); + cur_setting->it_value =ktime_to_timespec64 (remaining); }/* Get the time remaining on a POSIX.1b interval timer. */ SYSCALL_DEFINE2 (timer_gettime, timer_t, timer_id, struct itimerspec __user *, setting) { +struct itimerspec64 cur_setting64;struct itimerspec cur_setting;struct k_itimer *timr;struct k_clock *kc;
@@ -792,10 +793,11 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,if (WARN_ON_ONCE (!kc || !kc->timer_get)) ret = -EINVAL ;else - kc->timer_get (timr, &cur_setting); + kc->timer_get (timr, &cur_setting64);unlock_timer (timr, flags); + cur_setting =itimerspec64_to_itimerspec (&cur_setting64);if (!ret &©_to_user (setting, &cur_setting,sizeof (cur_setting)))return -EFAULT ;
@@ -831,7 +833,7 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id)/* timr->it_lock is taken. */ static int common_timer_set (struct k_itimer *timr,int flags, -struct itimerspec *new_setting,struct itimerspec *old_setting) +struct itimerspec64 *new_setting,struct itimerspec64 *old_setting) {struct hrtimer *timer = &timr->it.real.timer;enum hrtimer_mode mode;
@@ -860,10 +862,10 @@ common_timer_set(struct k_itimer *timr, int flags,hrtimer_init (&timr->it.real.timer, timr->it_clock, mode); timr->it.real.timer.function = posix_timer_fn; -hrtimer_set_expires (timer,timespec_to_ktime (new_setting->it_value)); +hrtimer_set_expires (timer,timespec64_to_ktime (new_setting->it_value));/* Convert interval */ - timr->it.real.interval =timespec_to_ktime (new_setting->it_interval); + timr->it.real.interval =timespec64_to_ktime (new_setting->it_interval);/* SIGEV_NONE timers are not queued ! See common_timer_get */ if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID ) ==SIGEV_NONE )) {
@@ -883,11 +885,12 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags, const struct itimerspec __user *, new_setting, struct itimerspec __user *, old_setting) { - struct k_itimer *timr; + struct itimerspec64 new_spec64, old_spec64; +struct itimerspec64 *rtn = old_setting ? &old_spec64 :NULL ;struct itimerspec new_spec, old_spec; +struct k_itimer *timr;int error =0 ;unsigned long flag; -struct itimerspec *rtn = old_setting ? &old_spec :NULL ;struct k_clock *kc;if (!new_setting)
@@ -895,9 +898,10 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,if (copy_from_user (&new_spec, new_setting,sizeof (new_spec)))return -EFAULT ; + new_spec64 =itimerspec_to_itimerspec64 (&new_spec); -if (!timespec_valid (&new_spec.it_interval) || - !timespec_valid (&new_spec.it_value)) +if (!timespec64_valid (&new_spec64.it_interval) || + !timespec64_valid (&new_spec64.it_value))return -EINVAL ; retry: timr =lock_timer (timer_id, &flag);
@@ -908,7 +912,7 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,if (WARN_ON_ONCE (!kc || !kc->timer_set)) error = -EINVAL ;else - error = kc->timer_set (timr, flags, &new_spec, rtn); + error = kc->timer_set (timr, flags, &new_spec64, rtn);unlock_timer (timr, flag);if (error ==TIMER_RETRY ) {
@@ -916,6 +920,7 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags, goto retry; } + old_spec =itimerspec64_to_itimerspec (&old_spec64);if (old_setting && !error &©_to_user (old_setting, &old_spec,sizeof (old_spec))) error = -EFAULT ;
Signature · 1 line
2.7.4
tip-bot for Deepa Dinamani
merge bot[tip:timers/core] time: Change k_clock timer_set() and timer_get() to use timespec64
time: Change k_clock timer_set() and timer_get() to use timespec64
Commit-ID: 5f252b325625c13db1dbc76ac6cdb49ee3bd062e Gitweb: http://git.kernel.org/tip/5f252b325625c13db1dbc76ac6cdb49ee3bd062e Author: Deepa Dinamani <[email protected]> AuthorDate: Sun, 26 Mar 2017 12:04:17 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 14 Apr 2017 21:49:56 +0200
time: Change k_clock timer_set() and timer_get() to use timespec64
struct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
struct itimerspec internally uses struct timespec. Use struct itimerspec64 which uses struct timespec64.
The syscall interfaces themselves will be changed in a separate series.
--- drivers/char/mmtimer.c | 20 ++++++++++---------- include/linux/posix-timers.h | 12 ++++++------ kernel/time/alarmtimer.c | 14 +++++++------- kernel/time/posix-clock.c | 21 +++++++-------------- kernel/time/posix-cpu-timers.c | 28 ++++++++++++++++------------ kernel/time/posix-timers.c | 37 +++++++++++++++++++++---------------- 6 files changed, 67 insertions(+), 65 deletions(-)
drivers/char/mmtimer.c +10 -10
@@ -657,7 +657,7 @@ static int sgi_timer_del(struct k_itimer *timr) }/* Assumption: it_lock is already held with irq's disabled */ -static void sgi_timer_get (struct k_itimer *timr,struct itimerspec *cur_setting) +static void sgi_timer_get (struct k_itimer *timr,struct itimerspec64 *cur_setting) {if (timr->it.mmtimer.clock ==TIMER_OFF ) {
@@ -668,14 +668,14 @@ static void sgi_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)return ; } - cur_setting->it_interval =ns_to_timespec (timr->it.mmtimer.incr * sgi_clock_period); - cur_setting->it_value =ns_to_timespec ((timr->it.mmtimer.expires -rtc_time ()) * sgi_clock_period); + cur_setting->it_interval =ns_to_timespec64 (timr->it.mmtimer.incr * sgi_clock_period); + cur_setting->it_value =ns_to_timespec64 ((timr->it.mmtimer.expires -rtc_time ()) * sgi_clock_period); }static int sgi_timer_set (struct k_itimer *timr,int flags, -struct itimerspec * new_setting, -struct itimerspec * old_setting) +struct itimerspec64 *new_setting, +struct itimerspec64 *old_setting) {unsigned long when, period, irqflags;int err =0 ;
@@ -687,8 +687,8 @@ static int sgi_timer_set(struct k_itimer *timr, int flags,sgi_timer_get (timr, old_setting);sgi_timer_del (timr); - when =timespec_to_ns (&new_setting->it_value); - period =timespec_to_ns (&new_setting->it_interval); + when =timespec64_to_ns (&new_setting->it_value); + period =timespec64_to_ns (&new_setting->it_interval);if (when ==0 )/* Clear timer */
@@ -699,11 +699,11 @@ static int sgi_timer_set(struct k_itimer *timr, int flags,return -ENOMEM ;if (flags &TIMER_ABSTIME ) { -struct timespec n; +struct timespec64 n;unsigned long now; -getnstimeofday (&n); - now =timespec_to_ns (&n); +getnstimeofday64 (&n); + now =timespec64_to_ns (&n);if (when > now) when -= now;else
include/linux/posix-timers.h +6 -6
@@ -96,13 +96,13 @@ struct k_clock {int (*nsleep) (const clockid_t which_clock,int flags,struct timespec *,struct timespec __user *);long (*nsleep_restart) (struct restart_block *restart_block); -int (*timer_set) (struct k_itimer * timr,int flags, -struct itimerspec * new_setting, -struct itimerspec * old_setting); -int (*timer_del) (struct k_itimer * timr); +int (*timer_set) (struct k_itimer *timr,int flags, +struct itimerspec64 *new_setting, +struct itimerspec64 *old_setting); +int (*timer_del) (struct k_itimer *timr);#define TIMER_RETRY 1 -void (*timer_get) (struct k_itimer * timr, -struct itimerspec * cur_setting); +void (*timer_get) (struct k_itimer *timr, +struct itimerspec64 *cur_setting); };extern struct k_clock clock_posix_cpu;
kernel/time/alarmtimer.c +7 -7
@@ -598,19 +598,19 @@ static int alarm_timer_create(struct k_itimer *new_timer)* Copies out the current itimerspec data */ static void alarm_timer_get (struct k_itimer *timr, -struct itimerspec *cur_setting) +struct itimerspec64 *cur_setting) {ktime_t relative_expiry_time =alarm_expires_remaining (&(timr->it.alarm.alarmtimer));if (ktime_to_ns (relative_expiry_time) >0 ) { - cur_setting->it_value =ktime_to_timespec (relative_expiry_time); + cur_setting->it_value =ktime_to_timespec64 (relative_expiry_time); }else { cur_setting->it_value.tv_sec =0 ; cur_setting->it_value.tv_nsec =0 ; } - cur_setting->it_interval =ktime_to_timespec (timr->it.alarm.interval); + cur_setting->it_interval =ktime_to_timespec64 (timr->it.alarm.interval); }/**
@@ -640,8 +640,8 @@ static int alarm_timer_del(struct k_itimer *timr)* Sets the timer to new_setting, and starts the timer. */ static int alarm_timer_set (struct k_itimer *timr,int flags, -struct itimerspec *new_setting, -struct itimerspec *old_setting) +struct itimerspec64 *new_setting, +struct itimerspec64 *old_setting) {ktime_t exp;
@@ -659,8 +659,8 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,return TIMER_RETRY ;/* start the timer */ - timr->it.alarm.interval =timespec_to_ktime (new_setting->it_interval); - exp =timespec_to_ktime (new_setting->it_value); + timr->it.alarm.interval =timespec64_to_ktime (new_setting->it_interval); + exp =timespec64_to_ktime (new_setting->it_value);/* Convert (if necessary) to absolute time */ if (flags !=TIMER_ABSTIME ) {ktime_t now;
kernel/time/posix-clock.c +7 -14
@@ -399,40 +399,33 @@ static int pc_timer_delete(struct k_itimer *kit)return err; } -static void pc_timer_gettime (struct k_itimer *kit,struct itimerspec *ts) +static void pc_timer_gettime (struct k_itimer *kit,struct itimerspec64 *ts) {clockid_t id = kit->it_clock;struct posix_clock_desc cd; -struct itimerspec64 ts64;if (get_clock_desc (id, &cd))return ; -if (cd.clk->ops.timer_gettime) { - cd.clk->ops.timer_gettime (cd.clk, kit, &ts64); - *ts =itimerspec64_to_itimerspec (&ts64); - } +if (cd.clk->ops.timer_gettime) + cd.clk->ops.timer_gettime (cd.clk, kit, ts); +put_clock_desc (&cd); }static int pc_timer_settime (struct k_itimer *kit,int flags, -struct itimerspec *ts,struct itimerspec *old) +struct itimerspec64 *ts,struct itimerspec64 *old) { -struct itimerspec64 ts64 =itimerspec_to_itimerspec64 (ts);clockid_t id = kit->it_clock;struct posix_clock_desc cd; -struct itimerspec64 old64;int err; err =get_clock_desc (id, &cd);if (err)return err; -if (cd.clk->ops.timer_settime) { - err = cd.clk->ops.timer_settime (cd.clk, kit, flags, &ts64, &old64); -if (old) - *old =itimerspec64_to_itimerspec (&old64); - } +if (cd.clk->ops.timer_settime) + err = cd.clk->ops.timer_settime (cd.clk, kit, flags, ts, old);else err = -EOPNOTSUPP ;
kernel/time/posix-cpu-timers.c +16 -12
@@ -562,7 +562,7 @@ static int cpu_timer_sample_group(const clockid_t which_clock,* and try again. (This happens when the timer is in the middle of firing.) */ static int posix_cpu_timer_set (struct k_itimer *timer,int timer_flags, -struct itimerspec *new,struct itimerspec *old) +struct itimerspec64 *new,struct itimerspec64 *old) {unsigned long flags;struct sighand_struct *sighand;
@@ -572,7 +572,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,WARN_ON_ONCE (p ==NULL ); - new_expires =timespec_to_ns (&new->it_value); + new_expires =timespec64_to_ns (&new->it_value);/* * Protect against sighand release/switch in exit/exec and p->cpu_timers
@@ -633,7 +633,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,bump_cpu_timer (timer, val);if (val < timer->it.cpu.expires) { old_expires = timer->it.cpu.expires - val; - old->it_value =ns_to_timespec (old_expires); + old->it_value =ns_to_timespec64 (old_expires); }else { old->it_value.tv_nsec =1 ; old->it_value.tv_sec =0 ;
@@ -671,7 +671,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,* Install the new reload setting, and * set up the signal and overrun bookkeeping. */ - timer->it.cpu.incr =timespec_to_ns (&new->it_interval); + timer->it.cpu.incr =timespec64_to_ns (&new->it_interval);/* * This acts as a modification timestamp for the timer,
@@ -695,12 +695,12 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags, ret =0 ; out:if (old) - old->it_interval =ns_to_timespec (old_incr); + old->it_interval =ns_to_timespec64 (old_incr);return ret; } -static void posix_cpu_timer_get (struct k_itimer *timer,struct itimerspec *itp) +static void posix_cpu_timer_get (struct k_itimer *timer,struct itimerspec64 *itp) {u64 now;struct task_struct *p = timer->it.cpu.task;
@@ -710,7 +710,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)/* * Easy part: convert the reload time. */ - itp->it_interval =ns_to_timespec (timer->it.cpu.incr); + itp->it_interval =ns_to_timespec64 (timer->it.cpu.incr);if (timer->it.cpu.expires ==0 ) {/* Timer not armed at all. */ itp->it_value.tv_sec = itp->it_value.tv_nsec =0 ;
@@ -739,7 +739,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)* Call the timer disarmed, nothing else to do. */ timer->it.cpu.expires =0 ; - itp->it_value =ns_to_timespec (timer->it.cpu.expires); + itp->it_value =ns_to_timespec64 (timer->it.cpu.expires);return ; }else {cpu_timer_sample_group (timer->it_clock, p, &now);
@@ -748,7 +748,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp) }if (now < timer->it.cpu.expires) { - itp->it_value =ns_to_timespec (timer->it.cpu.expires - now); + itp->it_value =ns_to_timespec64 (timer->it.cpu.expires - now); }else {/* * The timer should have expired already, but the firing
@@ -1221,6 +1221,7 @@ 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 timespec *rqtp,struct itimerspec *it) { +struct itimerspec64 it64;struct k_itimer timer;int error;
@@ -1234,13 +1235,14 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags, error =posix_cpu_timer_create (&timer); timer.it_process = current;if (!error) { -static struct itimerspec zero_it; +static struct itimerspec64 zero_it;memset (it,0 ,sizeof *it); it->it_value = *rqtp;spin_lock_irq (&timer.it_lock); - error =posix_cpu_timer_set (&timer, flags, it,NULL ); + it64 =itimerspec_to_itimerspec64 (it); + error =posix_cpu_timer_set (&timer, flags, &it64,NULL );if (error) {spin_unlock_irq (&timer.it_lock);return error;
@@ -1270,7 +1272,9 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,* We were interrupted by a signal. */ *rqtp =ns_to_timespec (timer.it.cpu.expires); - error =posix_cpu_timer_set (&timer,0 , &zero_it, it); + it64 =itimerspec_to_itimerspec64 (it); + error =posix_cpu_timer_set (&timer,0 , &zero_it, &it64); + *it =itimerspec64_to_itimerspec (&it64);if (!error) {/* * Timer is now unarmed, deletion can not fail.
kernel/time/posix-timers.c +21 -16
@@ -133,9 +133,9 @@ static struct k_clock posix_clocks[MAX_CLOCKS];static int common_nsleep (const clockid_t ,int flags,struct timespec *t,struct timespec __user *rmtp);static int common_timer_create (struct k_itimer *new_timer); -static void common_timer_get (struct k_itimer *,struct itimerspec *); +static void common_timer_get (struct k_itimer *,struct itimerspec64 *);static int common_timer_set (struct k_itimer *,int , -struct itimerspec *,struct itimerspec *); +struct itimerspec64 *,struct itimerspec64 *);static int common_timer_del (struct k_itimer *timer);static enum hrtimer_restart posix_timer_fn (struct hrtimer *data);
@@ -734,18 +734,18 @@ static struct k_itimer *__lock_timer(timer_t timer_id, unsigned long *flags)* report. */ static void -common_timer_get (struct k_itimer *timr,struct itimerspec *cur_setting) +common_timer_get (struct k_itimer *timr,struct itimerspec64 *cur_setting) {ktime_t now, remaining, iv;struct hrtimer *timer = &timr->it.real.timer; -memset (cur_setting,0 ,sizeof (struct itimerspec )); +memset (cur_setting,0 ,sizeof (*cur_setting)); iv = timr->it.real.interval;/* interval timer ? */ if (iv) - cur_setting->it_interval =ktime_to_timespec (iv); + cur_setting->it_interval =ktime_to_timespec64 (iv);else if (!hrtimer_active (timer) && (timr->it_sigev_notify & ~SIGEV_THREAD_ID ) !=SIGEV_NONE )return ;
@@ -771,13 +771,14 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)if ((timr->it_sigev_notify & ~SIGEV_THREAD_ID ) !=SIGEV_NONE ) cur_setting->it_value.tv_nsec =1 ; }else - cur_setting->it_value =ktime_to_timespec (remaining); + cur_setting->it_value =ktime_to_timespec64 (remaining); }/* Get the time remaining on a POSIX.1b interval timer. */ SYSCALL_DEFINE2 (timer_gettime, timer_t, timer_id, struct itimerspec __user *, setting) { +struct itimerspec64 cur_setting64;struct itimerspec cur_setting;struct k_itimer *timr;struct k_clock *kc;
@@ -792,10 +793,11 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,if (WARN_ON_ONCE (!kc || !kc->timer_get)) ret = -EINVAL ;else - kc->timer_get (timr, &cur_setting); + kc->timer_get (timr, &cur_setting64);unlock_timer (timr, flags); + cur_setting =itimerspec64_to_itimerspec (&cur_setting64);if (!ret &©_to_user (setting, &cur_setting,sizeof (cur_setting)))return -EFAULT ;
@@ -831,7 +833,7 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id)/* timr->it_lock is taken. */ static int common_timer_set (struct k_itimer *timr,int flags, -struct itimerspec *new_setting,struct itimerspec *old_setting) +struct itimerspec64 *new_setting,struct itimerspec64 *old_setting) {struct hrtimer *timer = &timr->it.real.timer;enum hrtimer_mode mode;
@@ -860,10 +862,10 @@ common_timer_set(struct k_itimer *timr, int flags,hrtimer_init (&timr->it.real.timer, timr->it_clock, mode); timr->it.real.timer.function = posix_timer_fn; -hrtimer_set_expires (timer,timespec_to_ktime (new_setting->it_value)); +hrtimer_set_expires (timer,timespec64_to_ktime (new_setting->it_value));/* Convert interval */ - timr->it.real.interval =timespec_to_ktime (new_setting->it_interval); + timr->it.real.interval =timespec64_to_ktime (new_setting->it_interval);/* SIGEV_NONE timers are not queued ! See common_timer_get */ if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID ) ==SIGEV_NONE )) {
@@ -883,21 +885,23 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags, const struct itimerspec __user *, new_setting, struct itimerspec __user *, old_setting) { - struct k_itimer *timr; + struct itimerspec64 new_spec64, old_spec64; +struct itimerspec64 *rtn = old_setting ? &old_spec64 :NULL ;struct itimerspec new_spec, old_spec; -int error =0 ; +struct k_itimer *timr;unsigned long flag; -struct itimerspec *rtn = old_setting ? &old_spec :NULL ;struct k_clock *kc; +int error =0 ;if (!new_setting)return -EINVAL ;if (copy_from_user (&new_spec, new_setting,sizeof (new_spec)))return -EFAULT ; + new_spec64 =itimerspec_to_itimerspec64 (&new_spec); -if (!timespec_valid (&new_spec.it_interval) || - !timespec_valid (&new_spec.it_value)) +if (!timespec64_valid (&new_spec64.it_interval) || + !timespec64_valid (&new_spec64.it_value))return -EINVAL ; retry: timr =lock_timer (timer_id, &flag);
@@ -908,7 +912,7 @@ retry:if (WARN_ON_ONCE (!kc || !kc->timer_set)) error = -EINVAL ;else - error = kc->timer_set (timr, flags, &new_spec, rtn); + error = kc->timer_set (timr, flags, &new_spec64, rtn);unlock_timer (timr, flag);if (error ==TIMER_RETRY ) {
@@ -916,6 +920,7 @@ retry: goto retry; } + old_spec =itimerspec64_to_itimerspec (&old_spec64);if (old_setting && !error &©_to_user (old_setting, &old_spec,sizeof (old_spec))) error = -EFAULT ;
PATCH v2 7/7 Change k_clock nsleep() to use timespec64
In reply to Deepa Dinamanistruct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
The syscall interfaces themselves will be changed in a separate series.
Note that the restart_block parameter for nanosleep has also been left unchanged and will be part of syscall series noted above.
--- include/linux/hrtimer.h | 2 +- include/linux/posix-timers.h | 2 +- kernel/compat.c | 6 ++++-- kernel/time/alarmtimer.c | 4 ++-- kernel/time/hrtimer.c | 10 ++++++---- kernel/time/posix-cpu-timers.c | 36 ++++++++++++++++++------------------ kernel/time/posix-stubs.c | 6 ++++-- kernel/time/posix-timers.c | 10 ++++++---- 8 files changed, 42 insertions(+), 34 deletions(-)
include/linux/hrtimer.h +1 -1
@@ -452,7 +452,7 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer, }/* Precise sleep: */ -extern long hrtimer_nanosleep (struct timespec *rqtp, +extern long hrtimer_nanosleep (struct timespec64 *rqtp,struct timespec __user *rmtp,const enum hrtimer_mode mode,const clockid_t clockid);
include/linux/posix-timers.h +1 -1
@@ -94,7 +94,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 timespec *,struct timespec __user *); +struct timespec64 *,struct timespec __user *);long (*nsleep_restart) (struct restart_block *restart_block); int (*timer_set) (struct k_itimer *timr, int flags, struct itimerspec64 *new_setting,
kernel/compat.c +4 -2
@@ -240,18 +240,20 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, struct compat_timespec __user *, rmtp) {struct timespec tu, rmt; +struct timespec64 tu64;mm_segment_t oldfs;long ret;if (compat_get_timespec (&tu, rqtp))return -EFAULT ; -if (!timespec_valid (&tu)) + tu64 =timespec_to_timespec64 (tu); +if (!timespec64_valid (&tu64))return -EINVAL ; oldfs =get_fs ();set_fs (KERNEL_DS ); - ret =hrtimer_nanosleep (&tu, + ret =hrtimer_nanosleep (&tu64, rmtp ? (struct timespec __user *)&rmt :NULL ,HRTIMER_MODE_REL ,CLOCK_MONOTONIC );set_fs (oldfs);
kernel/time/alarmtimer.c +2 -2
@@ -790,7 +790,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 timespec *tsreq,struct timespec __user *rmtp) +struct timespec64 *tsreq,struct timespec __user *rmtp) {enum alarmtimer_type type =clock2alarm (which_clock);struct alarm alarm;
@@ -809,7 +809,7 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,alarm_init (&alarm, type, alarmtimer_nsleep_wakeup); - exp =timespec_to_ktime (*tsreq); + exp =timespec64_to_ktime (*tsreq);/* Convert (if necessary) to absolute time */ if (flags !=TIMER_ABSTIME ) {ktime_t now = alarm_bases[type].gettime ();
kernel/time/hrtimer.c +6 -4
@@ -1503,7 +1503,7 @@ long __sched hrtimer_nanosleep_restart(struct restart_block *restart)return ret; } -long hrtimer_nanosleep (struct timespec *rqtp,struct timespec __user *rmtp, +long hrtimer_nanosleep (struct timespec64 *rqtp,struct timespec __user *rmtp,const enum hrtimer_mode mode,const clockid_t clockid) {struct restart_block *restart;
@@ -1516,7 +1516,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp, slack =0 ;hrtimer_init_on_stack (&t.timer, clockid, mode); -hrtimer_set_expires_range_ns (&t.timer,timespec_to_ktime (*rqtp), slack); +hrtimer_set_expires_range_ns (&t.timer,timespec64_to_ktime (*rqtp), slack);if (do_nanosleep (&t, mode)) goto out;
@@ -1547,15 +1547,17 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp, SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp, struct timespec __user *, rmtp) { +struct timespec64 tu64;struct timespec tu;if (copy_from_user (&tu, rqtp,sizeof (tu)))return -EFAULT ; -if (!timespec_valid (&tu)) + tu64 =timespec_to_timespec64 (tu); +if (!timespec64_valid (&tu64))return -EINVAL ; -return hrtimer_nanosleep (&tu, rmtp,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); +return hrtimer_nanosleep (&tu64, rmtp,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); }/*
kernel/time/posix-cpu-timers.c +18 -18
@@ -1219,9 +1219,8 @@ 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 timespec *rqtp,struct itimerspec *it) +struct timespec64 *rqtp,struct itimerspec64 *it) { -struct itimerspec64 it64;struct k_itimer timer;int error;
@@ -1241,8 +1240,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags, it->it_value = *rqtp;spin_lock_irq (&timer.it_lock); - it64 =itimerspec_to_itimerspec64 (it); - error =posix_cpu_timer_set (&timer, flags, &it64,NULL ); + error =posix_cpu_timer_set (&timer, flags, it,NULL );if (error) {spin_unlock_irq (&timer.it_lock);return error;
@@ -1271,10 +1269,8 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,/* * We were interrupted by a signal. */ - *rqtp =ns_to_timespec (timer.it.cpu.expires); - it64 =itimerspec_to_itimerspec64 (it); - error =posix_cpu_timer_set (&timer,0 , &zero_it, &it64); - *it =itimerspec64_to_itimerspec (&it64); + *rqtp =ns_to_timespec64 (timer.it.cpu.expires); + error =posix_cpu_timer_set (&timer,0 , &zero_it, it);if (!error) {/* * Timer is now unarmed, deletion can not fail.
@@ -1310,10 +1306,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 timespec *rqtp,struct timespec __user *rmtp) +struct timespec64 *rqtp,struct timespec __user *rmtp) {struct restart_block *restart_block = ¤t->restart_block; -struct itimerspec it; +struct itimerspec64 it; +struct timespec ts;int error;/*
@@ -1333,13 +1330,14 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,/* * Report back to the user the time still remaining. */ -if (rmtp &©_to_user (rmtp, &it.it_value,sizeof *rmtp)) + ts =timespec64_to_timespec (it.it_value); +if (rmtp &©_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 =timespec_to_ns (rqtp); + restart_block->nanosleep.expires =timespec64_to_ns (rqtp); }return error; }
@@ -1347,11 +1345,12 @@ 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 timespec t; -struct itimerspec it; +struct itimerspec64 it; +struct timespec64 t; +struct timespec tmp;int error; - t =ns_to_timespec (restart_block->nanosleep.expires); + t =ns_to_timespec64 (restart_block->nanosleep.expires); error =do_cpu_nanosleep (which_clock,TIMER_ABSTIME , &t, &it);
@@ -1360,10 +1359,11 @@ static long posix_cpu_nsleep_restart(struct restart_block *restart_block)/* * Report back to the user the time still remaining. */ -if (rmtp &©_to_user (rmtp, &it.it_value,sizeof *rmtp)) + tmp =timespec64_to_timespec (it.it_value); +if (rmtp &©_to_user (rmtp, &tmp,sizeof (*rmtp)))return -EFAULT ; - restart_block->nanosleep.expires =timespec_to_ns (&t); + restart_block->nanosleep.expires =timespec64_to_ns (&t); }return error;
@@ -1388,7 +1388,7 @@ 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 timespec *rqtp, +struct timespec64 *rqtp,struct timespec __user *rmtp) {return posix_cpu_nsleep (PROCESS_CLOCK , flags, rqtp, rmtp);
kernel/time/posix-stubs.c +4 -2
@@ -103,6 +103,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, const struct timespec __user *, rqtp, struct timespec __user *, rmtp) { + struct timespec64 t64;struct timespec t;switch (which_clock) {
@@ -111,9 +112,10 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,case CLOCK_BOOTTIME :if (copy_from_user (&t, rqtp,sizeof (struct timespec )))return -EFAULT ; -if (!timespec_valid (&t)) + t64 =timespec_to_timespec64 (t); +if (!timespec64_valid (&t64))return -EINVAL ; -return hrtimer_nanosleep (&t, rmtp, flags &TIMER_ABSTIME ? +return hrtimer_nanosleep (&t64, rmtp, flags &TIMER_ABSTIME ?HRTIMER_MODE_ABS :HRTIMER_MODE_REL , which_clock);default :
kernel/time/posix-timers.c +6 -4
@@ -130,7 +130,7 @@ static struct k_clock posix_clocks[MAX_CLOCKS];/* * These ones are defined below. */ -static int common_nsleep (const clockid_t ,int flags,struct timespec *t, +static int common_nsleep (const clockid_t ,int flags,struct timespec64 *t,struct timespec __user *rmtp);static int common_timer_create (struct k_itimer *new_timer);static void common_timer_get (struct k_itimer *,struct itimerspec64 *);
@@ -1099,7 +1099,7 @@ 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 timespec *tsave,struct timespec __user *rmtp) +struct timespec64 *tsave,struct timespec __user *rmtp) { return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ? HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
@@ -1111,6 +1111,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, struct timespec __user *, rmtp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 t64;struct timespec t;if (!kc)
@@ -1121,10 +1122,11 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,if (copy_from_user (&t, rqtp,sizeof (struct timespec )))return -EFAULT ; -if (!timespec_valid (&t)) + t64 =timespec_to_timespec64 (t); +if (!timespec64_valid (&t64))return -EINVAL ; -return kc->nsleep (which_clock, flags, &t, rmtp); +return kc->nsleep (which_clock, flags, &t64, rmtp); }/*
Signature · 1 line
2.7.4
tip-bot for Deepa Dinamani
merge bot[tip:timers/core] time: Change k_clock nsleep() to use timespec64
time: Change k_clock nsleep() to use timespec64
Commit-ID: ad19638463a4b5c909fcebf0f19358c4bf4fed48 Gitweb: http://git.kernel.org/tip/ad19638463a4b5c909fcebf0f19358c4bf4fed48 Author: Deepa Dinamani <[email protected]> AuthorDate: Sun, 26 Mar 2017 12:04:18 -0700 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 14 Apr 2017 21:49:56 +0200
time: Change k_clock nsleep() to use timespec64
struct timespec is not y2038 safe on 32 bit machines. Replace uses of struct timespec with struct timespec64 in the kernel.
The syscall interfaces themselves will be changed in a separate series.
Note that the restart_block parameter for nanosleep has also been left unchanged and will be part of syscall series noted above.
--- include/linux/hrtimer.h | 2 +- include/linux/posix-timers.h | 2 +- kernel/compat.c | 6 ++++-- kernel/time/alarmtimer.c | 7 ++++--- kernel/time/hrtimer.c | 10 ++++++---- kernel/time/posix-cpu-timers.c | 36 ++++++++++++++++++------------------ kernel/time/posix-stubs.c | 6 ++++-- kernel/time/posix-timers.c | 10 ++++++---- 8 files changed, 44 insertions(+), 35 deletions(-)
include/linux/hrtimer.h +1 -1
@@ -452,7 +452,7 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer, }/* Precise sleep: */ -extern long hrtimer_nanosleep (struct timespec *rqtp, +extern long hrtimer_nanosleep (struct timespec64 *rqtp,struct timespec __user *rmtp,const enum hrtimer_mode mode,const clockid_t clockid);
include/linux/posix-timers.h +1 -1
@@ -94,7 +94,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 timespec *,struct timespec __user *); +struct timespec64 *,struct timespec __user *);long (*nsleep_restart) (struct restart_block *restart_block); int (*timer_set) (struct k_itimer *timr, int flags, struct itimerspec64 *new_setting,
kernel/compat.c +4 -2
@@ -240,18 +240,20 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, struct compat_timespec __user *, rmtp) {struct timespec tu, rmt; +struct timespec64 tu64;mm_segment_t oldfs;long ret;if (compat_get_timespec (&tu, rqtp))return -EFAULT ; -if (!timespec_valid (&tu)) + tu64 =timespec_to_timespec64 (tu); +if (!timespec64_valid (&tu64))return -EINVAL ; oldfs =get_fs ();set_fs (KERNEL_DS ); - ret =hrtimer_nanosleep (&tu, + ret =hrtimer_nanosleep (&tu64, rmtp ? (struct timespec __user *)&rmt :NULL ,HRTIMER_MODE_REL ,CLOCK_MONOTONIC );set_fs (oldfs);
kernel/time/alarmtimer.c +4 -3
@@ -790,13 +790,14 @@ out:* Handles clock_nanosleep calls against _ALARM clockids */ static int alarm_timer_nsleep (const clockid_t which_clock,int flags, -struct timespec *tsreq,struct timespec __user *rmtp) +struct timespec64 *tsreq, +struct timespec __user *rmtp) {enum alarmtimer_type type =clock2alarm (which_clock); +struct restart_block *restart;struct alarm alarm;ktime_t exp;int ret =0 ; -struct restart_block *restart;if (!alarmtimer_get_rtcdev ())return -ENOTSUPP ;
@@ -809,7 +810,7 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,alarm_init (&alarm, type, alarmtimer_nsleep_wakeup); - exp =timespec_to_ktime (*tsreq); + exp =timespec64_to_ktime (*tsreq);/* Convert (if necessary) to absolute time */ if (flags !=TIMER_ABSTIME ) {ktime_t now = alarm_bases[type].gettime ();
kernel/time/hrtimer.c +6 -4
@@ -1503,7 +1503,7 @@ out:return ret; } -long hrtimer_nanosleep (struct timespec *rqtp,struct timespec __user *rmtp, +long hrtimer_nanosleep (struct timespec64 *rqtp,struct timespec __user *rmtp,const enum hrtimer_mode mode,const clockid_t clockid) {struct restart_block *restart;
@@ -1516,7 +1516,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp, slack =0 ;hrtimer_init_on_stack (&t.timer, clockid, mode); -hrtimer_set_expires_range_ns (&t.timer,timespec_to_ktime (*rqtp), slack); +hrtimer_set_expires_range_ns (&t.timer,timespec64_to_ktime (*rqtp), slack);if (do_nanosleep (&t, mode)) goto out;
@@ -1547,15 +1547,17 @@ out: SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp, struct timespec __user *, rmtp) { +struct timespec64 tu64;struct timespec tu;if (copy_from_user (&tu, rqtp,sizeof (tu)))return -EFAULT ; -if (!timespec_valid (&tu)) + tu64 =timespec_to_timespec64 (tu); +if (!timespec64_valid (&tu64))return -EINVAL ; -return hrtimer_nanosleep (&tu, rmtp,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); +return hrtimer_nanosleep (&tu64, rmtp,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); }/*
kernel/time/posix-cpu-timers.c +18 -18
@@ -1219,9 +1219,8 @@ 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 timespec *rqtp,struct itimerspec *it) +struct timespec64 *rqtp,struct itimerspec64 *it) { -struct itimerspec64 it64;struct k_itimer timer;int error;
@@ -1241,8 +1240,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags, it->it_value = *rqtp;spin_lock_irq (&timer.it_lock); - it64 =itimerspec_to_itimerspec64 (it); - error =posix_cpu_timer_set (&timer, flags, &it64,NULL ); + error =posix_cpu_timer_set (&timer, flags, it,NULL );if (error) {spin_unlock_irq (&timer.it_lock);return error;
@@ -1271,10 +1269,8 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,/* * We were interrupted by a signal. */ - *rqtp =ns_to_timespec (timer.it.cpu.expires); - it64 =itimerspec_to_itimerspec64 (it); - error =posix_cpu_timer_set (&timer,0 , &zero_it, &it64); - *it =itimerspec64_to_itimerspec (&it64); + *rqtp =ns_to_timespec64 (timer.it.cpu.expires); + error =posix_cpu_timer_set (&timer,0 , &zero_it, it);if (!error) {/* * Timer is now unarmed, deletion can not fail.
@@ -1310,10 +1306,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 timespec *rqtp,struct timespec __user *rmtp) +struct timespec64 *rqtp,struct timespec __user *rmtp) {struct restart_block *restart_block = ¤t->restart_block; -struct itimerspec it; +struct itimerspec64 it; +struct timespec ts;int error;/*
@@ -1333,13 +1330,14 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,/* * Report back to the user the time still remaining. */ -if (rmtp &©_to_user (rmtp, &it.it_value,sizeof *rmtp)) + ts =timespec64_to_timespec (it.it_value); +if (rmtp &©_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 =timespec_to_ns (rqtp); + restart_block->nanosleep.expires =timespec64_to_ns (rqtp); }return error; }
@@ -1347,11 +1345,12 @@ 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 timespec t; -struct itimerspec it; +struct itimerspec64 it; +struct timespec64 t; +struct timespec tmp;int error; - t =ns_to_timespec (restart_block->nanosleep.expires); + t =ns_to_timespec64 (restart_block->nanosleep.expires); error =do_cpu_nanosleep (which_clock,TIMER_ABSTIME , &t, &it);
@@ -1360,10 +1359,11 @@ static long posix_cpu_nsleep_restart(struct restart_block *restart_block)/* * Report back to the user the time still remaining. */ -if (rmtp &©_to_user (rmtp, &it.it_value,sizeof *rmtp)) + tmp =timespec64_to_timespec (it.it_value); +if (rmtp &©_to_user (rmtp, &tmp,sizeof (*rmtp)))return -EFAULT ; - restart_block->nanosleep.expires =timespec_to_ns (&t); + restart_block->nanosleep.expires =timespec64_to_ns (&t); }return error;
@@ -1388,7 +1388,7 @@ 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 timespec *rqtp, +struct timespec64 *rqtp,struct timespec __user *rmtp) {return posix_cpu_nsleep (PROCESS_CLOCK , flags, rqtp, rmtp);
kernel/time/posix-stubs.c +4 -2
@@ -103,6 +103,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, const struct timespec __user *, rqtp, struct timespec __user *, rmtp) { + struct timespec64 t64;struct timespec t;switch (which_clock) {
@@ -111,9 +112,10 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,case CLOCK_BOOTTIME :if (copy_from_user (&t, rqtp,sizeof (struct timespec )))return -EFAULT ; -if (!timespec_valid (&t)) + t64 =timespec_to_timespec64 (t); +if (!timespec64_valid (&t64))return -EINVAL ; -return hrtimer_nanosleep (&t, rmtp, flags &TIMER_ABSTIME ? +return hrtimer_nanosleep (&t64, rmtp, flags &TIMER_ABSTIME ?HRTIMER_MODE_ABS :HRTIMER_MODE_REL , which_clock);default :
kernel/time/posix-timers.c +6 -4
@@ -130,7 +130,7 @@ static struct k_clock posix_clocks[MAX_CLOCKS];/* * These ones are defined below. */ -static int common_nsleep (const clockid_t ,int flags,struct timespec *t, +static int common_nsleep (const clockid_t ,int flags,struct timespec64 *t,struct timespec __user *rmtp);static int common_timer_create (struct k_itimer *new_timer);static void common_timer_get (struct k_itimer *,struct itimerspec64 *);
@@ -1099,7 +1099,7 @@ 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 timespec *tsave,struct timespec __user *rmtp) +struct timespec64 *tsave,struct timespec __user *rmtp) { return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ? HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
@@ -1111,6 +1111,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, struct timespec __user *, rmtp) {struct k_clock *kc =clockid_to_kclock (which_clock); +struct timespec64 t64;struct timespec t;if (!kc)
@@ -1121,10 +1122,11 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,if (copy_from_user (&t, rqtp,sizeof (struct timespec )))return -EFAULT ; -if (!timespec_valid (&t)) + t64 =timespec_to_timespec64 (t); +if (!timespec64_valid (&t64))return -EINVAL ; -return kc->nsleep (which_clock, flags, &t, rmtp); +return kc->nsleep (which_clock, flags, &t64, rmtp); }/*