X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=share%2Fkernelcompat.h;h=5cc5eaa22e70b963795619b963c1c2f8ed9504da;hb=93d0f2eaff675059588e958e3de74a1bb7dd4028;hp=e322bdbaad8c504e7e679e09afaf6a0432adb914;hpb=ba6459ba344b54a4f7775e431447be79fd7790f8;p=ust.git diff --git a/share/kernelcompat.h b/share/kernelcompat.h index e322bdb..5cc5eaa 100644 --- a/share/kernelcompat.h +++ b/share/kernelcompat.h @@ -1,9 +1,15 @@ #ifndef KERNELCOMPAT_H #define KERNELCOMPAT_H -#include "compiler.h" +#include #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); \ @@ -38,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); \ @@ -69,14 +68,6 @@ typedef uint64_t u64; #define mutex_unlock(m) pthread_mutex_unlock(m) -/* SPINLOCKS */ - -typedef int spinlock_t; - -#define spin_lock(a) /* nothing */ -#define spin_unlock(a) /* nothing */ -#define spin_lock_init(a) /* nothing */ - /* MALLOCATION */ @@ -96,135 +87,10 @@ typedef int spinlock_t; #include #define printk(fmt, args...) printf(fmt, ## args) -/* MEMORY BARRIERS */ - -#define smp_rmb() do {} while(0) -#define smp_wmb() do {} while(0) -#define smp_mb() do {} while(0) -#define smp_mb__after_atomic_inc() do {} while(0) - -#define read_barrier_depends() do {} while(0) -#define smp_read_barrier_depends() do {} while(0) - -/* RCU */ - -#define rcu_assign_pointer(a, b) do {} while(0) -#define call_rcu_sched(a,b) do {} while(0) -#define rcu_barrier_sched() do {} while(0) -#define rcu_read_lock_sched_notrace() do{} while (0) -#define rcu_read_unlock_sched_notrace() do{} while (0) - -/* ATOMICITY */ - -#include - -typedef struct { sig_atomic_t counter; } atomic_t; - -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 - -#include "asm.h" - -#define __xg(x) ((volatile long *)(x)) - -#define cmpxchg(ptr, o, n) \ - ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \ - (unsigned long)(n), sizeof(*(ptr)))) - -static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, - unsigned long new, int size) -{ - unsigned long prev; - switch (size) { - case 1: - asm volatile("lock cmpxchgb %b1,%2" - : "=a"(prev) - : "q"(new), "m"(*__xg(ptr)), "0"(old) - : "memory"); - return prev; - case 2: - asm volatile("lock cmpxchgw %w1,%2" - : "=a"(prev) - : "r"(new), "m"(*__xg(ptr)), "0"(old) - : "memory"); - return prev; - case 4: - asm volatile("lock cmpxchgl %k1,%2" - : "=a"(prev) - : "r"(new), "m"(*__xg(ptr)), "0"(old) - : "memory"); - return prev; - case 8: - asm volatile("lock cmpxchgq %1,%2" - : "=a"(prev) - : "r"(new), "m"(*__xg(ptr)), "0"(old) - : "memory"); - return prev; - } - return old; -} - -#define local_cmpxchg cmpxchg -#define atomic_long_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) - - -/* LOCAL OPS */ - -typedef int local_t; - -static inline void local_inc(local_t *a) -{ - (*a)++; -} - -static inline void local_set(local_t *a, int v) -{ - *a = v; -} - -static inline void local_add(int v, local_t *a) -{ - *a += v; -} - -static int local_add_return(int v, local_t *a) -{ - return *a += v; -} - -static inline int local_read(local_t *a) -{ - return *a; -} - /* ATTRIBUTES */ #define ____cacheline_aligned -#define __init -#define __exit /* MATH */ @@ -272,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)) @@ -283,30 +149,58 @@ static __inline__ int get_count_order(unsigned int count) /* 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) { - return 0LL; -} + uint32_t low; + uint32_t high; + uint64_t retval; + __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high)); -static inline unsigned int trace_clock_frequency(void) -{ - return 0LL; + retval = high; + retval <<= 32; + return retval | low; } +#endif -static inline u32 trace_clock_freq_scale(void) +static inline u64 trace_clock_read64(void) { - return 0; -} - + struct timeval tv; + u64 retval; -/* LISTS */ + gettimeofday(&tv, NULL); + retval = tv.tv_sec; + retval *= 1000000; + retval += tv.tv_usec; -#define list_add_rcu list_add -#define list_for_each_entry_rcu list_for_each_entry + return retval; +} +static inline u64 trace_clock_frequency(void) +{ + return 1000000LL; +} -#define EXPORT_SYMBOL_GPL(a) /*nothing*/ +static inline u32 trace_clock_freq_scale(void) +{ + return 1; +} -#define smp_processor_id() (-1) #endif /* KERNELCOMPAT_H */