aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/time/timekeeping.c
diff options
context:
space:
mode:
authorjohn stultz <johnstul@us.ibm.com>2009-08-19 22:13:34 -0400
committerThomas Gleixner <tglx@linutronix.de>2009-08-21 15:43:46 -0400
commitda15cfdae03351c689736f8d142618592e3cebc3 (patch)
tree497fe3f77e27fa9cf0a484422c7bc382031df1bd /kernel/time/timekeeping.c
parent8cab02dc3c58a12235c6d463ce684dded9696848 (diff)
time: Introduce CLOCK_REALTIME_COARSE
After talking with some application writers who want very fast, but not fine-grained timestamps, I decided to try to implement new clock_ids to clock_gettime(): CLOCK_REALTIME_COARSE and CLOCK_MONOTONIC_COARSE which returns the time at the last tick. This is very fast as we don't have to access any hardware (which can be very painful if you're using something like the acpi_pm clocksource), and we can even use the vdso clock_gettime() method to avoid the syscall. The only trade off is you only get low-res tick grained time resolution. This isn't a new idea, I know Ingo has a patch in the -rt tree that made the vsyscall gettimeofday() return coarse grained time when the vsyscall64 sysctrl was set to 2. However this affects all applications on a system. With this method, applications can choose the proper speed/granularity trade-off for themselves. Signed-off-by: John Stultz <johnstul@us.ibm.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: nikolag@ca.ibm.com Cc: Darren Hart <dvhltc@us.ibm.com> Cc: arjan@infradead.org Cc: jonathan@jonmasters.org LKML-Reference: <1250734414.6897.5.camel@localhost.localdomain> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/time/timekeeping.c')
-rw-r--r--kernel/time/timekeeping.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 15e06defca55..03cbeb34d141 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -847,6 +847,10 @@ unsigned long get_seconds(void)
847} 847}
848EXPORT_SYMBOL(get_seconds); 848EXPORT_SYMBOL(get_seconds);
849 849
850struct timespec __current_kernel_time(void)
851{
852 return xtime_cache;
853}
850 854
851struct timespec current_kernel_time(void) 855struct timespec current_kernel_time(void)
852{ 856{
@@ -862,3 +866,20 @@ struct timespec current_kernel_time(void)
862 return now; 866 return now;
863} 867}
864EXPORT_SYMBOL(current_kernel_time); 868EXPORT_SYMBOL(current_kernel_time);
869
870struct timespec get_monotonic_coarse(void)
871{
872 struct timespec now, mono;
873 unsigned long seq;
874
875 do {
876 seq = read_seqbegin(&xtime_lock);
877
878 now = xtime_cache;
879 mono = wall_to_monotonic;
880 } while (read_seqretry(&xtime_lock, seq));
881
882 set_normalized_timespec(&now, now.tv_sec + mono.tv_sec,
883 now.tv_nsec + mono.tv_nsec);
884 return now;
885}