All of lore.kernel.org
 help / color / mirror / Atom feed
From: john stultz <johnstul@us.ibm.com>
To: Zachary Amsden <zamsden@redhat.com>
Cc: kvm@vger.kernel.org, Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Glauber Costa <glommer@redhat.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	linux-kernel@vger.kernel.org
Subject: Re: [KVM timekeeping 17/35] Implement getnsboottime kernel API
Date: Fri, 20 Aug 2010 17:02:38 -0700	[thread overview]
Message-ID: <1282348958.28794.21.camel@localhost.localdomain> (raw)
In-Reply-To: <4C6F11D6.1050101@redhat.com>

On Fri, 2010-08-20 at 13:37 -1000, Zachary Amsden wrote:
> On 08/20/2010 08:39 AM, john stultz wrote:
> > On Thu, 2010-08-19 at 22:07 -1000, Zachary Amsden wrote:
> >    
> >> Add a kernel call to get the number of nanoseconds since boot.  This
> >> is generally useful enough to make it a generic call.
> >>      
> > Few comments here.
> >
> >    
> >> Signed-off-by: Zachary Amsden<zamsden@redhat.com>
> >> ---
> >>   include/linux/time.h      |    1 +
> >>   kernel/time/timekeeping.c |   27 +++++++++++++++++++++++++++
> >>   2 files changed, 28 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/include/linux/time.h b/include/linux/time.h
> >> index ea3559f..5d04108 100644
> >> --- a/include/linux/time.h
> >> +++ b/include/linux/time.h
> >> @@ -145,6 +145,7 @@ extern void getnstimeofday(struct timespec *tv);
> >>   extern void getrawmonotonic(struct timespec *ts);
> >>   extern void getboottime(struct timespec *ts);
> >>   extern void monotonic_to_bootbased(struct timespec *ts);
> >> +extern s64 getnsboottime(void);
> >>      
> > So instead of converting the timespec from getboottime, why did you add
> > a new interface? Also if not a timespec, why did you pick a s64 instead
> > of a ktime_t?
> >    
> 
> The new interface was suggested several times, so I'm proposing it.  I'm 
> indifferent to putting it the kernel API or making it internal to KVM.  
> KVM doesn't want to deal with conversions to / from ktime_t; this code 
> uses a lot (too much) math, and it's easy to get wrong when splitting 
> sec / nsec fields.  So s64 seems a natural type for ns values.  I 
> realize it's not entirely consistent with the kernel API, but s64 
> representation for ns seems to be creeping in.

I can understand wanting that, way back I was pushing for s64 ns
representations for most time values, but the ktime_t was considered a
reasonable compromise to avoid costly 64bit divides to split (sec,nsec)
on 32bit arches.

Maybe call it getboottime_ns() just to distinguish it from
getnstimeofday() which returns a timespec?


> >>   extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
> >>   extern int timekeeping_valid_for_hres(void);
> >> diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
> >> index caf8d4d..d250f0a 100644
> >> --- a/kernel/time/timekeeping.c
> >> +++ b/kernel/time/timekeeping.c
> >> @@ -285,6 +285,33 @@ void ktime_get_ts(struct timespec *ts)
> >>   }
> >>   EXPORT_SYMBOL_GPL(ktime_get_ts);
> >>
> >> +
> >> +/**
> >> + * getnsboottime - get the bootbased clock in nsec format
> >> + *
> >> + * The function calculates the bootbased clock from the realtime
> >> + * clock and the wall_to_monotonic offset and stores the result
> >> + * in normalized timespec format in the variable pointed to by @ts.
> >> + */
> >> +s64 getnsboottime(void)
> >> +{
> >> +	unsigned int seq;
> >> +	s64 secs, nsecs;
> >> +
> >> +	WARN_ON(timekeeping_suspended);
> >> +
> >> +	do {
> >> +		seq = read_seqbegin(&xtime_lock);
> >> +		secs = xtime.tv_sec + wall_to_monotonic.tv_sec;
> >> +		secs += total_sleep_time.tv_sec;
> >> +		nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec;
> >> +		nsecs += total_sleep_time.tv_nsec + timekeeping_get_ns();
> >> +
> >> +	} while (read_seqretry(&xtime_lock, seq));
> >> +	return nsecs + (secs * NSEC_PER_SEC);
> >> +}
> >> +EXPORT_SYMBOL_GPL(getnsboottime);
> >>      
> > You forgot to include the boottime.tv_sec/nsec offset in this. Take a
> > look again at getboottime()
> >    
> 
> I don't think so... boottime is internal to getboottime, and it's just 
> wall_to_monotonic + total_sleep_time -- right?

