diff mbox

[RFC,11/12] time: Convert xen_read_wallclock() to use timespec64

Message ID 1414388802-5866-10-git-send-email-pang.xunlei@linaro.org
State Superseded
Headers show

Commit Message

pang.xunlei Oct. 27, 2014, 5:46 a.m. UTC
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(-)

Comments

Stefano Stabellini Oct. 27, 2014, 3:35 p.m. UTC | #1
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
>
pang.xunlei Oct. 29, 2014, 1:04 p.m. UTC | #2
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
>>
diff mbox

Patch

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);