2015-06-01 11:56:16

by Baolin Wang

[permalink] [raw]
Subject: [PATCH v4 08/25] posix-timers:Convert to the 64bit methods for the timer_gettime syscall function

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 <[email protected]>
---
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;
--
1.7.9.5


2015-06-02 19:20:40

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH v4 08/25] posix-timers:Convert to the 64bit methods for the timer_gettime syscall function


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