Right, sorry, some architectures refine boot time even further,
providing an offset from when the machine was actually powered on to
when the timekeeping code was initialized. But that's already adjusted
into wall_to_monotonic at startup. I thought we kept it separately.


> Perhaps I've named the function badly.  What I want is the monotonic 
> clock, adjusted for sleep time - i.e. a clock that counts elapsed real 
> time without accounting for wall clock changes due to time zone, which 
> never goes backwards.

That looks fine then.  Its a little confusing since getboottime()
returns a timespec with the absolute time that the system booted. Where
as your interface is providing the time since boot. 

Maybe gettimefromboot_ns() would be clearer?

thanks
-john







  reply	other threads:[~2010-08-21  0:02 UTC|newest]

Thread overview: 107+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-20  8:07 KVM timekeeping and TSC virtualization Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 01/35] Drop vm_init_tsc Zachary Amsden
2010-08-20 16:54   ` Glauber Costa
2010-08-20  8:07 ` [KVM timekeeping 02/35] Convert TSC writes to TSC offset writes Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 03/35] Move TSC offset writes to common code Zachary Amsden
2010-08-20 17:06   ` Glauber Costa
2010-08-24  0:51     ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 04/35] Fix SVM VMCB reset Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 05/35] Move TSC reset out of vmcb_init Zachary Amsden
2010-08-20 17:08   ` Glauber Costa
2010-08-24  0:52     ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 06/35] TSC reset compensation Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 07/35] Make cpu_tsc_khz updates use local CPU Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 08/35] Warn about unstable TSC Zachary Amsden
2010-08-20 17:28   ` Glauber Costa
2010-08-24  0:56     ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 09/35] Unify TSC logic Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 10/35] Fix deep C-state TSC desynchronization Zachary Amsden
2010-08-20 17:30   ` Glauber Costa
2010-09-14  9:10   ` Jan Kiszka
2010-09-14  9:27     ` Avi Kivity
2010-09-14 10:40       ` Jan Kiszka
2010-09-14 10:47         ` Avi Kivity
2010-09-14 19:32         ` Zachary Amsden
2010-09-14 22:26           ` Jan Kiszka
2010-09-14 23:40             ` Zachary Amsden
2010-09-15  5:34               ` Jan Kiszka
2010-09-15  7:55                 ` Avi Kivity
2010-09-15  8:04                   ` Jan Kiszka
2010-09-15 12:29               ` Glauber Costa
2010-09-15  4:07     ` Zachary Amsden
2010-09-15  8:09       ` Jan Kiszka
2010-09-15 12:32         ` Glauber Costa
2010-09-15 18:27           ` Jan Kiszka
2010-09-17 22:09             ` Zachary Amsden
2010-09-17 22:31               ` Zachary Amsden
2010-09-18 23:53                 ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 11/35] Add helper functions for time computation Zachary Amsden
2010-08-20 17:34   ` Glauber Costa
2010-08-24  0:58     ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 12/35] Robust TSC compensation Zachary Amsden
2010-08-20 17:40   ` Glauber Costa
2010-08-24  1:01     ` Zachary Amsden
2010-08-24 21:33   ` Daniel Verkamp
2010-08-20  8:07 ` [KVM timekeeping 13/35] Perform hardware_enable in CPU_STARTING callback Zachary Amsden
2010-08-27 16:32   ` Jan Kiszka
2010-08-27 23:43     ` Zachary Amsden
2010-08-30  9:10       ` Jan Kiszka
2010-08-20  8:07 ` [KVM timekeeping 14/35] Add clock sync request to hardware enable Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 15/35] Move scale_delta into common header Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 16/35] Fix a possible backwards warp of kvmclock Zachary Amsden
2011-09-02 18:34   ` Philipp Hahn
2011-09-05 14:06     ` [BUG, PATCH-2.6.32] " Philipp Hahn
2011-09-12 11:32       ` Marcelo Tosatti
2010-08-20  8:07 ` [KVM timekeeping 17/35] Implement getnsboottime kernel API Zachary Amsden
2010-08-20 18:39   ` john stultz
2010-08-20 23:37     ` Zachary Amsden
2010-08-21  0:02       ` john stultz [this message]
2010-08-21  0:52         ` Zachary Amsden
2010-08-21  1:04           ` john stultz
2010-08-21  1:22             ` Zachary Amsden
2010-08-27 18:05   ` Jan Kiszka
2010-08-27 23:48     ` Zachary Amsden
2010-08-30 18:07       ` Jan Kiszka
2010-08-20  8:07 ` [KVM timekeeping 18/35] Use getnsboottime in KVM Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 19/35] Add timekeeping documentation Zachary Amsden
2010-08-20 17:50   ` Glauber Costa
2010-08-20  8:07 ` [KVM timekeeping 20/35] Make math work for other scales Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 21/35] Track max tsc_khz Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 22/35] Track tsc last write in vcpu Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 23/35] Set initial TSC rate conversion factors Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 24/35] Timer request function renaming Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 25/35] Add clock catchup mode Zachary Amsden
2010-08-25 17:27   ` Marcelo Tosatti
2010-08-25 20:48     ` Zachary Amsden
2010-08-25 22:01       ` Marcelo Tosatti
2010-08-25 23:38         ` Glauber Costa
2010-08-26  0:17         ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 26/35] Catchup slower TSC to guest rate Zachary Amsden
2010-09-07  3:44   ` Dong, Eddie
2010-09-07  3:44     ` Dong, Eddie
2010-09-07 22:14     ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 27/35] Add TSC trapping Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 28/35] Unstable TSC write compensation Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 29/35] TSC overrun protection Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 30/35] IOCTL for setting TSC rate Zachary Amsden
2010-08-20 17:56   ` Glauber Costa
2010-08-21 16:11     ` Arnd Bergmann
2010-08-20  8:07 ` [KVM timekeeping 31/35] Exit conditions for TSC trapping Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 32/35] Entry " Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 33/35] Indicate reliable TSC in kvmclock Zachary Amsden
2010-08-20 17:45   ` Glauber Costa
2010-08-24  1:14     ` Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 34/35] Remove dead code Zachary Amsden
2010-08-20  8:07 ` [KVM timekeeping 35/35] Add some debug stuff Zachary Amsden
2010-08-20 13:26 ` KVM timekeeping and TSC virtualization David S. Ahern
2010-08-20 23:24   ` Zachary Amsden
2010-08-22  1:32     ` David S. Ahern
2010-08-24  1:44       ` Zachary Amsden
2010-08-24  3:04         ` David S. Ahern
2010-08-24  5:47           ` Zachary Amsden
2010-08-24 13:32             ` David S. Ahern
2010-08-24 23:01               ` Zachary Amsden
2010-08-25 16:55                 ` Marcelo Tosatti
2010-08-25 20:32                   ` Zachary Amsden
2010-08-24 22:13 ` Marcelo Tosatti
2010-08-25  4:04   ` Zachary Amsden

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1282348958.28794.21.camel@localhost.localdomain \
    --to=johnstul@us.ibm.com \
    --cc=avi@redhat.com \
    --cc=glommer@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=zamsden@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.