From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759265AbeD0U43 (ORCPT ); Fri, 27 Apr 2018 16:56:29 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:58302 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758944AbeD0U42 (ORCPT ); Fri, 27 Apr 2018 16:56:28 -0400 Date: Fri, 27 Apr 2018 22:56:22 +0200 From: Radim =?utf-8?B?S3LEjW3DocWZ?= To: Arnd Bergmann Cc: Thomas Gleixner , y2038@lists.linaro.org, Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Jan Kiszka , Paolo Bonzini , Boris Ostrovsky , Juergen Gross , Joao Martins , "Rafael J. Wysocki" , Andy Shevchenko , Borislav Petkov , Andy Lutomirski , John Stultz , linux-kernel@vger.kernel.org, jailhouse-dev@googlegroups.com, kvm@vger.kernel.org, xen-devel@lists.xenproject.org Subject: Re: [PATCH] [v3] x86: Convert x86_platform_ops to timespec64 Message-ID: <20180427205621.GE23874@flask> References: <20180427201435.3194219-1-arnd@arndb.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20180427201435.3194219-1-arnd@arndb.de> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2018-04-27 22:13+0200, Arnd Bergmann: > The x86 platform operations are fairly isolated, so we can > change them from using timespec to timespec64. I checked that > All the users and callers are safe, and there is only one > critical function that is broken beyond 2106: > > pvclock_read_wallclock() uses a 32-bit number of seconds since > the epoch to communicate the boot time between host and guest > in a virtual environment. This will work until 2106, but we > should ideally find a replacement anyway. I've added a comment > about it there. > > Reviewed-by: Boris Ostrovsky > Signed-off-by: Arnd Bergmann > --- > v2 changes: > - move comment block (Boris) > - remove unnecessary type cast (Boris) > - fix format string (0day bot) > - fix include order (0day bot) > > v3 changes: > - add jailhouse specific change > - avoid include file header by relying on another > patch ("timekeeping: Remove timespec64 hack") > > Not sure how we want to merge this (assuming the last modification > worked, this has seen little testing). The "timekeeping: Remove > timespec64 hack" patch should go through the timekeeping branch > in tip, while this one is for x86. I assume the linux-tip maintainers > can come up with a plan. > --- > diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h > @@ -12,7 +12,7 @@ void pvclock_set_flags(u8 flags); > unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src); > void pvclock_read_wallclock(struct pvclock_wall_clock *wall, > struct pvclock_vcpu_time_info *vcpu, > - struct timespec *ts); > + struct timespec64 *ts); > void pvclock_resume(void); > > void pvclock_touch_watchdogs(void); > diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c > @@ -53,7 +53,7 @@ static struct pvclock_wall_clock *wall_clock; > * have elapsed since the hypervisor wrote the data. So we try to account for > * that with system time > */ > -static void kvm_get_wallclock(struct timespec *now) > +static void kvm_get_wallclock(struct timespec64 *now) > { > struct pvclock_vcpu_time_info *vcpu_time; > int low, high; > @@ -72,7 +72,7 @@ static void kvm_get_wallclock(struct timespec *now) > put_cpu(); > } > > -static int kvm_set_wallclock(const struct timespec *now) > +static int kvm_set_wallclock(const struct timespec64 *now) > { > return -ENODEV; > } > diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c > @@ -123,28 +123,35 @@ u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) > > void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock, > struct pvclock_vcpu_time_info *vcpu_time, > - struct timespec *ts) > + struct timespec64 *ts) > { > u32 version; > u64 delta; > - struct timespec now; > + struct timespec64 now; > > /* get wallclock at system boot */ > do { > version = wall_clock->version; > rmb(); /* fetch version before time */ > + /* > + * Note: wall_clock->sec is a u32 value, so it can > + * only store dates between 1970 and 2106. To allow > + * times beyond that, we need to create a new hypercall > + * interface with an extended pvclock_wall_clock structure > + * like ARM has. > + */ (Modern TSC extensions stripped pvclock of all advantages, so we'll likely abandon pvclock by then.) > now.tv_sec = wall_clock->sec; > now.tv_nsec = wall_clock->nsec; > rmb(); /* fetch time before checking version */ > } while ((wall_clock->version & 1) || (version != wall_clock->version)); > > delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */ > - delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec; > + delta += now.tv_sec * NSEC_PER_SEC + now.tv_nsec; > > now.tv_nsec = do_div(delta, NSEC_PER_SEC); > now.tv_sec = delta; > > - set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); > + set_normalized_timespec64(ts, now.tv_sec, now.tv_nsec); > } > > void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti) kvmclock and pvclock changes Acked-by: Radim Krčmář From mboxrd@z Thu Jan 1 00:00:00 1970 From: Radim =?utf-8?B?S3LEjW3DocWZ?= Subject: Re: [PATCH] [v3] x86: Convert x86_platform_ops to timespec64 Date: Fri, 27 Apr 2018 22:56:22 +0200 Message-ID: <20180427205621.GE23874@flask> References: <20180427201435.3194219-1-arnd@arndb.de> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Cc: Thomas Gleixner , y2038@lists.linaro.org, Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Jan Kiszka , Paolo Bonzini , Boris Ostrovsky , Juergen Gross , Joao Martins , "Rafael J. Wysocki" , Andy Shevchenko , Borislav Petkov , Andy Lutomirski , John Stultz , linux-kernel@vger.kernel.org, jailhouse-dev@googlegroups.com, kvm@vger.kernel.org, xen-devel@lists.xenproject.org To: Arnd Bergmann Return-path: Sender: jailhouse-dev@googlegroups.com Content-Disposition: inline In-Reply-To: <20180427201435.3194219-1-arnd@arndb.de> List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , List-Id: kvm.vger.kernel.org 2018-04-27 22:13+0200, Arnd Bergmann: > The x86 platform operations are fairly isolated, so we can > change them from using timespec to timespec64. I checked that > All the users and callers are safe, and there is only one > critical function that is broken beyond 2106: >=20 > pvclock_read_wallclock() uses a 32-bit number of seconds since > the epoch to communicate the boot time between host and guest > in a virtual environment. This will work until 2106, but we > should ideally find a replacement anyway. I've added a comment > about it there. >=20 > Reviewed-by: Boris Ostrovsky > Signed-off-by: Arnd Bergmann > --- > v2 changes: > - move comment block (Boris) > - remove unnecessary type cast (Boris) > - fix format string (0day bot) > - fix include order (0day bot) >=20 > v3 changes: > - add jailhouse specific change > - avoid include file header by relying on another > patch ("timekeeping: Remove timespec64 hack") >=20 > Not sure how we want to merge this (assuming the last modification > worked, this has seen little testing). The "timekeeping: Remove > timespec64 hack" patch should go through the timekeeping branch > in tip, while this one is for x86. I assume the linux-tip maintainers > can come up with a plan. > --- > diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvcloc= k.h > @@ -12,7 +12,7 @@ void pvclock_set_flags(u8 flags); > unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src); > void pvclock_read_wallclock(struct pvclock_wall_clock *wall, > struct pvclock_vcpu_time_info *vcpu, > - struct timespec *ts); > + struct timespec64 *ts); > void pvclock_resume(void); > =20 > void pvclock_touch_watchdogs(void); > diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c > @@ -53,7 +53,7 @@ static struct pvclock_wall_clock *wall_clock; > * have elapsed since the hypervisor wrote the data. So we try to accoun= t for > * that with system time > */ > -static void kvm_get_wallclock(struct timespec *now) > +static void kvm_get_wallclock(struct timespec64 *now) > { > struct pvclock_vcpu_time_info *vcpu_time; > int low, high; > @@ -72,7 +72,7 @@ static void kvm_get_wallclock(struct timespec *now) > put_cpu(); > } > =20 > -static int kvm_set_wallclock(const struct timespec *now) > +static int kvm_set_wallclock(const struct timespec64 *now) > { > return -ENODEV; > } > diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c > @@ -123,28 +123,35 @@ u64 pvclock_clocksource_read(struct pvclock_vcpu_ti= me_info *src) > =20 > void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock, > struct pvclock_vcpu_time_info *vcpu_time, > - struct timespec *ts) > + struct timespec64 *ts) > { > u32 version; > u64 delta; > - struct timespec now; > + struct timespec64 now; > =20 > /* get wallclock at system boot */ > do { > version =3D wall_clock->version; > rmb(); /* fetch version before time */ > + /* > + * Note: wall_clock->sec is a u32 value, so it can > + * only store dates between 1970 and 2106. To allow > + * times beyond that, we need to create a new hypercall > + * interface with an extended pvclock_wall_clock structure > + * like ARM has. > + */ (Modern TSC extensions stripped pvclock of all advantages, so we'll likely abandon pvclock by then.) > now.tv_sec =3D wall_clock->sec; > now.tv_nsec =3D wall_clock->nsec; > rmb(); /* fetch time before checking version */ > } while ((wall_clock->version & 1) || (version !=3D wall_clock->version= )); > =20 > delta =3D pvclock_clocksource_read(vcpu_time); /* time since system boo= t */ > - delta +=3D now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec; > + delta +=3D now.tv_sec * NSEC_PER_SEC + now.tv_nsec; > =20 > now.tv_nsec =3D do_div(delta, NSEC_PER_SEC); > now.tv_sec =3D delta; > =20 > - set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); > + set_normalized_timespec64(ts, now.tv_sec, now.tv_nsec); > } > =20 > void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti) kvmclock and pvclock changes Acked-by: Radim Kr=C4=8Dm=C3=A1=C5=99 --=20 You received this message because you are subscribed to the Google Groups "= Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an e= mail to jailhouse-dev+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/d/optout.