From mboxrd@z Thu Jan 1 00:00:00 1970 From: mhiramat@redhat.com (Masami Hiramatsu) Date: Sat, 18 Oct 2008 18:12:38 -0400 Subject: [ltt-dev] (forw) [RFC patch 08/15] LTTng - Timestamping In-Reply-To: <20081017165731.GI5696@Krystal> References: <20081017165731.GI5696@Krystal> Message-ID: <48FA5F56.9050100@redhat.com> Hi Mathieu, These patches seems generally good. However, I wonder why you added "ltt_" prefix. if it was useful for other parts of the kernel (I think so), more general name(generic_timestamp?) would be preferable :) Thank you, Mathieu Desnoyers wrote: > Hello, > > Too many CCs on this last post. I should probably have added some, but > here is a link to the thread : > > http://lkml.org/lkml/2008/10/16/511 > > Comments are welcome. > > Mathieu > > ----- Forwarded message from Mathieu Desnoyers ----- > > Date: Thu, 16 Oct 2008 19:27:37 -0400 > To: Linus Torvalds , > Andrew Morton , > Ingo Molnar , linux-kernel at vger.kernel.org, > linux-arch at vger.kernel.org, Steven Rostedt , > Peter Zijlstra , > Thomas Gleixner > Cc: David Miller , > Mathieu Desnoyers , > Ralf Baechle , benh at kernel.crashing.org, > paulus at samba.org, Ingo Molnar > User-Agent: quilt/0.46-1 > From: Mathieu Desnoyers > Subject: [RFC patch 08/15] LTTng - Timestamping > > Wrapper to use the lower level clock sources available on the systems. Fall-back > on jiffies or'd with a logical clock for architectures lacking CPU timestamp > counters. Fall-back on a mixed TSC-logical clock on architectures lacking > synchronized TSC on SMP. > > A generic fallback based on a logical clock and the timer interrupt is > available. > > generic - Uses jiffies or'd with a logical clock extended to 64 bits by > ltt-timestamp.c. > i386 - Uses TSC. If detects non synchronized TSC, uses mixed TSC-logical clock. > mips - Uses TSC extended atomically from 32 to 64 bits by ltt-heartbeat.c. > powerpc - Uses TSC or generic ltt clock. > x86_64 - Uses TSC. If detects non synchronized TSC, uses mixed TSC-logical clock > > Signed-off-by: Mathieu Desnoyers > CC: Ralf Baechle > CC: benh at kernel.crashing.org > CC: paulus at samba.org > CC: David Miller > CC: Linus Torvalds > CC: Andrew Morton > CC: Ingo Molnar > CC: Peter Zijlstra > CC: Thomas Gleixner > CC: Steven Rostedt > CC: linux-arch at vger.kernel.org > --- > include/asm-generic/ltt.h | 53 ++++++++++++++++++++++++++++++++++++++++++++++ > include/linux/ltt.h | 27 +++++++++++++++++++++++ > kernel/timer.c | 2 + > 3 files changed, 82 insertions(+) > > Index: linux-2.6-lttng/kernel/timer.c > =================================================================== > --- linux-2.6-lttng.orig/kernel/timer.c 2008-09-16 14:50:15.000000000 -0400 > +++ linux-2.6-lttng/kernel/timer.c 2008-09-16 14:59:17.000000000 -0400 > @@ -37,6 +37,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -1066,6 +1067,7 @@ void do_timer(unsigned long ticks) > { > jiffies_64 += ticks; > update_times(ticks); > + ltt_add_timestamp(ticks); > } > > #ifdef __ARCH_WANT_SYS_ALARM > Index: linux-2.6-lttng/include/linux/ltt.h > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ linux-2.6-lttng/include/linux/ltt.h 2008-09-16 14:58:47.000000000 -0400 > @@ -0,0 +1,27 @@ > +#ifndef _LINUX_LTT_H > +#define _LINUX_LTT_H > + > +/* > + * Generic LTT clock. > + * > + * Chooses between an architecture specific clock or an atomic logical clock. > + * > + * Copyright (C) 2007 Mathieu Desnoyers (mathieu.desnoyers at polymtl.ca) > + */ > + > +#ifdef CONFIG_LTT_TIMESTAMP > +#ifdef CONFIG_HAVE_LTT_CLOCK > +#include > +#else > +#include > + > +#define ltt_get_timestamp32 ltt_get_timestamp32_generic > +#define ltt_get_timestamp64 ltt_get_timestamp64_generic > +#define ltt_add_timestamp ltt_add_timestamp_generic > +#define ltt_frequency ltt_frequency_generic > +#define ltt_freq_scale ltt_freq_scale_generic > +#endif /* CONFIG_HAVE_LTT_CLOCK */ > +#else > +#define ltt_add_timestamp(ticks) > +#endif /* CONFIG_LTT_TIMESTAMP */ > +#endif /* _LINUX_LTT_H */ > Index: linux-2.6-lttng/include/asm-generic/ltt.h > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ linux-2.6-lttng/include/asm-generic/ltt.h 2008-09-16 14:58:47.000000000 -0400 > @@ -0,0 +1,53 @@ > +#ifndef _ASM_GENERIC_LTT_H > +#define _ASM_GENERIC_LTT_H > + > +/* > + * linux/include/asm-generic/ltt.h > + * > + * Copyright (C) 2007 - Mathieu Desnoyers (mathieu.desnoyers at polymtl.ca) > + * > + * Generic definitions for LTT > + * Architectures without TSC > + */ > + > +#include /* For HZ */ > +#include > + > +#define LTT_GENERIC_CLOCK_SHIFT 13 > + > +u64 ltt_read_synthetic_tsc(void); > + > +extern atomic_t lttng_generic_clock; > + > +static inline u32 ltt_get_timestamp32_generic(void) > +{ > + return atomic_add_return(1, <tng_generic_clock); > +} > + > +static inline u64 ltt_get_timestamp64_generic(void) > +{ > + return ltt_read_synthetic_tsc(); > +} > + > +static inline void ltt_add_timestamp_generic(unsigned long ticks) > +{ > + int old_clock, new_clock; > + > + do { > + old_clock = atomic_read(<tng_generic_clock); > + new_clock = (old_clock + (ticks << LTT_GENERIC_CLOCK_SHIFT)) > + & (~((1 << LTT_GENERIC_CLOCK_SHIFT) - 1)); > + } while (atomic_cmpxchg(<tng_generic_clock, old_clock, new_clock) > + != old_clock); > +} > + > +static inline unsigned int ltt_frequency_generic(void) > +{ > + return HZ << LTT_GENERIC_CLOCK_SHIFT; > +} > + > +static inline u32 ltt_freq_scale_generic(void) > +{ > + return 1; > +} > +#endif /* _ASM_GENERIC_LTT_H */ > -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: mhiramat at redhat.com