[PATCH 3/3] xen/arm: set the system time in Xen via the XENPF_settime hypercall

Arnd Bergmann arnd at arndb.de
Mon Nov 9 08:10:13 PST 2015


On Monday 09 November 2015 14:10:22 Stefano Stabellini wrote:
> On Thu, 5 Nov 2015, Arnd Bergmann wrote:
> > On Thursday 05 November 2015 17:09:45 Stefano Stabellini wrote:
> > > +	now = __current_kernel_time();
> > 
> > We don't have __current_kernel_time64() yet, but it is trivial
> > to add, just follow the example of
> > current_kernel_time()/current_kernel_time64() and convert the
> > existing __current_kernel_time() function into a static
> > inline wrapper for the new __current_kernel_time64().
> 
> All right. I guess something like:
> 
> struct timespec64 __current_kernel_time64(void)
> {
> 	struct timekeeper *tk = &tk_core.timekeeper;
> 
> 	return tk_xtime(tk);
> }

Yes, exactly.

Just to make sure that this is actually the correct interface
that you want to call:

__current_kernel_time{,64}() is the fastest interface we have
to get an approximation of the current time, while ignoring
all of the locking.

Is is possible that you instead want ktime_get_real_ts64(),
which gives you the time as precise as the kernel knows it,
but uses locking?

> > > +	/*
> > > +	 * We only take the expensive HV call when the clock was set
> > > +	 * or when the 11 minutes RTC synchronization time elapsed.
> > > +	 */
> > > +	if (!was_set && timespec_compare(&now, &next_sync) < 0)
> > > +		return NOTIFY_OK;
> > > +
> > > +	op.interface_version = XENPF_INTERFACE_VERSION;
> > > +	op.cmd = XENPF_settime;
> > > +	op.u.settime.secs = now.tv_sec;
> > > +	op.u.settime.nsecs = now.tv_nsec;
> > > +	op.u.settime.system_time = arch_timer_read_counter();
> > > +	printk("GTOD: Setting to %ld.%ld at %lld\n",
> > > +	       (long)op.u.settime.secs,
> > > +	       (long)op.u.settime.nsecs,
> > > +	       (long long)op.u.settime.system_time);
> > > +	(void)HYPERVISOR_dom0_op(&op);
> > 
> > I guess we will also need a XENPF_settime64 interface, but at
> > least we can get away with implementing only that one on ARM,
> > while x86 will have to support both the 32-bit and 64-bit
> > based variant.
> 
> We already have XENPF_settime64, I'll just use it instead.

Ok, great! Then we just need to find a volunteer who can
do the same thing on x86, with the fallback to XENPF_settime
that they need for older hosts.

	Arnd



More information about the linux-arm-kernel mailing list