This patch introduces the timer_get64 method with itimerspec64 type for k_clock structure, that makes it ready for the 2038 year.
Convert to the 64bit method with itimerspec64 type for the timer_gettime syscall function, and change the timer_gettime syscall implementation.
Also add a default 64bit method for the timer_get64 pointer of k_clock structure, and it will be removed after all the drivers are converted to 64bit methods.
Signed-off-by: Baolin Wang baolin.wang@linaro.org --- include/linux/posix-timers.h | 2 ++ kernel/time/posix-timers.c | 25 ++++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 907f3fd..e84436b 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -113,6 +113,8 @@ struct k_clock { #define TIMER_RETRY 1 void (*timer_get) (struct k_itimer * timr, struct itimerspec * cur_setting); + void (*timer_get64) (struct k_itimer *timr, + struct itimerspec64 *cur_setting); };
extern struct k_clock clock_posix_cpu; diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c index d00f8ed..2adeb29 100644 --- a/kernel/time/posix-timers.c +++ b/kernel/time/posix-timers.c @@ -140,6 +140,7 @@ static int common_timer_del(struct k_itimer *timer); static enum hrtimer_restart posix_timer_fn(struct hrtimer *data);
static struct k_itimer *__lock_timer(timer_t timer_id, unsigned long *flags); +static struct k_clock *clockid_to_kclock(const clockid_t id);
#define lock_timer(tid, flags) \ ({ struct k_itimer *__timr; \ @@ -542,6 +543,16 @@ static struct pid *good_sigevent(sigevent_t * event) return task_pid(rtn); }
+static void default_timer_get64(struct k_itimer *timr, + struct itimerspec64 *cur_setting64) +{ + struct itimerspec cur_setting; + struct k_clock *kc = clockid_to_kclock(timr->it_clock); + + kc->timer_get(timr, &cur_setting); + *cur_setting64 = itimerspec_to_itimerspec64(&cur_setting); +} + void posix_timers_register_clock(const clockid_t clock_id, struct k_clock *new_clock) { @@ -562,6 +573,9 @@ void posix_timers_register_clock(const clockid_t clock_id, return; }
+ if (new_clock->timer_get && !new_clock->timer_get64) + new_clock->timer_get64 = default_timer_get64; + posix_clocks[clock_id] = *new_clock; } EXPORT_SYMBOL_GPL(posix_timers_register_clock); @@ -795,7 +809,7 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting) cur_setting->it_value = ktime_to_timespec(remaining); }
-static int __timer_gettime(timer_t timer_id, struct itimerspec *cur_setting) +static int __timer_gettime(timer_t timer_id, struct itimerspec64 *cur_setting) { struct k_itimer *timr; struct k_clock *kc; @@ -807,10 +821,10 @@ static int __timer_gettime(timer_t timer_id, struct itimerspec *cur_setting) return -EINVAL;
kc = clockid_to_kclock(timr->it_clock); - if (WARN_ON_ONCE(!kc || !kc->timer_get)) + if (WARN_ON_ONCE(!kc || !kc->timer_get64)) ret = -EINVAL; else - kc->timer_get(timr, cur_setting); + kc->timer_get64(timr, cur_setting);
unlock_timer(timr, flags); return ret; @@ -820,10 +834,11 @@ static int __timer_gettime(timer_t timer_id, struct itimerspec *cur_setting) SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id, struct itimerspec __user *, setting) { - struct itimerspec cur_setting; + struct itimerspec64 cur_setting; + int ret = __timer_gettime(timer_id, &cur_setting);
- if (!ret && copy_to_user(setting, &cur_setting, sizeof (cur_setting))) + if (!ret && put_itimerspec(&cur_setting, setting)) return -EFAULT;
return ret;
On Mon, 1 Jun 2015, Baolin Wang wrote:
Can you try to create even longer subject lines with less information?
This patch introduces the timer_get64 method with itimerspec64 type for k_clock structure, that makes it ready for the 2038 year.
Right. By the speed this is proceeding it will take about 2038 years until one of these patches is going to be applied.
Convert to the 64bit method with itimerspec64 type for the timer_gettime syscall function, and change the timer_gettime syscall implementation.
Also add a default 64bit method for the timer_get64 pointer of k_clock structure, and it will be removed after all the drivers are converted to 64bit methods.
This is utter crap, really. The default method is a preliminary of converting the syscall implementation.
"Subject: posix-timers: Implement y2038 safe timer_get64() callback
The timer_get() callback in struct k_clock is not year 2038 safe on 32bit systems.
To address this implement a new callback timer_get64() which uses struct timespec64 along with a default implementation which is a wrapper for the existing timer_get() callback. The default callback is installed at registration time for all posix clocks which are not yet converted to timer_get64() and will be removed once this is completed.
Use the new callback in __timer_gettime()."
That's how a proper changelog should look like.
+static void default_timer_get64(struct k_itimer *timr,
struct itimerspec64 *cur_setting64)
Please align the second argument proper:
static void default_timer_get64(struct k_itimer *timr, struct itimerspec64 *cur_setting64)
Thanks,
tglx
On 3 June 2015 at 03:20, Thomas Gleixner tglx@linutronix.de wrote:
On Mon, 1 Jun 2015, Baolin Wang wrote:
Can you try to create even longer subject lines with less information?
This patch introduces the timer_get64 method with itimerspec64 type for k_clock structure, that makes it ready for the 2038 year.
Right. By the speed this is proceeding it will take about 2038 years until one of these patches is going to be applied.
Convert to the 64bit method with itimerspec64 type for the timer_gettime syscall function, and change the timer_gettime syscall implementation.
Also add a default 64bit method for the timer_get64 pointer of k_clock structure, and it will be removed after all the drivers are converted to 64bit methods.
This is utter crap, really. The default method is a preliminary of converting the syscall implementation.
"Subject: posix-timers: Implement y2038 safe timer_get64() callback
The timer_get() callback in struct k_clock is not year 2038 safe on 32bit systems.
To address this implement a new callback timer_get64() which uses struct timespec64 along with a default implementation which is a wrapper for the existing timer_get() callback. The default callback is installed at registration time for all posix clocks which are not yet converted to timer_get64() and will be removed once this is completed.
Use the new callback in __timer_gettime()."
That's how a proper changelog should look like.
+static void default_timer_get64(struct k_itimer *timr,
struct itimerspec64 *cur_setting64)
Please align the second argument proper:
static void default_timer_get64(struct k_itimer *timr, struct itimerspec64 *cur_setting64)
Thanks,
tglx
Thanks for your example for the changelog, and will modify it as you suggest.