Message ID | 1414388802-5866-10-git-send-email-pang.xunlei@linaro.org |
---|---|
State | New |
Headers | show |
On Mon, 27 Oct 2014, pang.xunlei wrote: > The kernel uses 32-bit signed value(time_t) for seconds since 1970-01-01:00:00:00, so it > will overflow at 2038-01-19 03:14:08 on 32-bit systems. We call this "2038 safety" issue. > > As part of addressing 2038 safety for in-kernel uses, this patch creates no functional change > in existing users, converts xen_read_wallclock() to use timespec64 instead of timespec. > > Signed-off-by: pang.xunlei <pang.xunlei@linaro.org> Please CC xen-devel@lists.xenproject.org for Xen related patches. > arch/x86/xen/time.c | 31 +++++++++++++++++++------------ > 1 file changed, 19 insertions(+), 12 deletions(-) > > diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c > index cf1b591..2ce064a 100644 > --- a/arch/x86/xen/time.c > +++ b/arch/x86/xen/time.c > @@ -169,20 +169,33 @@ static cycle_t xen_clocksource_get_cycles(struct clocksource *cs) > return xen_clocksource_read(); > } > > -static void xen_read_wallclock(struct timespec *ts) > +static void xen_read_wallclock(struct timespec64 *ts) > { > + struct timespec ts32; > struct shared_info *s = HYPERVISOR_shared_info; > struct pvclock_wall_clock *wall_clock = &(s->wc); > struct pvclock_vcpu_time_info *vcpu_time; > > vcpu_time = &get_cpu_var(xen_vcpu)->time; > - pvclock_read_wallclock(wall_clock, vcpu_time, ts); > + /* > + * TODO: [2038 safety] pvclock_read_wallclock() should be changed > + * to use timespec64 for 2038 safety as soon as possible. > + */ > + pvclock_read_wallclock(wall_clock, vcpu_time, &ts32); > + *ts = timespec_to_timespec64(ts32); > put_cpu_var(xen_vcpu); > } > > +/* > + * TODO: [2038 safety] xen_get_wallclock() should be changed to use > + * timespec64 for 2038 safety as soon as possible. > + */ > static void xen_get_wallclock(struct timespec *now) At this point shouldn't you convert xen_get_wallclock to timespec64 too? > { > - xen_read_wallclock(now); > + struct timespec64 now64; > + > + xen_read_wallclock(&now64); > + *now = timespec64_to_timespec(now64); > } > > static int xen_set_wallclock(const struct timespec *now) > @@ -485,8 +498,7 @@ static const struct pv_time_ops xen_time_ops __initconst = { > static void __init xen_time_init(void) > { > int cpu = smp_processor_id(); > - struct timespec tp; > - struct timespec64 tp64; > + struct timespec64 tp; > > clocksource_register_hz(&xen_clocksource, NSEC_PER_SEC); > > @@ -497,14 +509,9 @@ static void __init xen_time_init(void) > xen_clockevent = &xen_vcpuop_clockevent; > } > > - /* > - * Set initial system time with full resolution. > - * TODO: [2038 safety] xen_read_wallclock() should be changed to use > - * timespec64 for 2038 safety as soon as possible. > - */ > + /* Set initial system time with full resolution. */ > xen_read_wallclock(&tp); > - tp64 = timespec_to_timespec64(tp); > - do_settimeofday(&tp64); > + do_settimeofday(&tp); > > setup_force_cpu_cap(X86_FEATURE_TSC); > > -- > 1.7.9.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://secure-web.cisco.com/1R3n2I8-gDpn8akesS4B4JN0A1SlyiiKzIT0qgddW4Xm1xtBi5J7nJwhRaPMEkp0VmrMyOlBD5Lz9VdewgeobSUsSzhREJQNT2O0l1LUhfiaNzD2_oHWGA6fP4sD1KCgFB00xHD6jw1ggEqe03cpaKsGQmA-TwOpFD41O8IIqhwY/http%3A%2F%2Fwww.tux.org%2Flkml%2F >
On 27 October 2014 23:35, Stefano Stabellini <stefano.stabellini@eu.citrix.com> wrote: > On Mon, 27 Oct 2014, pang.xunlei wrote: >> The kernel uses 32-bit signed value(time_t) for seconds since 1970-01-01:00:00:00, so it >> will overflow at 2038-01-19 03:14:08 on 32-bit systems. We call this "2038 safety" issue. >> >> As part of addressing 2038 safety for in-kernel uses, this patch creates no functional change >> in existing users, converts xen_read_wallclock() to use timespec64 instead of timespec. >> >> Signed-off-by: pang.xunlei <pang.xunlei@linaro.org> > > Please CC xen-devel@lists.xenproject.org for Xen related patches. Ok, apologies for missing this. > > >> arch/x86/xen/time.c | 31 +++++++++++++++++++------------ >> 1 file changed, 19 insertions(+), 12 deletions(-) >> >> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c >> index cf1b591..2ce064a 100644 >> --- a/arch/x86/xen/time.c >> +++ b/arch/x86/xen/time.c >> @@ -169,20 +169,33 @@ static cycle_t xen_clocksource_get_cycles(struct clocksource *cs) >> return xen_clocksource_read(); >> } >> >> -static void xen_read_wallclock(struct timespec *ts) >> +static void xen_read_wallclock(struct timespec64 *ts) >> { >> + struct timespec ts32; >> struct shared_info *s = HYPERVISOR_shared_info; >> struct pvclock_wall_clock *wall_clock = &(s->wc); >> struct pvclock_vcpu_time_info *vcpu_time; >> >> vcpu_time = &get_cpu_var(xen_vcpu)->time; >> - pvclock_read_wallclock(wall_clock, vcpu_time, ts); >> + /* >> + * TODO: [2038 safety] pvclock_read_wallclock() should be changed >> + * to use timespec64 for 2038 safety as soon as possible. >> + */ >> + pvclock_read_wallclock(wall_clock, vcpu_time, &ts32); >> + *ts = timespec_to_timespec64(ts32); >> put_cpu_var(xen_vcpu); >> } >> >> +/* >> + * TODO: [2038 safety] xen_get_wallclock() should be changed to use >> + * timespec64 for 2038 safety as soon as possible. >> + */ >> static void xen_get_wallclock(struct timespec *now) > > At this point shouldn't you convert xen_get_wallclock to timespec64 too? This conversion is in the following patches. I'll send the version 2 tomorrow which will demonstrate this in the first subset. > > >> { >> - xen_read_wallclock(now); >> + struct timespec64 now64; >> + >> + xen_read_wallclock(&now64); >> + *now = timespec64_to_timespec(now64); >> } >> >> static int xen_set_wallclock(const struct timespec *now) >> @@ -485,8 +498,7 @@ static const struct pv_time_ops xen_time_ops __initconst = { >> static void __init xen_time_init(void) >> { >> int cpu = smp_processor_id(); >> - struct timespec tp; >> - struct timespec64 tp64; >> + struct timespec64 tp; >> >> clocksource_register_hz(&xen_clocksource, NSEC_PER_SEC); >> >> @@ -497,14 +509,9 @@ static void __init xen_time_init(void) >> xen_clockevent = &xen_vcpuop_clockevent; >> } >> >> - /* >> - * Set initial system time with full resolution. >> - * TODO: [2038 safety] xen_read_wallclock() should be changed to use >> - * timespec64 for 2038 safety as soon as possible. >> - */ >> + /* Set initial system time with full resolution. */ >> xen_read_wallclock(&tp); >> - tp64 = timespec_to_timespec64(tp); >> - do_settimeofday(&tp64); >> + do_settimeofday(&tp); >> >> setup_force_cpu_cap(X86_FEATURE_TSC); >> >> -- >> 1.7.9.5 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> Please read the FAQ at http://secure-web.cisco.com/1R3n2I8-gDpn8akesS4B4JN0A1SlyiiKzIT0qgddW4Xm1xtBi5J7nJwhRaPMEkp0VmrMyOlBD5Lz9VdewgeobSUsSzhREJQNT2O0l1LUhfiaNzD2_oHWGA6fP4sD1KCgFB00xHD6jw1ggEqe03cpaKsGQmA-TwOpFD41O8IIqhwY/http%3A%2F%2Fwww.tux.org%2Flkml%2F >> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index cf1b591..2ce064a 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -169,20 +169,33 @@ static cycle_t xen_clocksource_get_cycles(struct clocksource *cs) return xen_clocksource_read(); } -static void xen_read_wallclock(struct timespec *ts) +static void xen_read_wallclock(struct timespec64 *ts) { + struct timespec ts32; struct shared_info *s = HYPERVISOR_shared_info; struct pvclock_wall_clock *wall_clock = &(s->wc); struct pvclock_vcpu_time_info *vcpu_time; vcpu_time = &get_cpu_var(xen_vcpu)->time; - pvclock_read_wallclock(wall_clock, vcpu_time, ts); + /* + * TODO: [2038 safety] pvclock_read_wallclock() should be changed + * to use timespec64 for 2038 safety as soon as possible. + */ + pvclock_read_wallclock(wall_clock, vcpu_time, &ts32); + *ts = timespec_to_timespec64(ts32); put_cpu_var(xen_vcpu); } +/* + * TODO: [2038 safety] xen_get_wallclock() should be changed to use + * timespec64 for 2038 safety as soon as possible. + */ static void xen_get_wallclock(struct timespec *now) { - xen_read_wallclock(now); + struct timespec64 now64; + + xen_read_wallclock(&now64); + *now = timespec64_to_timespec(now64); } static int xen_set_wallclock(const struct timespec *now) @@ -485,8 +498,7 @@ static const struct pv_time_ops xen_time_ops __initconst = { static void __init xen_time_init(void) { int cpu = smp_processor_id(); - struct timespec tp; - struct timespec64 tp64; + struct timespec64 tp; clocksource_register_hz(&xen_clocksource, NSEC_PER_SEC); @@ -497,14 +509,9 @@ static void __init xen_time_init(void) xen_clockevent = &xen_vcpuop_clockevent; } - /* - * Set initial system time with full resolution. - * TODO: [2038 safety] xen_read_wallclock() should be changed to use - * timespec64 for 2038 safety as soon as possible. - */ + /* Set initial system time with full resolution. */ xen_read_wallclock(&tp); - tp64 = timespec_to_timespec64(tp); - do_settimeofday(&tp64); + do_settimeofday(&tp); setup_force_cpu_cap(X86_FEATURE_TSC);
The kernel uses 32-bit signed value(time_t) for seconds since 1970-01-01:00:00:00, so it will overflow at 2038-01-19 03:14:08 on 32-bit systems. We call this "2038 safety" issue. As part of addressing 2038 safety for in-kernel uses, this patch creates no functional change in existing users, converts xen_read_wallclock() to use timespec64 instead of timespec. Signed-off-by: pang.xunlei <pang.xunlei@linaro.org> --- arch/x86/xen/time.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-)