From: Pierre-Marc Fournier Date: Fri, 23 Apr 2010 15:31:52 +0000 (-0400) Subject: Add support for ppc hw tb clock, remove kernelcompat.h X-Git-Tag: v1.9.1~608 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=518d7abb8e3720433c611499f704c3bd9d554102;p=lttng-ust.git Add support for ppc hw tb clock, remove kernelcompat.h --- diff --git a/include/Makefile.am b/include/Makefile.am index 5a8b075f..eba0fe5b 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1,6 +1,5 @@ nobase_include_HEADERS = \ ust/immediate.h \ - ust/kernelcompat.h \ ust/marker.h \ ust/tracepoint.h \ ust/processor.h \ diff --git a/include/ust/clock.h b/include/ust/clock.h new file mode 100644 index 00000000..d4b6a9dd --- /dev/null +++ b/include/ust/clock.h @@ -0,0 +1,115 @@ +/* Copyright (C) 2010 Pierre-Marc Fournier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef UST_CLOCK_H +#define UST_CLOCK_H + +#include +#include + +/* TRACE CLOCK */ + +/* There are two types of clocks that can be used. + - TSC based clock + - gettimeofday() clock + + Microbenchmarks on Linux 2.6.30 on Core2 Duo 3GHz (functions are inlined): + Calls (100000000) to tsc(): 4004035641 cycles or 40 cycles/call + Calls (100000000) to gettimeofday(): 9723158352 cycles or 97 cycles/call + + For merging traces with the kernel, a time source compatible with that of + the kernel is necessary. + +*/ + +#define TRACE_CLOCK_GENERIC +#ifdef TRACE_CLOCK_GENERIC + +static __inline__ u64 trace_clock_read64(void) +{ + struct timeval tv; + u64 retval; + + gettimeofday(&tv, NULL); + retval = tv.tv_sec; + retval *= 1000000; + retval += tv.tv_usec; + + return retval; +} + +#else + +#if __i386 || __x86_64 + +/* WARNING: Make sure to set frequency and scaling functions that will not + * result in lttv timestamps (sec.nsec) with seconds greater than 2**32-1. + */ +static __inline__ u64 trace_clock_read64(void) +{ + uint32_t low; + uint32_t high; + uint64_t retval; + __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high)); + + retval = high; + retval <<= 32; + return retval | low; +} + +#endif /* __i386 || __x86_64 */ + +#ifdef __PPC__ + +static __inline__ u64 trace_clock_read64(void) +{ + unsigned long tb_l; + unsigned long tb_h; + unsigned long tb_h2; + u64 tb; + + __asm__ ( + "1:\n\t" + "mftbu %[rhigh]\n\t" + "mftb %[rlow]\n\t" + "mftbu %[rhigh2]\n\t" + "cmpw %[rhigh],%[rhigh2]\n\t" + "bne 1b\n\t" + : [rhigh] "=r" (tb_h), [rhigh2] "=r" (tb_h2), [rlow] "=r" (tb_l)); + + tb = tb_h; + tb <<= 32; + tb |= tb_l; + + return tb; +} + +#endif /* __PPC__ */ + +#endif /* ! UST_TRACE_CLOCK_GENERIC */ + +static __inline__ u64 trace_clock_frequency(void) +{ + return 1000000LL; +} + +static __inline__ u32 trace_clock_freq_scale(void) +{ + return 1; +} + +#endif /* UST_CLOCK_H */ diff --git a/include/ust/core.h b/include/ust/core.h index 27c7e6d4..c6057ea7 100644 --- a/include/ust/core.h +++ b/include/ust/core.h @@ -1,6 +1,28 @@ +/* Copyright (C) 2010 Pierre-Marc Fournier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + #ifndef UST_CORE_H #define UST_CORE_H +#include + +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + #if defined(CONFIG_LTT) && defined(CONFIG_LTT_ALIGNMENT) /* @@ -36,4 +58,101 @@ static inline int ltt_get_alignment(void) } #endif /* defined(CONFIG_LTT) && defined(CONFIG_LTT_ALIGNMENT) */ + +/* ARRAYS */ + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + + +/* ALIGNMENT SHORTCUTS */ + +#include + +#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) +#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) +#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE) +#define PAGE_SIZE sysconf(_SC_PAGE_SIZE) +#define PAGE_MASK (~(PAGE_SIZE-1)) + +/* ERROR OPS */ +#define MAX_ERRNO 4095 + +#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) + +static inline void *ERR_PTR(long error) +{ + return (void *) error; +} + +static inline long PTR_ERR(const void *ptr) +{ + return (long) ptr; +} + +static inline long IS_ERR(const void *ptr) +{ + return IS_ERR_VALUE((unsigned long)ptr); +} + + +/* Min / Max */ + +#define min_t(type, x, y) ({ \ + type __min1 = (x); \ + type __min2 = (y); \ + __min1 < __min2 ? __min1: __min2; }) + +#define max_t(type, x, y) ({ \ + type __max1 = (x); \ + type __max2 = (y); \ + __max1 > __max2 ? __max1: __max2; }) + + +/* MUTEXES */ + +#include + +#define DEFINE_MUTEX(m) pthread_mutex_t (m) = PTHREAD_MUTEX_INITIALIZER; +#define DECLARE_MUTEX(m) extern pthread_mutex_t (m); + +#define mutex_lock(m) pthread_mutex_lock(m) + +#define mutex_unlock(m) pthread_mutex_unlock(m) + + +/* MALLOCATION */ + +#define zmalloc(s) calloc(1, s) + +/* ATTRIBUTES */ + +/* FIXME: define this */ +#define ____cacheline_aligned + +/* MATH */ + +#include +static inline unsigned int hweight32(unsigned int w) +{ + unsigned int res = w - ((w >> 1) & 0x55555555); + res = (res & 0x33333333) + ((res >> 2) & 0x33333333); + res = (res + (res >> 4)) & 0x0F0F0F0F; + res = res + (res >> 8); + return (res + (res >> 16)) & 0x000000FF; +} + +static __inline__ int get_count_order(unsigned int count) +{ + int order; + + order = fls(count) - 1; + if (count & (count - 1)) + order++; + return order; +} + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + #endif /* UST_CORE_H */ diff --git a/include/ust/kernelcompat.h b/include/ust/kernelcompat.h deleted file mode 100644 index 1b9058dc..00000000 --- a/include/ust/kernelcompat.h +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (C) 2009 Pierre-Marc Fournier - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef KERNELCOMPAT_H -#define KERNELCOMPAT_H - -#include -#include - -/* FIXME: libkcompat must not define arch-specific local ops, as ust *must* - * fallback to the normal atomic ops. Fix things so we don't add them and - * break things accidentally. - */ - -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - -/* ERROR OPS */ -#define MAX_ERRNO 4095 - -#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) - -static inline void *ERR_PTR(long error) -{ - return (void *) error; -} - -static inline long PTR_ERR(const void *ptr) -{ - return (long) ptr; -} - -static inline long IS_ERR(const void *ptr) -{ - return IS_ERR_VALUE((unsigned long)ptr); -} - - -/* Min / Max */ - -#define min_t(type, x, y) ({ \ - type __min1 = (x); \ - type __min2 = (y); \ - __min1 < __min2 ? __min1: __min2; }) - -#define max_t(type, x, y) ({ \ - type __max1 = (x); \ - type __max2 = (y); \ - __max1 > __max2 ? __max1: __max2; }) - - -/* MUTEXES */ - -#include - -#define DEFINE_MUTEX(m) pthread_mutex_t (m) = PTHREAD_MUTEX_INITIALIZER; -#define DECLARE_MUTEX(m) extern pthread_mutex_t (m); - -#define mutex_lock(m) pthread_mutex_lock(m) - -#define mutex_unlock(m) pthread_mutex_unlock(m) - - -/* MALLOCATION */ - -#define zmalloc(s) calloc(1, s) - -/* ATTRIBUTES */ - -/* FIXME: define this */ -#define ____cacheline_aligned - -/* MATH */ - -#include -static inline unsigned int hweight32(unsigned int w) -{ - unsigned int res = w - ((w >> 1) & 0x55555555); - res = (res & 0x33333333) + ((res >> 2) & 0x33333333); - res = (res + (res >> 4)) & 0x0F0F0F0F; - res = res + (res >> 8); - return (res + (res >> 16)) & 0x000000FF; -} - -static __inline__ int get_count_order(unsigned int count) -{ - int order; - - order = fls(count) - 1; - if (count & (count - 1)) - order++; - return order; -} - - - - -#include - -#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) -#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) -#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE) -#define PAGE_SIZE sysconf(_SC_PAGE_SIZE) -#define PAGE_MASK (~(PAGE_SIZE-1)) - - - - -/* ARRAYS */ - -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) - -/* TRACE CLOCK */ - -/* There are two types of clocks that can be used. - - TSC based clock - - gettimeofday() clock - - Microbenchmarks on Linux 2.6.30 on Core2 Duo 3GHz (functions are inlined): - Calls (100000000) to tsc(): 4004035641 cycles or 40 cycles/call - Calls (100000000) to gettimeofday(): 9723158352 cycles or 97 cycles/call - - For merging traces with the kernel, a time source compatible with that of - the kernel is necessary. - -*/ - -#if 0 -/* WARNING: Make sure to set frequency and scaling functions that will not - * result in lttv timestamps (sec.nsec) with seconds greater than 2**32-1. - */ -static inline u64 trace_clock_read64(void) -{ - uint32_t low; - uint32_t high; - uint64_t retval; - __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high)); - - retval = high; - retval <<= 32; - return retval | low; -} -#endif - -#include - -static inline u64 trace_clock_read64(void) -{ - struct timeval tv; - u64 retval; - - gettimeofday(&tv, NULL); - retval = tv.tv_sec; - retval *= 1000000; - retval += tv.tv_usec; - - return retval; -} - -static inline u64 trace_clock_frequency(void) -{ - return 1000000LL; -} - -static inline u32 trace_clock_freq_scale(void) -{ - return 1; -} - -#endif /* KERNELCOMPAT_H */ diff --git a/include/ust/marker.h b/include/ust/marker.h index 0e0b466b..72ced98c 100644 --- a/include/ust/marker.h +++ b/include/ust/marker.h @@ -26,9 +26,10 @@ #include #include -#include +#include #include #include +#include #include diff --git a/include/ust/tracepoint.h b/include/ust/tracepoint.h index 7db6ed30..be35f926 100644 --- a/include/ust/tracepoint.h +++ b/include/ust/tracepoint.h @@ -24,15 +24,10 @@ * Ported to userspace by Pierre-Marc Fournier. */ -//#include -//#include -//#include - #define _LGPL_SOURCE #include - #include -#include +#include struct module; struct tracepoint; diff --git a/include/ust/ust.h b/include/ust/ust.h index 47e5b6ef..d99a706a 100644 --- a/include/ust/ust.h +++ b/include/ust/ust.h @@ -19,7 +19,6 @@ #define UST_H #include -#include #include #include #include diff --git a/include/usterr.h b/include/usterr.h index 0f6d3608..f0cdeb02 100644 --- a/include/usterr.h +++ b/include/usterr.h @@ -25,6 +25,8 @@ #include #include +#include + #include "share.h" #ifndef UST_COMPONENT diff --git a/libust/buffers.c b/libust/buffers.c index ef62a305..ac34e5fa 100644 --- a/libust/buffers.c +++ b/libust/buffers.c @@ -25,8 +25,10 @@ #include #include #include -#include #include + +#include + #include "buffers.h" #include "channels.h" #include "tracer.h" diff --git a/libust/buffers.h b/libust/buffers.h index ca78796f..00655a49 100644 --- a/libust/buffers.h +++ b/libust/buffers.h @@ -24,7 +24,9 @@ #define _UST_BUFFERS_H #include -#include + +#include + #include "usterr.h" #include "channels.h" #include "tracerconst.h" diff --git a/libust/channels.c b/libust/channels.c index 32942cf7..e06720f3 100644 --- a/libust/channels.c +++ b/libust/channels.c @@ -24,7 +24,6 @@ */ #include -#include #include #include "channels.h" #include "usterr.h" diff --git a/libust/channels.h b/libust/channels.h index 693bf82b..2000430d 100644 --- a/libust/channels.h +++ b/libust/channels.h @@ -23,8 +23,9 @@ #include #include - -#include +#include +#include +#include #define EVENTS_PER_CHANNEL 65536 #define MAX_CPUS 32 diff --git a/libust/marker-control.c b/libust/marker-control.c index a24a94c6..9ee5b7cd 100644 --- a/libust/marker-control.c +++ b/libust/marker-control.c @@ -21,7 +21,6 @@ #include #include -#include #include "tracer.h" #include "usterr.h" diff --git a/libust/marker.c b/libust/marker.c index fd16860e..56ffe399 100644 --- a/libust/marker.c +++ b/libust/marker.c @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include "usterr.h" diff --git a/libust/serialize.c b/libust/serialize.c index d3c8cdb3..32df0b96 100644 --- a/libust/serialize.c +++ b/libust/serialize.c @@ -36,11 +36,10 @@ #include #include -#include #include +#include #include "buffers.h" #include "tracer.h" -//#include "list.h" #include "usterr.h" #include "ust_snprintf.h" diff --git a/libust/tracepoint.c b/libust/tracepoint.c index dd2ad7fa..8eee320d 100644 --- a/libust/tracepoint.c +++ b/libust/tracepoint.c @@ -20,9 +20,9 @@ */ #include - -#include #include +#include +#include #include "usterr.h" #define _LGPL_SOURCE diff --git a/libust/tracer.c b/libust/tracer.c index 60fc8b7a..baab461f 100644 --- a/libust/tracer.c +++ b/libust/tracer.c @@ -34,7 +34,8 @@ #include #include -#include +#include + #include "tracercore.h" #include "tracer.h" #include "usterr.h" diff --git a/libust/tracer.h b/libust/tracer.h index dc2d62ff..0fa2e4dd 100644 --- a/libust/tracer.h +++ b/libust/tracer.h @@ -26,12 +26,12 @@ #include #include -#include +#include +#include +#include #include "channels.h" #include "tracercore.h" #include "tracerconst.h" -#include -#include #include "buffers.h" /* Number of bytes to log with a read/write event */ diff --git a/libust/tracercore.c b/libust/tracercore.c index 72c2887d..ff01f5e2 100644 --- a/libust/tracercore.c +++ b/libust/tracercore.c @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include #include "tracercore.h" /* Traces structures */ diff --git a/libust/tracercore.h b/libust/tracercore.h index 52f75ec8..5c396f46 100644 --- a/libust/tracercore.h +++ b/libust/tracercore.h @@ -21,11 +21,9 @@ #ifndef UST_TRACERCORE_H #define UST_TRACERCORE_H -#include -//ust// #include - -/* ltt's root dir in debugfs */ -#define LTT_ROOT "ltt" +#include +#include +#include /* * All modifications of ltt_traces must be done by ltt-tracer.c, while holding diff --git a/libust/type-serializer.c b/libust/type-serializer.c index 3ee54eba..5d20960e 100644 --- a/libust/type-serializer.c +++ b/libust/type-serializer.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "tracer.h" notrace