* [PATCH] x86: convert x86_platform_ops to timespec64
@ 2017-10-13 18:37 Arnd Bergmann
2017-10-13 20:45 ` Boris Ostrovsky
2017-10-16 1:48 ` kbuild test robot
0 siblings, 2 replies; 7+ messages in thread
From: Arnd Bergmann @ 2017-10-13 18:37 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86
Cc: y2038, Arnd Bergmann, Paolo Bonzini, Radim Krčmář,
Boris Ostrovsky, Juergen Gross, Marcos Paulo de Souza,
Dmitry Torokhov, John Stultz, linux-kernel, kvm, xen-devel
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.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
arch/x86/include/asm/intel_mid_vrtc.h | 4 ++--
arch/x86/include/asm/mc146818rtc.h | 4 ++--
arch/x86/include/asm/pvclock.h | 2 +-
arch/x86/include/asm/x86_init.h | 6 +++---
arch/x86/kernel/kvmclock.c | 4 ++--
arch/x86/kernel/pvclock.c | 12 +++++++++---
arch/x86/kernel/rtc.c | 16 ++++++++--------
arch/x86/platform/intel-mid/intel_mid_vrtc.c | 10 +++++-----
arch/x86/xen/time.c | 10 +++++-----
9 files changed, 37 insertions(+), 31 deletions(-)
diff --git a/arch/x86/include/asm/intel_mid_vrtc.h b/arch/x86/include/asm/intel_mid_vrtc.h
index 86ff4685c409..19202320f0be 100644
--- a/arch/x86/include/asm/intel_mid_vrtc.h
+++ b/arch/x86/include/asm/intel_mid_vrtc.h
@@ -3,7 +3,7 @@
extern unsigned char vrtc_cmos_read(unsigned char reg);
extern void vrtc_cmos_write(unsigned char val, unsigned char reg);
-extern void vrtc_get_time(struct timespec *now);
-extern int vrtc_set_mmss(const struct timespec *now);
+extern void vrtc_get_time(struct timespec64 *now);
+extern int vrtc_set_mmss(const struct timespec64 *now);
#endif
diff --git a/arch/x86/include/asm/mc146818rtc.h b/arch/x86/include/asm/mc146818rtc.h
index 24acd9ba7837..1b574e5eb3b2 100644
--- a/arch/x86/include/asm/mc146818rtc.h
+++ b/arch/x86/include/asm/mc146818rtc.h
@@ -94,8 +94,8 @@ static inline unsigned char current_lock_cmos_reg(void)
unsigned char rtc_cmos_read(unsigned char addr);
void rtc_cmos_write(unsigned char val, unsigned char addr);
-extern int mach_set_rtc_mmss(const struct timespec *now);
-extern void mach_get_cmos_time(struct timespec *now);
+extern int mach_set_rtc_mmss(const struct timespec64 *now);
+extern void mach_get_cmos_time(struct timespec64 *now);
#define RTC_IRQ 8
diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h
index 448cfe1b48cf..fc3138fd3aff 100644
--- a/arch/x86/include/asm/pvclock.h
+++ b/arch/x86/include/asm/pvclock.h
@@ -20,7 +20,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/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index f45acdf45957..0c5007b72916 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -141,7 +141,7 @@ struct x86_cpuinit_ops {
void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node);
};
-struct timespec;
+struct timespec64;
/**
* struct x86_legacy_devices - legacy x86 devices
@@ -223,8 +223,8 @@ struct x86_legacy_features {
struct x86_platform_ops {
unsigned long (*calibrate_cpu)(void);
unsigned long (*calibrate_tsc)(void);
- void (*get_wallclock)(struct timespec *ts);
- int (*set_wallclock)(const struct timespec *ts);
+ void (*get_wallclock)(struct timespec64 *ts);
+ int (*set_wallclock)(const struct timespec64 *ts);
void (*iommu_shutdown)(void);
bool (*is_untracked_pat_range)(u64 start, u64 end);
void (*nmi_init)(void);
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index d88967659098..01c76e8cd4be 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -58,7 +58,7 @@ EXPORT_SYMBOL_GPL(pvclock_pvti_cpu0_va);
* 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;
@@ -77,7 +77,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 -1;
}
diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c
index 5c3f6d6a5078..1a7084ad07b9 100644
--- a/arch/x86/kernel/pvclock.c
+++ b/arch/x86/kernel/pvclock.c
@@ -121,11 +121,11 @@ 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 {
@@ -136,11 +136,17 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
rmb(); /* fetch time before checking version */
} while ((wall_clock->version & 1) || (version != wall_clock->version));
+ /*
+ * 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.
+ */
delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */
delta += now.tv_sec * (u64)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);
}
diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c
index 5b21cb7d84d6..f5a687c38c6d 100644
--- a/arch/x86/kernel/rtc.c
+++ b/arch/x86/kernel/rtc.c
@@ -38,13 +38,13 @@ EXPORT_SYMBOL(rtc_lock);
* jump to the next second precisely 500 ms later. Check the Motorola
* MC146818A or Dallas DS12887 data sheet for details.
*/
-int mach_set_rtc_mmss(const struct timespec *now)
+int mach_set_rtc_mmss(const struct timespec64 *now)
{
- unsigned long nowtime = now->tv_sec;
+ time64_t nowtime = now->tv_sec;
struct rtc_time tm;
int retval = 0;
- rtc_time_to_tm(nowtime, &tm);
+ rtc_time64_to_tm(nowtime, &tm);
if (!rtc_valid_tm(&tm)) {
retval = mc146818_set_time(&tm);
if (retval)
@@ -52,14 +52,14 @@ int mach_set_rtc_mmss(const struct timespec *now)
__func__, retval);
} else {
printk(KERN_ERR
- "%s: Invalid RTC value: write of %lx to RTC failed\n",
+ "%s: Invalid RTC value: write of %llx to RTC failed\n",
__func__, nowtime);
retval = -EINVAL;
}
return retval;
}
-void mach_get_cmos_time(struct timespec *now)
+void mach_get_cmos_time(struct timespec64 *now)
{
unsigned int status, year, mon, day, hour, min, sec, century = 0;
unsigned long flags;
@@ -117,7 +117,7 @@ void mach_get_cmos_time(struct timespec *now)
} else
year += CMOS_YEARS_OFFS;
- now->tv_sec = mktime(year, mon, day, hour, min, sec);
+ now->tv_sec = mktime64(year, mon, day, hour, min, sec);
now->tv_nsec = 0;
}
@@ -144,13 +144,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr)
}
EXPORT_SYMBOL(rtc_cmos_write);
-int update_persistent_clock(struct timespec now)
+int update_persistent_clock64(struct timespec64 now)
{
return x86_platform.set_wallclock(&now);
}
/* not static: needed by APM */
-void read_persistent_clock(struct timespec *ts)
+void read_persistent_clock64(struct timespec64 *ts)
{
x86_platform.get_wallclock(ts);
}
diff --git a/arch/x86/platform/intel-mid/intel_mid_vrtc.c b/arch/x86/platform/intel-mid/intel_mid_vrtc.c
index 58024862a7eb..d68b9b10481d 100644
--- a/arch/x86/platform/intel-mid/intel_mid_vrtc.c
+++ b/arch/x86/platform/intel-mid/intel_mid_vrtc.c
@@ -57,7 +57,7 @@ void vrtc_cmos_write(unsigned char val, unsigned char reg)
}
EXPORT_SYMBOL_GPL(vrtc_cmos_write);
-void vrtc_get_time(struct timespec *now)
+void vrtc_get_time(struct timespec64 *now)
{
u8 sec, min, hour, mday, mon;
unsigned long flags;
@@ -83,18 +83,18 @@ void vrtc_get_time(struct timespec *now)
pr_info("vRTC: sec: %d min: %d hour: %d day: %d "
"mon: %d year: %d\n", sec, min, hour, mday, mon, year);
- now->tv_sec = mktime(year, mon, mday, hour, min, sec);
+ now->tv_sec = mktime64(year, mon, mday, hour, min, sec);
now->tv_nsec = 0;
}
-int vrtc_set_mmss(const struct timespec *now)
+int vrtc_set_mmss(const struct timespec64 *now)
{
unsigned long flags;
struct rtc_time tm;
int year;
int retval = 0;
- rtc_time_to_tm(now->tv_sec, &tm);
+ rtc_time64_to_tm(now->tv_sec, &tm);
if (!rtc_valid_tm(&tm) && tm.tm_year >= 72) {
/*
* tm.year is the number of years since 1900, and the
@@ -110,7 +110,7 @@ int vrtc_set_mmss(const struct timespec *now)
vrtc_cmos_write(tm.tm_sec, RTC_SECONDS);
spin_unlock_irqrestore(&rtc_lock, flags);
} else {
- pr_err("%s: Invalid vRTC value: write of %lx to vRTC failed\n",
+ pr_err("%s: Invalid vRTC value: write of %llx to vRTC failed\n",
__func__, now->tv_sec);
retval = -EINVAL;
}
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
index 1ecb05db3632..b1eed21a7b46 100644
--- a/arch/x86/xen/time.c
+++ b/arch/x86/xen/time.c
@@ -56,7 +56,7 @@ static u64 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 shared_info *s = HYPERVISOR_shared_info;
struct pvclock_wall_clock *wall_clock = &(s->wc);
@@ -67,12 +67,12 @@ static void xen_read_wallclock(struct timespec *ts)
put_cpu_var(xen_vcpu);
}
-static void xen_get_wallclock(struct timespec *now)
+static void xen_get_wallclock(struct timespec64 *now)
{
xen_read_wallclock(now);
}
-static int xen_set_wallclock(const struct timespec *now)
+static int xen_set_wallclock(const struct timespec64 *now)
{
return -1;
}
@@ -373,7 +373,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 tp;
/* As Dom0 is never moved, no penalty on using TSC there */
if (xen_initial_domain())
@@ -391,7 +391,7 @@ static void __init xen_time_init(void)
/* Set initial system time with full resolution */
xen_read_wallclock(&tp);
- do_settimeofday(&tp);
+ do_settimeofday64(&tp);
setup_force_cpu_cap(X86_FEATURE_TSC);
--
2.9.0
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH] x86: convert x86_platform_ops to timespec64
2017-10-13 18:37 [PATCH] x86: convert x86_platform_ops to timespec64 Arnd Bergmann
@ 2017-10-13 20:45 ` Boris Ostrovsky
2017-10-16 8:11 ` Arnd Bergmann
2017-10-16 1:48 ` kbuild test robot
1 sibling, 1 reply; 7+ messages in thread
From: Boris Ostrovsky @ 2017-10-13 20:45 UTC (permalink / raw)
To: Arnd Bergmann, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86
Cc: y2038, Paolo Bonzini, Radim Krčmář,
Juergen Gross, Marcos Paulo de Souza, Dmitry Torokhov,
John Stultz, linux-kernel, kvm, xen-devel
On 10/13/2017 02:37 PM, Arnd Bergmann wrote:
> 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.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> arch/x86/include/asm/intel_mid_vrtc.h | 4 ++--
> arch/x86/include/asm/mc146818rtc.h | 4 ++--
> arch/x86/include/asm/pvclock.h | 2 +-
> arch/x86/include/asm/x86_init.h | 6 +++---
> arch/x86/kernel/kvmclock.c | 4 ++--
> arch/x86/kernel/pvclock.c | 12 +++++++++---
> arch/x86/kernel/rtc.c | 16 ++++++++--------
> arch/x86/platform/intel-mid/intel_mid_vrtc.c | 10 +++++-----
> arch/x86/xen/time.c | 10 +++++-----
> 9 files changed, 37 insertions(+), 31 deletions(-)
Xen bits:
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
with a couple of nits:
> @@ -136,11 +136,17 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
> rmb(); /* fetch time before checking version */
> } while ((wall_clock->version & 1) || (version != wall_clock->version));
>
> + /*
> + * 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.
> + */
I think this comment block should be moved up above 'now.tv_sec =
wall_clock->sec;'
> delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */
> delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec;
Now that tv_sec is a 64-bit quantity the cast can be dropped.
-boris
>
> 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);
> }
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] x86: convert x86_platform_ops to timespec64
2017-10-13 20:45 ` Boris Ostrovsky
@ 2017-10-16 8:11 ` Arnd Bergmann
2017-10-16 12:08 ` Paolo Bonzini
0 siblings, 1 reply; 7+ messages in thread
From: Arnd Bergmann @ 2017-10-16 8:11 UTC (permalink / raw)
To: Boris Ostrovsky
Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
the arch/x86 maintainers, y2038 Mailman List, Paolo Bonzini,
Radim Krčmář,
Juergen Gross, Marcos Paulo de Souza, Dmitry Torokhov,
John Stultz, Linux Kernel Mailing List, kvm, xen-devel
On Fri, Oct 13, 2017 at 10:45 PM, Boris Ostrovsky
<boris.ostrovsky@oracle.com> wrote:
> On 10/13/2017 02:37 PM, Arnd Bergmann wrote:
>> 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.
>>
>> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
>> ---
>> arch/x86/include/asm/intel_mid_vrtc.h | 4 ++--
>> arch/x86/include/asm/mc146818rtc.h | 4 ++--
>> arch/x86/include/asm/pvclock.h | 2 +-
>> arch/x86/include/asm/x86_init.h | 6 +++---
>> arch/x86/kernel/kvmclock.c | 4 ++--
>> arch/x86/kernel/pvclock.c | 12 +++++++++---
>> arch/x86/kernel/rtc.c | 16 ++++++++--------
>> arch/x86/platform/intel-mid/intel_mid_vrtc.c | 10 +++++-----
>> arch/x86/xen/time.c | 10 +++++-----
>> 9 files changed, 37 insertions(+), 31 deletions(-)
>
> Xen bits:
> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Thanks!
Since you've looked at it overall, do you have an opinion on the question
how to fix the PV interface to deal with the pvclock_wall_clock overflow?
Should we add a new version now and deprecate the existing one, or
do you think that y2106 is far enough out that we should just ignore the
problem?
> with a couple of nits:
>
>> @@ -136,11 +136,17 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
>> rmb(); /* fetch time before checking version */
>> } while ((wall_clock->version & 1) || (version != wall_clock->version));
>>
>> + /*
>> + * 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.
>> + */
>
> I think this comment block should be moved up above 'now.tv_sec =
> wall_clock->sec;'
right, changed.
>> delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */
>> delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec;
>
> Now that tv_sec is a 64-bit quantity the cast can be dropped.
Ok dropped. In the meantime I had noticed two more problems with the
patch that I did not see earlier when I tested with another patch applied
as well. The kbuild test robot reported the exact same problems, and I've
done a few hundred randconfig builds without the other patch now, so
I'm fairly confident that there are no other problems like those.
I'll follow up with a v2 patch soon.
Arnd
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH] x86: convert x86_platform_ops to timespec64
2017-10-16 8:11 ` Arnd Bergmann
@ 2017-10-16 12:08 ` Paolo Bonzini
2017-10-16 12:16 ` Arnd Bergmann
0 siblings, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2017-10-16 12:08 UTC (permalink / raw)
To: Arnd Bergmann, Boris Ostrovsky
Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
the arch/x86 maintainers, y2038 Mailman List,
Radim Krčmář,
Juergen Gross, Marcos Paulo de Souza, Dmitry Torokhov,
John Stultz, Linux Kernel Mailing List, kvm, xen-devel
On 16/10/2017 10:11, Arnd Bergmann wrote:
> Thanks!
>
> Since you've looked at it overall, do you have an opinion on the question
> how to fix the PV interface to deal with the pvclock_wall_clock overflow?
It has to be done separately for each hypervisor.
In KVM, for example, it is probably best to abandon
pvclock_read_wallclock altogether, and instead use the recently
introduced KVM_HC_CLOCK_PAIRING hypercall. drivers/ptp/ptp_kvm.c is
already using it and it's y2106 safe.
Paolo
> Should we add a new version now and deprecate the existing one, or
> do you think that y2106 is far enough out that we should just ignore the
> problem?
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] x86: convert x86_platform_ops to timespec64
2017-10-16 12:08 ` Paolo Bonzini
@ 2017-10-16 12:16 ` Arnd Bergmann
2017-10-16 12:21 ` Paolo Bonzini
0 siblings, 1 reply; 7+ messages in thread
From: Arnd Bergmann @ 2017-10-16 12:16 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Boris Ostrovsky, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
the arch/x86 maintainers, y2038 Mailman List,
Radim Krčmář,
Juergen Gross, Marcos Paulo de Souza, Dmitry Torokhov,
John Stultz, Linux Kernel Mailing List, kvm, xen-devel
On Mon, Oct 16, 2017 at 2:08 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> On 16/10/2017 10:11, Arnd Bergmann wrote:
>> Thanks!
>>
>> Since you've looked at it overall, do you have an opinion on the question
>> how to fix the PV interface to deal with the pvclock_wall_clock overflow?
>
> It has to be done separately for each hypervisor.
>
> In KVM, for example, it is probably best to abandon
> pvclock_read_wallclock altogether, and instead use the recently
> introduced KVM_HC_CLOCK_PAIRING hypercall. drivers/ptp/ptp_kvm.c is
> already using it and it's y2106 safe.
Right, makes sense. I see that this interface is currently implemented
only for 64-bit x86 in kvm_emulate_hypercall(). Could this be extended
to x86-32 and the non-x86 architectures as well?
Arnd
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH] x86: convert x86_platform_ops to timespec64
2017-10-16 12:16 ` Arnd Bergmann
@ 2017-10-16 12:21 ` Paolo Bonzini
0 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2017-10-16 12:21 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Boris Ostrovsky, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
the arch/x86 maintainers, y2038 Mailman List,
Radim Krčmář,
Juergen Gross, Marcos Paulo de Souza, Dmitry Torokhov,
John Stultz, Linux Kernel Mailing List, kvm, xen-devel
On 16/10/2017 14:16, Arnd Bergmann wrote:
> On Mon, Oct 16, 2017 at 2:08 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
>> On 16/10/2017 10:11, Arnd Bergmann wrote:
>>> Thanks!
>>>
>>> Since you've looked at it overall, do you have an opinion on the question
>>> how to fix the PV interface to deal with the pvclock_wall_clock overflow?
>>
>> It has to be done separately for each hypervisor.
>>
>> In KVM, for example, it is probably best to abandon
>> pvclock_read_wallclock altogether, and instead use the recently
>> introduced KVM_HC_CLOCK_PAIRING hypercall. drivers/ptp/ptp_kvm.c is
>> already using it and it's y2106 safe.
>
> Right, makes sense. I see that this interface is currently implemented
> only for 64-bit x86 in kvm_emulate_hypercall(). Could this be extended
> to x86-32 and the non-x86 architectures as well?
Yes, it could be implemented for x86-32 too. The whole pvclock concept
however is specific to x86.
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] x86: convert x86_platform_ops to timespec64
2017-10-13 18:37 [PATCH] x86: convert x86_platform_ops to timespec64 Arnd Bergmann
2017-10-13 20:45 ` Boris Ostrovsky
@ 2017-10-16 1:48 ` kbuild test robot
1 sibling, 0 replies; 7+ messages in thread
From: kbuild test robot @ 2017-10-16 1:48 UTC (permalink / raw)
To: Arnd Bergmann
Cc: kbuild-all, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
y2038, Arnd Bergmann, Paolo Bonzini, Radim Krčmář,
Boris Ostrovsky, Juergen Gross, Marcos Paulo de Souza,
Dmitry Torokhov, John Stultz, linux-kernel, kvm, xen-devel
[-- Attachment #1: Type: text/plain, Size: 5233 bytes --]
Hi Arnd,
[auto build test ERROR on tip/x86/core]
[also build test ERROR on v4.14-rc5 next-20171013]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Arnd-Bergmann/x86-convert-x86_platform_ops-to-timespec64/20171016-091601
config: x86_64-allmodconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All error/warnings (new ones prefixed by >>):
arch/x86/xen/time.c: In function 'xen_init_time_ops':
>> arch/x86/xen/time.c:418:29: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
x86_platform.get_wallclock = xen_get_wallclock;
^
arch/x86/xen/time.c:421:30: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
x86_platform.set_wallclock = xen_set_wallclock;
^
arch/x86/xen/time.c: In function 'xen_hvm_init_time_ops':
arch/x86/xen/time.c:458:29: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
x86_platform.get_wallclock = xen_get_wallclock;
^
arch/x86/xen/time.c:459:29: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
x86_platform.set_wallclock = xen_set_wallclock;
^
cc1: some warnings being treated as errors
--
In file included from include/linux/printk.h:6:0,
from include/linux/kernel.h:13,
from arch/x86/platform/intel-mid/intel_mid_vrtc.c:20:
arch/x86/platform/intel-mid/intel_mid_vrtc.c: In function 'vrtc_set_mmss':
>> include/linux/kern_levels.h:4:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type '__kernel_time_t {aka const long int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:10:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:301:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> arch/x86/platform/intel-mid/intel_mid_vrtc.c:113:3: note: in expansion of macro 'pr_err'
pr_err("%s: Invalid vRTC value: write of %llx to vRTC failed\n",
^~~~~~
--
In file included from include/linux/printk.h:6:0,
from include/linux/kernel.h:13,
from arch/x86//platform/intel-mid/intel_mid_vrtc.c:20:
arch/x86//platform/intel-mid/intel_mid_vrtc.c: In function 'vrtc_set_mmss':
>> include/linux/kern_levels.h:4:18: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 3 has type '__kernel_time_t {aka const long int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:10:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:301:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
arch/x86//platform/intel-mid/intel_mid_vrtc.c:113:3: note: in expansion of macro 'pr_err'
pr_err("%s: Invalid vRTC value: write of %llx to vRTC failed\n",
^~~~~~
vim +418 arch/x86/xen/time.c
409771d2 Stefano Stabellini 2010-05-14 408
d162809f Boris Ostrovsky 2017-05-03 409 void __ref xen_init_time_ops(void)
409771d2 Stefano Stabellini 2010-05-14 410 {
409771d2 Stefano Stabellini 2010-05-14 411 pv_time_ops = xen_time_ops;
409771d2 Stefano Stabellini 2010-05-14 412
409771d2 Stefano Stabellini 2010-05-14 413 x86_init.timers.timer_init = xen_time_init;
409771d2 Stefano Stabellini 2010-05-14 414 x86_init.timers.setup_percpu_clockev = x86_init_noop;
409771d2 Stefano Stabellini 2010-05-14 415 x86_cpuinit.setup_percpu_clockev = x86_init_noop;
409771d2 Stefano Stabellini 2010-05-14 416
409771d2 Stefano Stabellini 2010-05-14 417 x86_platform.calibrate_tsc = xen_tsc_khz;
409771d2 Stefano Stabellini 2010-05-14 @418 x86_platform.get_wallclock = xen_get_wallclock;
47433b8c David Vrabel 2013-06-27 419 /* Dom0 uses the native method to set the hardware RTC. */
47433b8c David Vrabel 2013-06-27 420 if (!xen_initial_domain())
409771d2 Stefano Stabellini 2010-05-14 421 x86_platform.set_wallclock = xen_set_wallclock;
409771d2 Stefano Stabellini 2010-05-14 422 }
409771d2 Stefano Stabellini 2010-05-14 423
:::::: The code at line 418 was first introduced by commit
:::::: 409771d258e9dd71c30f3c9520fd2b796ffc40f0 x86: Use xen_vcpuop_clockevent, xen_clocksource and xen wallclock.
:::::: TO: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
:::::: CC: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 60009 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-10-16 12:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-13 18:37 [PATCH] x86: convert x86_platform_ops to timespec64 Arnd Bergmann
2017-10-13 20:45 ` Boris Ostrovsky
2017-10-16 8:11 ` Arnd Bergmann
2017-10-16 12:08 ` Paolo Bonzini
2017-10-16 12:16 ` Arnd Bergmann
2017-10-16 12:21 ` Paolo Bonzini
2017-10-16 1:48 ` kbuild test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®