X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=share%2Fkernelcompat.h;h=5cc5eaa22e70b963795619b963c1c2f8ed9504da;hb=93d0f2eaff675059588e958e3de74a1bb7dd4028;hp=41746d9f05d21b3ea18e8c30e2e5c9ef69fec1ba;hpb=16a93583f647cb6e5da1ed395462200aaf07bb2d;p=ust.git diff --git a/share/kernelcompat.h b/share/kernelcompat.h index 41746d9..5cc5eaa 100644 --- a/share/kernelcompat.h +++ b/share/kernelcompat.h @@ -3,11 +3,14 @@ #include -#include "compiler.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) );}) @@ -41,14 +44,7 @@ static inline long IS_ERR(const void *ptr) } -/* FIXED SIZE INTEGERS */ - -//#include - -//typedef uint8_t u8; -//typedef uint16_t u16; -//typedef uint32_t u32; -//typedef uint64_t u64; +/* Min / Max */ #define min_t(type, x, y) ({ \ type __min1 = (x); \ @@ -91,99 +87,10 @@ static inline long IS_ERR(const void *ptr) #include #define printk(fmt, args...) printf(fmt, ## args) -/* MEMORY BARRIERS */ - -//#define smp_mb__after_atomic_inc() do {} while(0) - -///* RCU */ -// -//#include "urcu.h" -//#define call_rcu_sched(a,b) b(a); synchronize_rcu() -//#define rcu_barrier_sched() do {} while(0) /* this nop is ok if call_rcu_sched does a synchronize_rcu() */ -//#define rcu_read_lock_sched_notrace() rcu_read_lock() -//#define rcu_read_unlock_sched_notrace() rcu_read_unlock() - -/* ATOMICITY */ - -//#include -// -//static inline int atomic_dec_and_test(atomic_t *p) -//{ -// (p->counter)--; -// return !p->counter; -//} -// -//static inline void atomic_set(atomic_t *p, int v) -//{ -// p->counter=v; -//} -// -//static inline void atomic_inc(atomic_t *p) -//{ -// p->counter++; -//} -// -//static int atomic_read(atomic_t *p) -//{ -// return p->counter; -//} -// -//#define atomic_long_t atomic_t -//#define atomic_long_set atomic_set -//#define atomic_long_read atomic_read - -//#define __xg(x) ((volatile long *)(x)) - -//#define cmpxchg(ptr, o, n) \ -// ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \ - (unsigned long)(n), sizeof(*(ptr)))) - -//#define local_cmpxchg cmpxchg -//#define local_cmpxchg(l, o, n) (cmpxchg(&((l)->a.counter), (o), (n))) - -//#define atomic_long_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) - - -/* LOCAL OPS */ - -//typedef int local_t; -//typedef struct -//{ -// atomic_long_t a; -//} local_t; -// -// -//static inline void local_inc(local_t *l) -//{ -// (l->a.counter)++; -//} -// -//static inline void local_set(local_t *l, int v) -//{ -// l->a.counter = v; -//} -// -//static inline void local_add(int v, local_t *l) -//{ -// l->a.counter += v; -//} -// -//static int local_add_return(int v, local_t *l) -//{ -// return l->a.counter += v; -//} -// -//static inline int local_read(local_t *l) -//{ -// return l->a.counter; -//} - /* ATTRIBUTES */ #define ____cacheline_aligned -#define __init -#define __exit /* MATH */ @@ -231,7 +138,7 @@ static __inline__ int get_count_order(unsigned int count) #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) +#define PAGE_MASK (~(PAGE_SIZE-1)) @@ -242,17 +149,35 @@ static __inline__ int get_count_order(unsigned int count) /* TRACE CLOCK */ -//ust// static inline u64 trace_clock_read64(void) -//ust// { -//ust// uint32_t low; -//ust// uint32_t high; -//ust// uint64_t retval; -//ust// __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high)); -//ust// -//ust// retval = high; -//ust// retval <<= 32; -//ust// return retval | low; -//ust// } +/* 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 static inline u64 trace_clock_read64(void) { @@ -278,14 +203,4 @@ static inline u32 trace_clock_freq_scale(void) } -/* LISTS */ - -#define list_add_rcu list_add -#define list_for_each_entry_rcu list_for_each_entry - - -#define EXPORT_SYMBOL_GPL(a) /*nothing*/ - -#define smp_processor_id() (-1) - #endif /* KERNELCOMPAT_H */