From: Pierre-Marc Fournier Date: Tue, 27 Oct 2009 22:58:15 +0000 (-0400) Subject: Merge branch 'for-pierre-marc' of git://git.infradead.org/users/jblunck/ust X-Git-Tag: v0.1~71 X-Git-Url: https://git.lttng.org/?a=commitdiff_plain;h=aa08b4413291fabcbd1b1144377d37034ad361de;hp=12bb5a5f4eb614c4be28e862b9d78603b4626e46;p=ust.git Merge branch 'for-pierre-marc' of git://git.infradead.org/users/jblunck/ust Fixed conflicts: include/ust/marker.h --- diff --git a/Makefile.am b/Makefile.am index 33be5b4..1bdedea 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = libust tests libmallocwrap ustd ustctl libinterfork +SUBDIRS = libust tests libmallocwrap ustd ustctl libinterfork include -EXTRA_DIST = share/kernelcompat.h doc -bin_SCRIPTS = usttrace +EXTRA_DIST = doc +dist_bin_SCRIPTS = usttrace diff --git a/configure.ac b/configure.ac index 070093b..1070e26 100644 --- a/configure.ac +++ b/configure.ac @@ -65,6 +65,7 @@ AC_CHECK_HEADERS([kcompat.h], [], [AC_MSG_ERROR([Cannot find kcompat headers (kc AC_CONFIG_FILES([ Makefile + include/Makefile libust/Makefile tests/Makefile tests/hello/Makefile @@ -76,6 +77,5 @@ AC_CONFIG_FILES([ libinterfork/Makefile ustd/Makefile ustctl/Makefile - java/Makefile ]) AC_OUTPUT diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..48a898b --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,4 @@ +nobase_include_HEADERS = ust/immediate.h ust/kernelcompat.h ust/marker.h \ + ust/tracepoint.h + +noinst_HEADERS = share.h usterr.h diff --git a/include/share.h b/include/share.h new file mode 100644 index 0000000..f674f31 --- /dev/null +++ b/include/share.h @@ -0,0 +1,34 @@ +#ifndef UST_SHARE_H +#define UST_SHARE_H + +#include +#include + +/* This write is patient because it restarts if it was incomplete. + */ + +static inline ssize_t patient_write(int fd, const void *buf, size_t count) +{ + const char *bufc = (const char *) buf; + int result; + + for(;;) { + result = write(fd, bufc, count); + if(result == -1 && errno == EINTR) { + continue; + } + if(result <= 0) { + return result; + } + count -= result; + bufc += result; + + if(count == 0) { + break; + } + } + + return bufc-(const char *)buf; +} + +#endif /* UST_SHARE_H */ diff --git a/include/ust/immediate.h b/include/ust/immediate.h new file mode 100644 index 0000000..1b117cf --- /dev/null +++ b/include/ust/immediate.h @@ -0,0 +1,97 @@ +#ifndef _LINUX_IMMEDIATE_H +#define _LINUX_IMMEDIATE_H + +/* + * Immediate values, can be updated at runtime and save cache lines. + * + * (C) Copyright 2007 Mathieu Desnoyers + * + * 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 + */ + +#ifdef USE_IMMEDIATE + +#include + +/** + * imv_set - set immediate variable (with locking) + * @name: immediate value name + * @i: required value + * + * Sets the value of @name, taking the module_mutex if required by + * the architecture. + */ +#define imv_set(name, i) \ + do { \ + name##__imv = (i); \ + core_imv_update(); \ + module_imv_update(); \ + } while (0) + +/* + * Internal update functions. + */ +extern void core_imv_update(void); +extern void imv_update_range(const struct __imv *begin, + const struct __imv *end); +extern void imv_unref_core_init(void); +extern void imv_unref(struct __imv *begin, struct __imv *end, void *start, + unsigned long size); + +#else + +/* + * Generic immediate values: a simple, standard, memory load. + */ + +/** + * imv_read - read immediate variable + * @name: immediate value name + * + * Reads the value of @name. + */ +#define imv_read(name) _imv_read(name) + +/** + * imv_set - set immediate variable (with locking) + * @name: immediate value name + * @i: required value + * + * Sets the value of @name, taking the module_mutex if required by + * the architecture. + */ +#define imv_set(name, i) (name##__imv = (i)) + +static inline void core_imv_update(void) { } +static inline void imv_unref_core_init(void) { } + +#endif + +#define DECLARE_IMV(type, name) extern __typeof__(type) name##__imv +#define DEFINE_IMV(type, name) __typeof__(type) name##__imv + +#define EXPORT_IMV_SYMBOL(name) EXPORT_SYMBOL(name##__imv) +#define EXPORT_IMV_SYMBOL_GPL(name) EXPORT_SYMBOL_GPL(name##__imv) + +/** + * _imv_read - Read immediate value with standard memory load. + * @name: immediate value name + * + * Force a data read of the immediate value instead of the immediate value + * based mechanism. Useful for __init and __exit section data read. + */ +#define _imv_read(name) (name##__imv) + +#endif diff --git a/include/ust/kernelcompat.h b/include/ust/kernelcompat.h new file mode 100644 index 0000000..5cc5eaa --- /dev/null +++ b/include/ust/kernelcompat.h @@ -0,0 +1,206 @@ +#ifndef KERNELCOMPAT_H +#define KERNELCOMPAT_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); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +#define KERN_DEBUG "" +#define KERN_NOTICE "" +#define KERN_INFO "" +#define KERN_ERR "" +#define KERN_ALERT "" +#define KERN_WARNING "" + +/* 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 */ + +#include + +#define kmalloc(s, t) malloc(s) +#define kzalloc(s, t) zmalloc(s) +#define kfree(p) free((void *)p) +#define kstrdup(s, t) strdup(s) + +#define zmalloc(s) calloc(1, s) + +#define GFP_KERNEL + +/* PRINTK */ + +#include +#define printk(fmt, args...) printf(fmt, ## args) + + +/* ATTRIBUTES */ + +#define ____cacheline_aligned + +/* MATH */ + +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 fls(int x) +{ + int r; +//ust// #ifdef CONFIG_X86_CMOV + asm("bsrl %1,%0\n\t" + "cmovzl %2,%0" + : "=&r" (r) : "rm" (x), "rm" (-1)); +//ust// #else +//ust// asm("bsrl %1,%0\n\t" +//ust// "jnz 1f\n\t" +//ust// "movl $-1,%0\n" +//ust// "1:" : "=r" (r) : "rm" (x)); +//ust// #endif + return r + 1; +} + +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 + +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 new file mode 100644 index 0000000..5c7d1b3 --- /dev/null +++ b/include/ust/marker.h @@ -0,0 +1,328 @@ +/* + * Code markup for dynamic and static tracing. + * + * See Documentation/marker.txt. + * + * (C) Copyright 2006 Mathieu Desnoyers + * (C) Copyright 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 _LINUX_MARKER_H +#define _LINUX_MARKER_H + +#include +//ust// #include +#include +//ust// #include +#include +#include +#include "processor.h" + +//ust// struct module; +//ust// struct task_struct; +struct marker; + +/** + * marker_probe_func - Type of a marker probe function + * @mdata: marker data + * @probe_private: probe private data + * @call_private: call site private data + * @fmt: format string + * @args: variable argument list pointer. Use a pointer to overcome C's + * inability to pass this around as a pointer in a portable manner in + * the callee otherwise. + * + * Type of marker probe functions. They receive the mdata and need to parse the + * format string to recover the variable argument list. + */ +typedef void marker_probe_func(const struct marker *mdata, + void *probe_private, struct registers *regs, void *call_private, + const char *fmt, va_list *args); + +struct marker_probe_closure { + marker_probe_func *func; /* Callback */ + void *probe_private; /* Private probe data */ +}; + +struct marker { + const char *channel; /* Name of channel where to send data */ + const char *name; /* Marker name */ + const char *format; /* Marker format string, describing the + * variable argument list. + */ + DEFINE_IMV(char, state);/* Immediate value state. */ + char ptype; /* probe type : 0 : single, 1 : multi */ + /* Probe wrapper */ + u16 channel_id; /* Numeric channel identifier, dynamic */ + u16 event_id; /* Numeric event identifier, dynamic */ + void (*call)(const struct marker *mdata, void *call_private, struct registers *regs, ...); + struct marker_probe_closure single; + struct marker_probe_closure *multi; + const char *tp_name; /* Optional tracepoint name */ + void *tp_cb; /* Optional tracepoint callback */ + void *location; /* Address of marker in code */ +} __attribute__((aligned(8))); + +#define CONFIG_MARKERS +#ifdef CONFIG_MARKERS + +#define _DEFINE_MARKER(channel, name, tp_name_str, tp_cb, format) \ + static const char __mstrtab_##channel##_##name[] \ + __attribute__((section("__markers_strings"))) \ + = #channel "\0" #name "\0" format; \ + struct registers regs; \ + static struct marker __mark_##channel##_##name \ + __attribute__((section("__markers"), aligned(8))) = \ + { __mstrtab_##channel##_##name, \ + &__mstrtab_##channel##_##name[sizeof(#channel)], \ + &__mstrtab_##channel##_##name[sizeof(#channel) + \ + sizeof(#name)], \ + 0, 0, 0, 0, marker_probe_cb, \ + { __mark_empty_function, NULL}, \ + NULL, tp_name_str, tp_cb, NULL }; \ + asm (".section __marker_addr,\"aw\",@progbits\n\t" \ + _ASM_PTR "%c[marker_struct], (1f)\n\t" \ + ".previous\n\t" \ + "1:\n\t" \ + :: [marker_struct] "i" (&__mark_##channel##_##name));\ + save_registers(®s) + + + +#define DEFINE_MARKER(channel, name, format) \ + _DEFINE_MARKER(channel, name, NULL, NULL, format) + +#define DEFINE_MARKER_TP(channel, name, tp_name, tp_cb, format) \ + _DEFINE_MARKER(channel, name, #tp_name, tp_cb, format) + +/* + * Make sure the alignment of the structure in the __markers section will + * not add unwanted padding between the beginning of the section and the + * structure. Force alignment to the same alignment as the section start. + * + * The "generic" argument controls which marker enabling mechanism must be used. + * If generic is true, a variable read is used. + * If generic is false, immediate values are used. + */ +#define __trace_mark(generic, channel, name, call_private, format, args...) \ + do { \ + DEFINE_MARKER(channel, name, format); \ + __mark_check_format(format, ## args); \ + if (!generic) { \ + if (unlikely(imv_read( \ + __mark_##channel##_##name.state))) \ + (*__mark_##channel##_##name.call) \ + (&__mark_##channel##_##name, \ + call_private, ®s, ## args); \ + } else { \ + if (unlikely(_imv_read( \ + __mark_##channel##_##name.state))) \ + (*__mark_##channel##_##name.call) \ + (&__mark_##channel##_##name, \ + call_private, ®s, ## args); \ + } \ + } while (0) + +#define __trace_mark_tp(channel, name, call_private, tp_name, tp_cb, \ + format, args...) \ + do { \ + void __check_tp_type(void) \ + { \ + register_trace_##tp_name(tp_cb); \ + } \ + DEFINE_MARKER_TP(channel, name, tp_name, tp_cb, format);\ + __mark_check_format(format, ## args); \ + (*__mark_##channel##_##name.call)(&__mark_##channel##_##name, \ + call_private, ®s, ## args); \ + } while (0) + +extern void marker_update_probe_range(struct marker *begin, + struct marker *end); + +#define GET_MARKER(channel, name) (__mark_##channel##_##name) + +#else /* !CONFIG_MARKERS */ +#define DEFINE_MARKER(channel, name, tp_name, tp_cb, format) +#define __trace_mark(generic, channel, name, call_private, format, args...) \ + __mark_check_format(format, ## args) +#define __trace_mark_tp(channel, name, call_private, tp_name, tp_cb, \ + format, args...) \ + do { \ + void __check_tp_type(void) \ + { \ + register_trace_##tp_name(tp_cb); \ + } \ + __mark_check_format(format, ## args); \ + } while (0) +static inline void marker_update_probe_range(struct marker *begin, + struct marker *end) +{ } +#define GET_MARKER(channel, name) +#endif /* CONFIG_MARKERS */ + +/** + * trace_mark - Marker using code patching + * @channel: marker channel (where to send the data), not quoted. + * @name: marker name, not quoted. + * @format: format string + * @args...: variable argument list + * + * Places a marker using optimized code patching technique (imv_read()) + * to be enabled when immediate values are present. + */ +#define trace_mark(channel, name, format, args...) \ + __trace_mark(0, channel, name, NULL, format, ## args) + +/** + * _trace_mark - Marker using variable read + * @channel: marker channel (where to send the data), not quoted. + * @name: marker name, not quoted. + * @format: format string + * @args...: variable argument list + * + * Places a marker using a standard memory read (_imv_read()) to be + * enabled. Should be used for markers in code paths where instruction + * modification based enabling is not welcome. (__init and __exit functions, + * lockdep, some traps, printk). + */ +#define _trace_mark(channel, name, format, args...) \ + __trace_mark(1, channel, name, NULL, format, ## args) + +/** + * trace_mark_tp - Marker in a tracepoint callback + * @channel: marker channel (where to send the data), not quoted. + * @name: marker name, not quoted. + * @tp_name: tracepoint name, not quoted. + * @tp_cb: tracepoint callback. Should have an associated global symbol so it + * is not optimized away by the compiler (should not be static). + * @format: format string + * @args...: variable argument list + * + * Places a marker in a tracepoint callback. + */ +#define trace_mark_tp(channel, name, tp_name, tp_cb, format, args...) \ + __trace_mark_tp(channel, name, NULL, tp_name, tp_cb, format, ## args) + +/** + * MARK_NOARGS - Format string for a marker with no argument. + */ +#define MARK_NOARGS " " + +extern void lock_markers(void); +extern void unlock_markers(void); + +extern void markers_compact_event_ids(void); + +/* To be used for string format validity checking with gcc */ +static inline void __printf(1, 2) ___mark_check_format(const char *fmt, ...) +{ +} + +#define __mark_check_format(format, args...) \ + do { \ + if (0) \ + ___mark_check_format(format, ## args); \ + } while (0) + +extern marker_probe_func __mark_empty_function; + +extern void marker_probe_cb(const struct marker *mdata, + void *call_private, struct registers *regs, ...); + +/* + * Connect a probe to a marker. + * private data pointer must be a valid allocated memory address, or NULL. + */ +extern int marker_probe_register(const char *channel, const char *name, + const char *format, marker_probe_func *probe, void *probe_private); + +/* + * Returns the private data given to marker_probe_register. + */ +extern int marker_probe_unregister(const char *channel, const char *name, + marker_probe_func *probe, void *probe_private); +/* + * Unregister a marker by providing the registered private data. + */ +extern int marker_probe_unregister_private_data(marker_probe_func *probe, + void *probe_private); + +extern void *marker_get_private_data(const char *channel, const char *name, + marker_probe_func *probe, int num); + +/* + * marker_synchronize_unregister must be called between the last marker probe + * unregistration and the first one of + * - the end of module exit function + * - the free of any resource used by the probes + * to ensure the code and data are valid for any possibly running probes. + */ +#define marker_synchronize_unregister() synchronize_sched() + +struct marker_iter { +//ust// struct module *module; + struct lib *lib; + struct marker *marker; +}; + +extern void marker_iter_start(struct marker_iter *iter); +extern void marker_iter_next(struct marker_iter *iter); +extern void marker_iter_stop(struct marker_iter *iter); +extern void marker_iter_reset(struct marker_iter *iter); +extern int marker_get_iter_range(struct marker **marker, struct marker *begin, + struct marker *end); + +extern void marker_update_process(void); +extern int is_marker_enabled(const char *channel, const char *name); + +//ust// #ifdef CONFIG_MARKERS_USERSPACE +//ust// extern void exit_user_markers(struct task_struct *p); +//ust// #else +//ust// static inline void exit_user_markers(struct task_struct *p) +//ust// { +//ust// } +//ust// #endif + +struct marker_addr { + struct marker *marker; + void *addr; +}; + +struct lib { + struct marker *markers_start; + struct marker_addr *markers_addr_start; + int markers_count; + struct list_head list; +}; + +extern int marker_register_lib(struct marker *markers_start, struct marker_addr *marker_addr_start, int markers_count); + +#define MARKER_LIB \ +extern struct marker __start___markers[] __attribute__((visibility("hidden"))); \ +extern struct marker __stop___markers[] __attribute__((visibility("hidden"))); \ +extern struct marker_addr __start___marker_addr[] __attribute__((visibility("hidden"))); \ +extern struct marker_addr __stop___marker_addr[] __attribute__((visibility("hidden"))); \ + \ +static void __attribute__((constructor)) __markers__init(void) \ +{ \ + marker_register_lib(__start___markers, __start___marker_addr, (((long)__stop___markers)-((long)__start___markers))/sizeof(struct marker)); \ +} + +extern void marker_set_new_marker_cb(void (*cb)(struct marker *)); +extern void init_markers(void); + +#endif diff --git a/include/ust/tracepoint.h b/include/ust/tracepoint.h new file mode 100644 index 0000000..56c62b0 --- /dev/null +++ b/include/ust/tracepoint.h @@ -0,0 +1,213 @@ +#ifndef _LINUX_TRACEPOINT_H +#define _LINUX_TRACEPOINT_H + +/* + * Copyright (C) 2008 Mathieu Desnoyers + * 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 + * + * Heavily inspired from the Linux Kernel Markers. + * + * Ported to userspace by Pierre-Marc Fournier. + */ + +//#include +//#include +//#include + +#define _LGPL_SOURCE +#include + +#include +#include + +struct module; +struct tracepoint; + +struct tracepoint { + const char *name; /* Tracepoint name */ + DEFINE_IMV(char, state); /* State. */ + void **funcs; +} __attribute__((aligned(32))); /* + * Aligned on 32 bytes because it is + * globally visible and gcc happily + * align these on the structure size. + * Keep in sync with vmlinux.lds.h. + */ + +#define TPPROTO(args...) args +#define TPARGS(args...) args + +#define CONFIG_TRACEPOINTS +#ifdef CONFIG_TRACEPOINTS + +/* + * it_func[0] is never NULL because there is at least one element in the array + * when the array itself is non NULL. + */ +#define __DO_TRACE(tp, proto, args) \ + do { \ + void **it_func; \ + \ + rcu_read_lock(); /*ust rcu_read_lock_sched_notrace(); */ \ + it_func = rcu_dereference((tp)->funcs); \ + if (it_func) { \ + do { \ + ((void(*)(proto))(*it_func))(args); \ + } while (*(++it_func)); \ + } \ + rcu_read_unlock(); /*ust rcu_read_unlock_sched_notrace(); */ \ + } while (0) + +#define __CHECK_TRACE(name, generic, proto, args) \ + do { \ + if (!generic) { \ + if (unlikely(imv_read(__tracepoint_##name.state))) \ + __DO_TRACE(&__tracepoint_##name, \ + TPPROTO(proto), TPARGS(args)); \ + } else { \ + if (unlikely(_imv_read(__tracepoint_##name.state))) \ + __DO_TRACE(&__tracepoint_##name, \ + TPPROTO(proto), TPARGS(args)); \ + } \ + } while (0) + +/* + * Make sure the alignment of the structure in the __tracepoints section will + * not add unwanted padding between the beginning of the section and the + * structure. Force alignment to the same alignment as the section start. + * + * The "generic" argument, passed to the declared __trace_##name inline + * function controls which tracepoint enabling mechanism must be used. + * If generic is true, a variable read is used. + * If generic is false, immediate values are used. + */ +#define DECLARE_TRACE(name, proto, args) \ + extern struct tracepoint __tracepoint_##name; \ + static inline void trace_##name(proto) \ + { \ + __CHECK_TRACE(name, 0, TPPROTO(proto), TPARGS(args)); \ + } \ + static inline void _trace_##name(proto) \ + { \ + __CHECK_TRACE(name, 1, TPPROTO(proto), TPARGS(args)); \ + } \ + static inline int register_trace_##name(void (*probe)(proto)) \ + { \ + return tracepoint_probe_register(#name, (void *)probe); \ + } \ + static inline int unregister_trace_##name(void (*probe)(proto)) \ + { \ + return tracepoint_probe_unregister(#name, (void *)probe);\ + } + +#define DEFINE_TRACE(name) \ + static const char __tpstrtab_##name[] \ + __attribute__((section("__tracepoints_strings"))) = #name; \ + struct tracepoint __tracepoint_##name \ + __attribute__((section("__tracepoints"), aligned(32))) = \ + { __tpstrtab_##name, 0, NULL } + +#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \ + EXPORT_SYMBOL_GPL(__tracepoint_##name) +#define EXPORT_TRACEPOINT_SYMBOL(name) \ + EXPORT_SYMBOL(__tracepoint_##name) + +extern void tracepoint_update_probe_range(struct tracepoint *begin, + struct tracepoint *end); + +#else /* !CONFIG_TRACEPOINTS */ +#define DECLARE_TRACE(name, proto, args) \ + static inline void trace_##name(proto) \ + { } \ + static inline void _trace_##name(proto) \ + { } \ + static inline int register_trace_##name(void (*probe)(proto)) \ + { \ + return -ENOSYS; \ + } \ + static inline int unregister_trace_##name(void (*probe)(proto)) \ + { \ + return -ENOSYS; \ + } + +#define DEFINE_TRACE(name) +#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) +#define EXPORT_TRACEPOINT_SYMBOL(name) + +static inline void tracepoint_update_probe_range(struct tracepoint *begin, + struct tracepoint *end) +{ } +#endif /* CONFIG_TRACEPOINTS */ + +/* + * Connect a probe to a tracepoint. + * Internal API, should not be used directly. + */ +extern int tracepoint_probe_register(const char *name, void *probe); + +/* + * Disconnect a probe from a tracepoint. + * Internal API, should not be used directly. + */ +extern int tracepoint_probe_unregister(const char *name, void *probe); + +extern int tracepoint_probe_register_noupdate(const char *name, void *probe); +extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe); +extern void tracepoint_probe_update_all(void); + +struct tracepoint_iter { +//ust// struct module *module; + struct tracepoint_lib *lib; + struct tracepoint *tracepoint; +}; + +extern void tracepoint_iter_start(struct tracepoint_iter *iter); +extern void tracepoint_iter_next(struct tracepoint_iter *iter); +extern void tracepoint_iter_stop(struct tracepoint_iter *iter); +extern void tracepoint_iter_reset(struct tracepoint_iter *iter); +extern int tracepoint_get_iter_range(struct tracepoint **tracepoint, + struct tracepoint *begin, struct tracepoint *end); + +/* + * tracepoint_synchronize_unregister must be called between the last tracepoint + * probe unregistration and the end of module exit to make sure there is no + * caller executing a probe when it is freed. + */ +static inline void tracepoint_synchronize_unregister(void) +{ +//ust// synchronize_sched(); +} + +struct tracepoint_lib { + struct tracepoint *tracepoints_start; + int tracepoints_count; + struct list_head list; +}; + +extern int tracepoint_register_lib(struct tracepoint *tracepoints_start, + int tracepoints_count); + +#define TRACEPOINT_LIB \ + extern struct tracepoint __start___tracepoints[] __attribute__((visibility("hidden"))); \ + extern struct tracepoint __stop___tracepoints[] __attribute__((visibility("hidden"))); \ + static void __attribute__((constructor)) __tracepoints__init(void) \ + { \ + tracepoint_register_lib(__start___tracepoints, \ + (((long)__stop___tracepoints)-((long)__start___tracepoints))/sizeof(struct tracepoint)); \ + } + +#endif diff --git a/include/usterr.h b/include/usterr.h new file mode 100644 index 0000000..1819f97 --- /dev/null +++ b/include/usterr.h @@ -0,0 +1,80 @@ +#ifndef USTERR_H +#define USTERR_H + +#include +#include +#include +#include +#include + +#include "share.h" + +#ifndef UST_COMPONENT +//#error UST_COMPONENT is undefined +#define UST_COMPONENT libust +#endif + +/* To stringify the expansion of a define */ +#define XSTR(d) STR(d) +#define STR(s) #s + +/* We sometimes print in the tracing path, and tracing can occur in + * signal handlers, so we must use a print method which is signal safe. + */ + +#define sigsafe_print_err(fmt, args...) \ +{ \ + /* Can't use dynamic allocation. Limit ourselves to 250 chars. */ \ + char ____buf[250]; \ + int ____saved_errno; \ +\ + /* Save the errno. */ \ + ____saved_errno = errno; \ +\ + snprintf(____buf, sizeof(____buf), fmt, ## args); \ +\ + /* Add end of string in case of buffer overflow. */ \ + ____buf[sizeof(____buf)-1] = 0; \ +\ + patient_write(STDERR_FILENO, ____buf, strlen(____buf)); \ + /* Can't print errors because we are in the error printing code path. */ \ +\ + /* Restore errno, in order to be async-signal safe. */ \ + errno = ____saved_errno; \ +} + +#define UST_STR_COMPONENT XSTR(UST_COMPONENT) + +#define ERRMSG(fmt, args...) do { sigsafe_print_err(UST_STR_COMPONENT "[%ld/%ld]: " fmt " (" __FILE__ ":" XSTR(__LINE__) ")\n", (long) getpid(), (long) syscall(SYS_gettid), ## args); fflush(stderr); } while(0) + +#define DEBUG +#ifdef DEBUG +# define DBG(fmt, args...) ERRMSG(fmt, ## args) +#else +# define DBG(fmt, args...) do {} while(0) +#endif +#define WARN(fmt, args...) ERRMSG("Warning: " fmt, ## args) +#define ERR(fmt, args...) ERRMSG("Error: " fmt, ## args) +#define BUG(fmt, args...) ERRMSG("BUG: " fmt, ## args) + +#if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE) +#define PERROR(call, args...)\ + do { \ + char buf[200] = "Error in strerror_r()"; \ + strerror_r(errno, buf, sizeof(buf)); \ + ERRMSG("Error: " call ": %s", ## args, buf); \ + } while(0); +#else +#define PERROR(call, args...)\ + do { \ + char *buf; \ + char tmp[200]; \ + buf = strerror_r(errno, tmp, sizeof(tmp)); \ + ERRMSG("Error: " call ": %s", ## args, buf); \ + } while(0); +#endif + +#define BUG_ON(condition) do { if (unlikely(condition)) ERR("condition not respected (BUG)"); } while(0) +#define WARN_ON(condition) do { if (unlikely(condition)) WARN("condition not respected on line %s:%d", __FILE__, __LINE__); } while(0) + +#endif /* USTERR_H */ diff --git a/java/Makefile.am b/java/Makefile.am index f9deb7a..fa53628 100644 --- a/java/Makefile.am +++ b/java/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_builddir)/libust lib_LTLIBRARIES = libustjava.la libustjava_la_SOURCES = UST.c UST.h diff --git a/libinterfork/Makefile.am b/libinterfork/Makefile.am index 2bcebb1..6540103 100644 --- a/libinterfork/Makefile.am +++ b/libinterfork/Makefile.am @@ -1,3 +1,5 @@ +AM_CPPFLAGS = -I$(top_builddir)/include + lib_LTLIBRARIES = libinterfork.la libinterfork_la_SOURCES = interfork.c libinterfork_la_LIBADD = -ldl diff --git a/libinterfork/interfork.c b/libinterfork/interfork.c index 26a8bd6..e9dce9b 100644 --- a/libinterfork/interfork.c +++ b/libinterfork/interfork.c @@ -20,7 +20,7 @@ #include #include #include -#include "share/usterr.h" +#include "usterr.h" extern void ust_fork(void); extern void ust_potential_exec(void); diff --git a/libmallocwrap/Makefile.am b/libmallocwrap/Makefile.am index 1f7dad3..23b7004 100644 --- a/libmallocwrap/Makefile.am +++ b/libmallocwrap/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust +AM_CPPFLAGS = -I$(top_builddir)/include lib_LTLIBRARIES = libmallocwrap.la libmallocwrap_la_SOURCES = mallocwrap.c diff --git a/libmallocwrap/mallocwrap.c b/libmallocwrap/mallocwrap.c index d505b67..be1f39e 100644 --- a/libmallocwrap/mallocwrap.c +++ b/libmallocwrap/mallocwrap.c @@ -20,7 +20,7 @@ #include #include -#include "marker.h" +#include #if 0 INTERCEPT_PROTOTYPE(void, malloc, size_t size) diff --git a/libust/Makefile.am b/libust/Makefile.am index 1aec7b3..9ee3c9a 100644 --- a/libust/Makefile.am +++ b/libust/Makefile.am @@ -1,7 +1,7 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libustcomm +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_builddir)/libustcomm lib_LTLIBRARIES = libust.la -libust_la_SOURCES = marker.c marker.h tracepoint.c tracepoint.h immediate.h channels.c channels.h marker-control.c marker-control.h relay.c relay.h tracer.c tracer.h tracercore.c tracercore.h serialize.c tracectl.c $(top_builddir)/libustcomm/ustcomm.c $(top_builddir)/share/usterr.h +libust_la_SOURCES = buffer.h marker.c tracepoint.c channels.c channels.h marker-control.c marker-control.h relay.c relay.h tracer.c tracer.h tracercore.c tracercore.h serialize.c tracectl.c $(top_builddir)/libustcomm/ustcomm.c libust_la_LDFLAGS = -no-undefined -version-info 0:0:0 libust_la_LIBADD = -lpthread libust_la_CFLAGS = -DUST_COMPONENT="libust" diff --git a/libust/channels.c b/libust/channels.c index 10ab587..27ceefc 100644 --- a/libust/channels.c +++ b/libust/channels.c @@ -28,10 +28,10 @@ //ust// #include //ust// #include -#include "kernelcompat.h" +#include #include "channels.h" #include "usterr.h" -#include "marker.h" +#include /* * ltt_channel_mutex may be nested inside the LTT trace mutex. diff --git a/libust/channels.h b/libust/channels.h index c91874b..e460e12 100644 --- a/libust/channels.h +++ b/libust/channels.h @@ -26,7 +26,7 @@ //ust// #include #include -#include "kernelcompat.h" +#include #include #define EVENTS_PER_CHANNEL 65536 diff --git a/libust/immediate.h b/libust/immediate.h deleted file mode 100644 index 1b117cf..0000000 --- a/libust/immediate.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef _LINUX_IMMEDIATE_H -#define _LINUX_IMMEDIATE_H - -/* - * Immediate values, can be updated at runtime and save cache lines. - * - * (C) Copyright 2007 Mathieu Desnoyers - * - * 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 - */ - -#ifdef USE_IMMEDIATE - -#include - -/** - * imv_set - set immediate variable (with locking) - * @name: immediate value name - * @i: required value - * - * Sets the value of @name, taking the module_mutex if required by - * the architecture. - */ -#define imv_set(name, i) \ - do { \ - name##__imv = (i); \ - core_imv_update(); \ - module_imv_update(); \ - } while (0) - -/* - * Internal update functions. - */ -extern void core_imv_update(void); -extern void imv_update_range(const struct __imv *begin, - const struct __imv *end); -extern void imv_unref_core_init(void); -extern void imv_unref(struct __imv *begin, struct __imv *end, void *start, - unsigned long size); - -#else - -/* - * Generic immediate values: a simple, standard, memory load. - */ - -/** - * imv_read - read immediate variable - * @name: immediate value name - * - * Reads the value of @name. - */ -#define imv_read(name) _imv_read(name) - -/** - * imv_set - set immediate variable (with locking) - * @name: immediate value name - * @i: required value - * - * Sets the value of @name, taking the module_mutex if required by - * the architecture. - */ -#define imv_set(name, i) (name##__imv = (i)) - -static inline void core_imv_update(void) { } -static inline void imv_unref_core_init(void) { } - -#endif - -#define DECLARE_IMV(type, name) extern __typeof__(type) name##__imv -#define DEFINE_IMV(type, name) __typeof__(type) name##__imv - -#define EXPORT_IMV_SYMBOL(name) EXPORT_SYMBOL(name##__imv) -#define EXPORT_IMV_SYMBOL_GPL(name) EXPORT_SYMBOL_GPL(name##__imv) - -/** - * _imv_read - Read immediate value with standard memory load. - * @name: immediate value name - * - * Force a data read of the immediate value instead of the immediate value - * based mechanism. Useful for __init and __exit section data read. - */ -#define _imv_read(name) (name##__imv) - -#endif diff --git a/libust/marker-control.c b/libust/marker-control.c index f064316..a0786ba 100644 --- a/libust/marker-control.c +++ b/libust/marker-control.c @@ -33,10 +33,10 @@ //ust// #include #include -#include "kernelcompat.h" +#include //#include "list.h" #include "tracer.h" -#include "localerr.h" +#include "usterr.h" #define DEFAULT_CHANNEL "cpu" #define DEFAULT_PROBE "default" diff --git a/libust/marker.c b/libust/marker.c index d4514f1..b543b16 100644 --- a/libust/marker.c +++ b/libust/marker.c @@ -33,9 +33,9 @@ #define _LGPL_SOURCE #include -#include "kernelcompat.h" +#include -#include "marker.h" +#include #include "usterr.h" #include "channels.h" #include "tracercore.h" diff --git a/libust/marker.h b/libust/marker.h deleted file mode 100644 index da3d30c..0000000 --- a/libust/marker.h +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Code markup for dynamic and static tracing. - * - * See Documentation/marker.txt. - * - * (C) Copyright 2006 Mathieu Desnoyers - * (C) Copyright 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 _LINUX_MARKER_H -#define _LINUX_MARKER_H - -#include -//ust// #include -#include "immediate.h" -//ust// #include -#include "kernelcompat.h" -#include -#include "localerr.h" -#include "processor.h" - -//ust// struct module; -//ust// struct task_struct; -struct marker; - -/** - * marker_probe_func - Type of a marker probe function - * @mdata: marker data - * @probe_private: probe private data - * @call_private: call site private data - * @fmt: format string - * @args: variable argument list pointer. Use a pointer to overcome C's - * inability to pass this around as a pointer in a portable manner in - * the callee otherwise. - * - * Type of marker probe functions. They receive the mdata and need to parse the - * format string to recover the variable argument list. - */ -typedef void marker_probe_func(const struct marker *mdata, - void *probe_private, struct registers *regs, void *call_private, - const char *fmt, va_list *args); - -struct marker_probe_closure { - marker_probe_func *func; /* Callback */ - void *probe_private; /* Private probe data */ -}; - -struct marker { - const char *channel; /* Name of channel where to send data */ - const char *name; /* Marker name */ - const char *format; /* Marker format string, describing the - * variable argument list. - */ - DEFINE_IMV(char, state);/* Immediate value state. */ - char ptype; /* probe type : 0 : single, 1 : multi */ - /* Probe wrapper */ - u16 channel_id; /* Numeric channel identifier, dynamic */ - u16 event_id; /* Numeric event identifier, dynamic */ - void (*call)(const struct marker *mdata, void *call_private, struct registers *regs, ...); - struct marker_probe_closure single; - struct marker_probe_closure *multi; - const char *tp_name; /* Optional tracepoint name */ - void *tp_cb; /* Optional tracepoint callback */ - void *location; /* Address of marker in code */ -} __attribute__((aligned(8))); - -#define CONFIG_MARKERS -#ifdef CONFIG_MARKERS - -#define _DEFINE_MARKER(channel, name, tp_name_str, tp_cb, format) \ - static const char __mstrtab_##channel##_##name[] \ - __attribute__((section("__markers_strings"))) \ - = #channel "\0" #name "\0" format; \ - struct registers regs; \ - static struct marker __mark_##channel##_##name \ - __attribute__((section("__markers"), aligned(8))) = \ - { __mstrtab_##channel##_##name, \ - &__mstrtab_##channel##_##name[sizeof(#channel)], \ - &__mstrtab_##channel##_##name[sizeof(#channel) + \ - sizeof(#name)], \ - 0, 0, 0, 0, marker_probe_cb, \ - { __mark_empty_function, NULL}, \ - NULL, tp_name_str, tp_cb, NULL }; \ - asm (".section __marker_addr,\"aw\",@progbits\n\t" \ - _ASM_PTR "%c[marker_struct], (1f)\n\t" \ - ".previous\n\t" \ - "1:\n\t" \ - :: [marker_struct] "i" (&__mark_##channel##_##name));\ - save_registers(®s) - - - -#define DEFINE_MARKER(channel, name, format) \ - _DEFINE_MARKER(channel, name, NULL, NULL, format) - -#define DEFINE_MARKER_TP(channel, name, tp_name, tp_cb, format) \ - _DEFINE_MARKER(channel, name, #tp_name, tp_cb, format) - -/* - * Make sure the alignment of the structure in the __markers section will - * not add unwanted padding between the beginning of the section and the - * structure. Force alignment to the same alignment as the section start. - * - * The "generic" argument controls which marker enabling mechanism must be used. - * If generic is true, a variable read is used. - * If generic is false, immediate values are used. - */ -#define __trace_mark(generic, channel, name, call_private, format, args...) \ - do { \ - DEFINE_MARKER(channel, name, format); \ - __mark_check_format(format, ## args); \ - if (!generic) { \ - if (unlikely(imv_read( \ - __mark_##channel##_##name.state))) \ - (*__mark_##channel##_##name.call) \ - (&__mark_##channel##_##name, \ - call_private, ®s, ## args); \ - } else { \ - if (unlikely(_imv_read( \ - __mark_##channel##_##name.state))) \ - (*__mark_##channel##_##name.call) \ - (&__mark_##channel##_##name, \ - call_private, ®s, ## args); \ - } \ - } while (0) - -#define __trace_mark_tp(channel, name, call_private, tp_name, tp_cb, \ - format, args...) \ - do { \ - void __check_tp_type(void) \ - { \ - register_trace_##tp_name(tp_cb); \ - } \ - DEFINE_MARKER_TP(channel, name, tp_name, tp_cb, format);\ - __mark_check_format(format, ## args); \ - (*__mark_##channel##_##name.call)(&__mark_##channel##_##name, \ - call_private, ®s, ## args); \ - } while (0) - -extern void marker_update_probe_range(struct marker *begin, - struct marker *end); - -#define GET_MARKER(channel, name) (__mark_##channel##_##name) - -#else /* !CONFIG_MARKERS */ -#define DEFINE_MARKER(channel, name, tp_name, tp_cb, format) -#define __trace_mark(generic, channel, name, call_private, format, args...) \ - __mark_check_format(format, ## args) -#define __trace_mark_tp(channel, name, call_private, tp_name, tp_cb, \ - format, args...) \ - do { \ - void __check_tp_type(void) \ - { \ - register_trace_##tp_name(tp_cb); \ - } \ - __mark_check_format(format, ## args); \ - } while (0) -static inline void marker_update_probe_range(struct marker *begin, - struct marker *end) -{ } -#define GET_MARKER(channel, name) -#endif /* CONFIG_MARKERS */ - -/** - * trace_mark - Marker using code patching - * @channel: marker channel (where to send the data), not quoted. - * @name: marker name, not quoted. - * @format: format string - * @args...: variable argument list - * - * Places a marker using optimized code patching technique (imv_read()) - * to be enabled when immediate values are present. - */ -#define trace_mark(channel, name, format, args...) \ - __trace_mark(0, channel, name, NULL, format, ## args) - -/** - * _trace_mark - Marker using variable read - * @channel: marker channel (where to send the data), not quoted. - * @name: marker name, not quoted. - * @format: format string - * @args...: variable argument list - * - * Places a marker using a standard memory read (_imv_read()) to be - * enabled. Should be used for markers in code paths where instruction - * modification based enabling is not welcome. (__init and __exit functions, - * lockdep, some traps, printk). - */ -#define _trace_mark(channel, name, format, args...) \ - __trace_mark(1, channel, name, NULL, format, ## args) - -/** - * trace_mark_tp - Marker in a tracepoint callback - * @channel: marker channel (where to send the data), not quoted. - * @name: marker name, not quoted. - * @tp_name: tracepoint name, not quoted. - * @tp_cb: tracepoint callback. Should have an associated global symbol so it - * is not optimized away by the compiler (should not be static). - * @format: format string - * @args...: variable argument list - * - * Places a marker in a tracepoint callback. - */ -#define trace_mark_tp(channel, name, tp_name, tp_cb, format, args...) \ - __trace_mark_tp(channel, name, NULL, tp_name, tp_cb, format, ## args) - -/** - * MARK_NOARGS - Format string for a marker with no argument. - */ -#define MARK_NOARGS " " - -extern void lock_markers(void); -extern void unlock_markers(void); - -extern void markers_compact_event_ids(void); - -/* To be used for string format validity checking with gcc */ -static inline void __printf(1, 2) ___mark_check_format(const char *fmt, ...) -{ -} - -#define __mark_check_format(format, args...) \ - do { \ - if (0) \ - ___mark_check_format(format, ## args); \ - } while (0) - -extern marker_probe_func __mark_empty_function; - -extern void marker_probe_cb(const struct marker *mdata, - void *call_private, struct registers *regs, ...); - -/* - * Connect a probe to a marker. - * private data pointer must be a valid allocated memory address, or NULL. - */ -extern int marker_probe_register(const char *channel, const char *name, - const char *format, marker_probe_func *probe, void *probe_private); - -/* - * Returns the private data given to marker_probe_register. - */ -extern int marker_probe_unregister(const char *channel, const char *name, - marker_probe_func *probe, void *probe_private); -/* - * Unregister a marker by providing the registered private data. - */ -extern int marker_probe_unregister_private_data(marker_probe_func *probe, - void *probe_private); - -extern void *marker_get_private_data(const char *channel, const char *name, - marker_probe_func *probe, int num); - -/* - * marker_synchronize_unregister must be called between the last marker probe - * unregistration and the first one of - * - the end of module exit function - * - the free of any resource used by the probes - * to ensure the code and data are valid for any possibly running probes. - */ -#define marker_synchronize_unregister() synchronize_sched() - -struct marker_iter { -//ust// struct module *module; - struct lib *lib; - struct marker *marker; -}; - -extern void marker_iter_start(struct marker_iter *iter); -extern void marker_iter_next(struct marker_iter *iter); -extern void marker_iter_stop(struct marker_iter *iter); -extern void marker_iter_reset(struct marker_iter *iter); -extern int marker_get_iter_range(struct marker **marker, struct marker *begin, - struct marker *end); - -extern void marker_update_process(void); -extern int is_marker_enabled(const char *channel, const char *name); - -//ust// #ifdef CONFIG_MARKERS_USERSPACE -//ust// extern void exit_user_markers(struct task_struct *p); -//ust// #else -//ust// static inline void exit_user_markers(struct task_struct *p) -//ust// { -//ust// } -//ust// #endif - -struct marker_addr { - struct marker *marker; - void *addr; -}; - -struct lib { - struct marker *markers_start; - struct marker_addr *markers_addr_start; - int markers_count; - struct list_head list; -}; - -extern int marker_register_lib(struct marker *markers_start, struct marker_addr *marker_addr_start, int markers_count); - -#define MARKER_LIB \ -extern struct marker __start___markers[] __attribute__((visibility("hidden"))); \ -extern struct marker __stop___markers[] __attribute__((visibility("hidden"))); \ -extern struct marker_addr __start___marker_addr[] __attribute__((visibility("hidden"))); \ -extern struct marker_addr __stop___marker_addr[] __attribute__((visibility("hidden"))); \ - \ -static void __attribute__((constructor)) __markers__init(void) \ -{ \ - DBG("next registration in "__FILE__"\n"); \ - marker_register_lib(__start___markers, __start___marker_addr, (((long)__stop___markers)-((long)__start___markers))/sizeof(struct marker)); \ -} - -extern void marker_set_new_marker_cb(void (*cb)(struct marker *)); -extern void init_markers(void); - -#endif diff --git a/libust/relay.c b/libust/relay.c index 0326adc..408ce90 100644 --- a/libust/relay.c +++ b/libust/relay.c @@ -22,7 +22,7 @@ //ust// #include //ust// #include //ust// #include -#include "kernelcompat.h" +#include #include #include #include diff --git a/libust/serialize.c b/libust/serialize.c index f9e45b6..beaf639 100644 --- a/libust/serialize.c +++ b/libust/serialize.c @@ -32,7 +32,7 @@ #include #include -#include "kernelcompat.h" +#include #define _LGPL_SOURCE #include #include diff --git a/libust/tracectl.c b/libust/tracectl.c index ed90257..e28b315 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -29,9 +29,9 @@ #include -#include "marker.h" +#include #include "tracer.h" -#include "localerr.h" +#include "usterr.h" #include "ustcomm.h" #include "relay.h" /* FIXME: remove */ #include "marker-control.h" diff --git a/libust/tracepoint.c b/libust/tracepoint.c index df94b2c..cc2adf1 100644 --- a/libust/tracepoint.c +++ b/libust/tracepoint.c @@ -32,8 +32,8 @@ #include -#include "kernelcompat.h" -#include "tracepoint.h" +#include +#include #include "usterr.h" //#include "list.h" diff --git a/libust/tracepoint.h b/libust/tracepoint.h deleted file mode 100644 index b1ee16d..0000000 --- a/libust/tracepoint.h +++ /dev/null @@ -1,213 +0,0 @@ -#ifndef _LINUX_TRACEPOINT_H -#define _LINUX_TRACEPOINT_H - -/* - * Copyright (C) 2008 Mathieu Desnoyers - * 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 - * - * Heavily inspired from the Linux Kernel Markers. - * - * Ported to userspace by Pierre-Marc Fournier. - */ - -//#include -//#include -//#include - -#define _LGPL_SOURCE -#include - -#include "immediate.h" -#include "kernelcompat.h" - -struct module; -struct tracepoint; - -struct tracepoint { - const char *name; /* Tracepoint name */ - DEFINE_IMV(char, state); /* State. */ - void **funcs; -} __attribute__((aligned(32))); /* - * Aligned on 32 bytes because it is - * globally visible and gcc happily - * align these on the structure size. - * Keep in sync with vmlinux.lds.h. - */ - -#define TPPROTO(args...) args -#define TPARGS(args...) args - -#define CONFIG_TRACEPOINTS -#ifdef CONFIG_TRACEPOINTS - -/* - * it_func[0] is never NULL because there is at least one element in the array - * when the array itself is non NULL. - */ -#define __DO_TRACE(tp, proto, args) \ - do { \ - void **it_func; \ - \ - rcu_read_lock(); /*ust rcu_read_lock_sched_notrace(); */ \ - it_func = rcu_dereference((tp)->funcs); \ - if (it_func) { \ - do { \ - ((void(*)(proto))(*it_func))(args); \ - } while (*(++it_func)); \ - } \ - rcu_read_unlock(); /*ust rcu_read_unlock_sched_notrace(); */ \ - } while (0) - -#define __CHECK_TRACE(name, generic, proto, args) \ - do { \ - if (!generic) { \ - if (unlikely(imv_read(__tracepoint_##name.state))) \ - __DO_TRACE(&__tracepoint_##name, \ - TPPROTO(proto), TPARGS(args)); \ - } else { \ - if (unlikely(_imv_read(__tracepoint_##name.state))) \ - __DO_TRACE(&__tracepoint_##name, \ - TPPROTO(proto), TPARGS(args)); \ - } \ - } while (0) - -/* - * Make sure the alignment of the structure in the __tracepoints section will - * not add unwanted padding between the beginning of the section and the - * structure. Force alignment to the same alignment as the section start. - * - * The "generic" argument, passed to the declared __trace_##name inline - * function controls which tracepoint enabling mechanism must be used. - * If generic is true, a variable read is used. - * If generic is false, immediate values are used. - */ -#define DECLARE_TRACE(name, proto, args) \ - extern struct tracepoint __tracepoint_##name; \ - static inline void trace_##name(proto) \ - { \ - __CHECK_TRACE(name, 0, TPPROTO(proto), TPARGS(args)); \ - } \ - static inline void _trace_##name(proto) \ - { \ - __CHECK_TRACE(name, 1, TPPROTO(proto), TPARGS(args)); \ - } \ - static inline int register_trace_##name(void (*probe)(proto)) \ - { \ - return tracepoint_probe_register(#name, (void *)probe); \ - } \ - static inline int unregister_trace_##name(void (*probe)(proto)) \ - { \ - return tracepoint_probe_unregister(#name, (void *)probe);\ - } - -#define DEFINE_TRACE(name) \ - static const char __tpstrtab_##name[] \ - __attribute__((section("__tracepoints_strings"))) = #name; \ - struct tracepoint __tracepoint_##name \ - __attribute__((section("__tracepoints"), aligned(32))) = \ - { __tpstrtab_##name, 0, NULL } - -#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \ - EXPORT_SYMBOL_GPL(__tracepoint_##name) -#define EXPORT_TRACEPOINT_SYMBOL(name) \ - EXPORT_SYMBOL(__tracepoint_##name) - -extern void tracepoint_update_probe_range(struct tracepoint *begin, - struct tracepoint *end); - -#else /* !CONFIG_TRACEPOINTS */ -#define DECLARE_TRACE(name, proto, args) \ - static inline void trace_##name(proto) \ - { } \ - static inline void _trace_##name(proto) \ - { } \ - static inline int register_trace_##name(void (*probe)(proto)) \ - { \ - return -ENOSYS; \ - } \ - static inline int unregister_trace_##name(void (*probe)(proto)) \ - { \ - return -ENOSYS; \ - } - -#define DEFINE_TRACE(name) -#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) -#define EXPORT_TRACEPOINT_SYMBOL(name) - -static inline void tracepoint_update_probe_range(struct tracepoint *begin, - struct tracepoint *end) -{ } -#endif /* CONFIG_TRACEPOINTS */ - -/* - * Connect a probe to a tracepoint. - * Internal API, should not be used directly. - */ -extern int tracepoint_probe_register(const char *name, void *probe); - -/* - * Disconnect a probe from a tracepoint. - * Internal API, should not be used directly. - */ -extern int tracepoint_probe_unregister(const char *name, void *probe); - -extern int tracepoint_probe_register_noupdate(const char *name, void *probe); -extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe); -extern void tracepoint_probe_update_all(void); - -struct tracepoint_iter { -//ust// struct module *module; - struct tracepoint_lib *lib; - struct tracepoint *tracepoint; -}; - -extern void tracepoint_iter_start(struct tracepoint_iter *iter); -extern void tracepoint_iter_next(struct tracepoint_iter *iter); -extern void tracepoint_iter_stop(struct tracepoint_iter *iter); -extern void tracepoint_iter_reset(struct tracepoint_iter *iter); -extern int tracepoint_get_iter_range(struct tracepoint **tracepoint, - struct tracepoint *begin, struct tracepoint *end); - -/* - * tracepoint_synchronize_unregister must be called between the last tracepoint - * probe unregistration and the end of module exit to make sure there is no - * caller executing a probe when it is freed. - */ -static inline void tracepoint_synchronize_unregister(void) -{ -//ust// synchronize_sched(); -} - -struct tracepoint_lib { - struct tracepoint *tracepoints_start; - int tracepoints_count; - struct list_head list; -}; - -extern int tracepoint_register_lib(struct tracepoint *tracepoints_start, - int tracepoints_count); - -#define TRACEPOINT_LIB \ - extern struct tracepoint __start___tracepoints[] __attribute__((visibility("hidden"))); \ - extern struct tracepoint __stop___tracepoints[] __attribute__((visibility("hidden"))); \ - static void __attribute__((constructor)) __tracepoints__init(void) \ - { \ - tracepoint_register_lib(__start___tracepoints, \ - (((long)__stop___tracepoints)-((long)__start___tracepoints))/sizeof(struct tracepoint)); \ - } - -#endif diff --git a/libust/tracer.c b/libust/tracer.c index 4150551..a3ace72 100644 --- a/libust/tracer.c +++ b/libust/tracer.c @@ -54,7 +54,7 @@ //ust// #include #include -#include "kernelcompat.h" +#include #include "tracercore.h" #include "tracer.h" #include "usterr.h" diff --git a/libust/tracer.h b/libust/tracer.h index b2ac930..502cdcc 100644 --- a/libust/tracer.h +++ b/libust/tracer.h @@ -27,12 +27,12 @@ #include #include //#include "list.h" -#include "kernelcompat.h" +#include #include "buffer.h" #include "relay.h" #include "channels.h" #include "tracercore.h" -#include "marker.h" +#include /* Number of bytes to log with a read/write event */ #define LTT_LOG_RW_SIZE 32L diff --git a/libust/tracercore.c b/libust/tracercore.c index 90adee4..652de1b 100644 --- a/libust/tracercore.c +++ b/libust/tracercore.c @@ -22,7 +22,7 @@ //ust// #include //ust// #include //ust// #include -#include "kernelcompat.h" +#include #include "tracercore.h" /* Traces structures */ diff --git a/libust/tracercore.h b/libust/tracercore.h index 8dfffa1..5a088db 100644 --- a/libust/tracercore.h +++ b/libust/tracercore.h @@ -21,7 +21,7 @@ #ifndef LTT_CORE_H #define LTT_CORE_H -#include "kernelcompat.h" +#include //ust// #include /* ltt's root dir in debugfs */ diff --git a/libustcomm/ustcomm.c b/libustcomm/ustcomm.c index 1b6843b..2bd86eb 100644 --- a/libustcomm/ustcomm.c +++ b/libustcomm/ustcomm.c @@ -31,7 +31,7 @@ #include #include "ustcomm.h" -#include "localerr.h" +#include "usterr.h" #define UNIX_PATH_MAX 108 diff --git a/share/kernelcompat.h b/share/kernelcompat.h deleted file mode 100644 index 5cc5eaa..0000000 --- a/share/kernelcompat.h +++ /dev/null @@ -1,206 +0,0 @@ -#ifndef KERNELCOMPAT_H -#define KERNELCOMPAT_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); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - -#define KERN_DEBUG "" -#define KERN_NOTICE "" -#define KERN_INFO "" -#define KERN_ERR "" -#define KERN_ALERT "" -#define KERN_WARNING "" - -/* 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 */ - -#include - -#define kmalloc(s, t) malloc(s) -#define kzalloc(s, t) zmalloc(s) -#define kfree(p) free((void *)p) -#define kstrdup(s, t) strdup(s) - -#define zmalloc(s) calloc(1, s) - -#define GFP_KERNEL - -/* PRINTK */ - -#include -#define printk(fmt, args...) printf(fmt, ## args) - - -/* ATTRIBUTES */ - -#define ____cacheline_aligned - -/* MATH */ - -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 fls(int x) -{ - int r; -//ust// #ifdef CONFIG_X86_CMOV - asm("bsrl %1,%0\n\t" - "cmovzl %2,%0" - : "=&r" (r) : "rm" (x), "rm" (-1)); -//ust// #else -//ust// asm("bsrl %1,%0\n\t" -//ust// "jnz 1f\n\t" -//ust// "movl $-1,%0\n" -//ust// "1:" : "=r" (r) : "rm" (x)); -//ust// #endif - return r + 1; -} - -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 - -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/share/localerr.h b/share/localerr.h deleted file mode 100644 index eef0d4f..0000000 --- a/share/localerr.h +++ /dev/null @@ -1 +0,0 @@ -#include "usterr.h" diff --git a/share/share.h b/share/share.h deleted file mode 100644 index f674f31..0000000 --- a/share/share.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef UST_SHARE_H -#define UST_SHARE_H - -#include -#include - -/* This write is patient because it restarts if it was incomplete. - */ - -static inline ssize_t patient_write(int fd, const void *buf, size_t count) -{ - const char *bufc = (const char *) buf; - int result; - - for(;;) { - result = write(fd, bufc, count); - if(result == -1 && errno == EINTR) { - continue; - } - if(result <= 0) { - return result; - } - count -= result; - bufc += result; - - if(count == 0) { - break; - } - } - - return bufc-(const char *)buf; -} - -#endif /* UST_SHARE_H */ diff --git a/share/usterr.h b/share/usterr.h deleted file mode 100644 index 1819f97..0000000 --- a/share/usterr.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef USTERR_H -#define USTERR_H - -#include -#include -#include -#include -#include - -#include "share.h" - -#ifndef UST_COMPONENT -//#error UST_COMPONENT is undefined -#define UST_COMPONENT libust -#endif - -/* To stringify the expansion of a define */ -#define XSTR(d) STR(d) -#define STR(s) #s - -/* We sometimes print in the tracing path, and tracing can occur in - * signal handlers, so we must use a print method which is signal safe. - */ - -#define sigsafe_print_err(fmt, args...) \ -{ \ - /* Can't use dynamic allocation. Limit ourselves to 250 chars. */ \ - char ____buf[250]; \ - int ____saved_errno; \ -\ - /* Save the errno. */ \ - ____saved_errno = errno; \ -\ - snprintf(____buf, sizeof(____buf), fmt, ## args); \ -\ - /* Add end of string in case of buffer overflow. */ \ - ____buf[sizeof(____buf)-1] = 0; \ -\ - patient_write(STDERR_FILENO, ____buf, strlen(____buf)); \ - /* Can't print errors because we are in the error printing code path. */ \ -\ - /* Restore errno, in order to be async-signal safe. */ \ - errno = ____saved_errno; \ -} - -#define UST_STR_COMPONENT XSTR(UST_COMPONENT) - -#define ERRMSG(fmt, args...) do { sigsafe_print_err(UST_STR_COMPONENT "[%ld/%ld]: " fmt " (" __FILE__ ":" XSTR(__LINE__) ")\n", (long) getpid(), (long) syscall(SYS_gettid), ## args); fflush(stderr); } while(0) - -#define DEBUG -#ifdef DEBUG -# define DBG(fmt, args...) ERRMSG(fmt, ## args) -#else -# define DBG(fmt, args...) do {} while(0) -#endif -#define WARN(fmt, args...) ERRMSG("Warning: " fmt, ## args) -#define ERR(fmt, args...) ERRMSG("Error: " fmt, ## args) -#define BUG(fmt, args...) ERRMSG("BUG: " fmt, ## args) - -#if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE) -#define PERROR(call, args...)\ - do { \ - char buf[200] = "Error in strerror_r()"; \ - strerror_r(errno, buf, sizeof(buf)); \ - ERRMSG("Error: " call ": %s", ## args, buf); \ - } while(0); -#else -#define PERROR(call, args...)\ - do { \ - char *buf; \ - char tmp[200]; \ - buf = strerror_r(errno, tmp, sizeof(tmp)); \ - ERRMSG("Error: " call ": %s", ## args, buf); \ - } while(0); -#endif - -#define BUG_ON(condition) do { if (unlikely(condition)) ERR("condition not respected (BUG)"); } while(0) -#define WARN_ON(condition) do { if (unlikely(condition)) WARN("condition not respected on line %s:%d", __FILE__, __LINE__); } while(0) - -#endif /* USTERR_H */ diff --git a/tests/basic/Makefile.am b/tests/basic/Makefile.am index 669cb82..4945cdf 100644 --- a/tests/basic/Makefile.am +++ b/tests/basic/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust +AM_CPPFLAGS = -I$(top_builddir)/include noinst_PROGRAMS = basic basic_SOURCES = basic.c diff --git a/tests/basic/basic.c b/tests/basic/basic.c index a5ceff3..c1fa806 100644 --- a/tests/basic/basic.c +++ b/tests/basic/basic.c @@ -1,8 +1,7 @@ #include #include -#include "marker.h" - +#include int main() { diff --git a/tests/basic_long/Makefile.am b/tests/basic_long/Makefile.am index a6e0f7c..00b5ec6 100644 --- a/tests/basic_long/Makefile.am +++ b/tests/basic_long/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust +AM_CPPFLAGS = -I$(top_builddir)/include noinst_PROGRAMS = basic_long basic_long_SOURCES = basic_long.c diff --git a/tests/basic_long/basic_long.c b/tests/basic_long/basic_long.c index 29f26ef..803d7ea 100644 --- a/tests/basic_long/basic_long.c +++ b/tests/basic_long/basic_long.c @@ -1,8 +1,7 @@ #include #include -#include "marker.h" - +#include int main() { diff --git a/tests/fork/Makefile.am b/tests/fork/Makefile.am index 86a1a79..7bbef71 100644 --- a/tests/fork/Makefile.am +++ b/tests/fork/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust +AM_CPPFLAGS = -I$(top_builddir)/include noinst_PROGRAMS = fork fork2 fork_SOURCES = fork.c diff --git a/tests/fork/fork.c b/tests/fork/fork.c index 677261b..241ef81 100644 --- a/tests/fork/fork.c +++ b/tests/fork/fork.c @@ -2,8 +2,7 @@ #include #include -#include "marker.h" - +#include int main(int argc, char **argv, char *env[]) { diff --git a/tests/fork/fork2.c b/tests/fork/fork2.c index 7d0dda7..63659c4 100644 --- a/tests/fork/fork2.c +++ b/tests/fork/fork2.c @@ -1,7 +1,7 @@ #include #include -#include "marker.h" +#include int main() { diff --git a/tests/hello/Makefile.am b/tests/hello/Makefile.am index bef643d..ce0ad2f 100644 --- a/tests/hello/Makefile.am +++ b/tests/hello/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust +AM_CPPFLAGS = -I$(top_builddir)/include noinst_PROGRAMS = hello hello_SOURCES = hello.c tp.c tp.h diff --git a/tests/hello/hello.c b/tests/hello/hello.c index 0417f1e..c48b6df 100644 --- a/tests/hello/hello.c +++ b/tests/hello/hello.c @@ -7,11 +7,8 @@ #include #include -#include "marker.h" +#include #include "usterr.h" -#include "tracer.h" -#include "marker-control.h" -#include "relay.h" #include "tp.h" diff --git a/tests/hello/tp.c b/tests/hello/tp.c index 2ee7392..e3d6761 100644 --- a/tests/hello/tp.c +++ b/tests/hello/tp.c @@ -1,5 +1,5 @@ #include "tp.h" -#include "marker.h" +#include #include "usterr.h" DEFINE_TRACE(hello_tptest); diff --git a/tests/hello/tp.h b/tests/hello/tp.h index 6064283..ea401e1 100644 --- a/tests/hello/tp.h +++ b/tests/hello/tp.h @@ -1,4 +1,4 @@ -#include "tracepoint.h" +#include DECLARE_TRACE(hello_tptest, TPPROTO(int anint), diff --git a/tests/hello2/Makefile.am b/tests/hello2/Makefile.am index 8c3aad1..e06d505 100644 --- a/tests/hello2/Makefile.am +++ b/tests/hello2/Makefile.am @@ -1,4 +1,4 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust +AM_CPPFLAGS = -I$(top_builddir)/include noinst_PROGRAMS = hello2 hello2_SOURCES = hello2.c diff --git a/tests/hello2/hello2.c b/tests/hello2/hello2.c index bd3856c..17e478c 100644 --- a/tests/hello2/hello2.c +++ b/tests/hello2/hello2.c @@ -2,7 +2,8 @@ #include #include -#include "marker.h" +#include + int main() { int i; diff --git a/ustctl/Makefile.am b/ustctl/Makefile.am index a27880a..93c5629 100644 --- a/ustctl/Makefile.am +++ b/ustctl/Makefile.am @@ -1,8 +1,7 @@ +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_builddir)/libustcomm \ + -I$(top_builddir)/libustcmd $(KCOMPAT_CFLAGS) + bin_PROGRAMS = ustctl -ustctl_SOURCES = ustctl.c $(top_builddir)/libustcomm/ustcomm.c $(top_builddir)/libustcomm/ustcomm.h $(top_builddir)/libustcmd/ustcmd.c $(top_builddir)/libustcmd/ustcmd.h $(top_builddir)/share/usterr.h +ustctl_SOURCES = ustctl.c $(top_builddir)/libustcomm/ustcomm.c $(top_builddir)/libustcomm/ustcomm.h $(top_builddir)/libustcmd/ustcmd.c $(top_builddir)/libustcmd/ustcmd.h ustctl_CFLAGS = -DUST_COMPONENT=ustctl -INCLUDES = $(KCOMPAT_CFLAGS) -INCLUDES += -I$(top_builddir)/libustcomm -INCLUDES += -I$(top_builddir)/libustcmd -INCLUDES += -I$(top_builddir)/share diff --git a/ustd/Makefile.am b/ustd/Makefile.am index df49a82..8c8fe64 100644 --- a/ustd/Makefile.am +++ b/ustd/Makefile.am @@ -1,7 +1,7 @@ -INCLUDES = -I$(top_builddir)/share -I$(top_builddir)/libust \ - -I$(top_builddir)/libustcomm +AM_CPPFLAGS = -I$(top_builddir)/libust -I$(top_builddir)/libustcomm \ + -I$(top_builddir)/include bin_PROGRAMS = ustd -ustd_SOURCES = lowlevel.c ustd.c ustd.h $(top_builddir)/libustcomm/ustcomm.c $(top_builddir)/libustcomm/ustcomm.h $(top_builddir)/share/usterr.h +ustd_SOURCES = lowlevel.c ustd.c ustd.h $(top_builddir)/libustcomm/ustcomm.c $(top_builddir)/libustcomm/ustcomm.h ustd_LDFLAGS = -lpthread ustd_CFLAGS = -DUST_COMPONENT=ustd diff --git a/ustd/lowlevel.c b/ustd/lowlevel.c index 3509bf5..6a91acc 100644 --- a/ustd/lowlevel.c +++ b/ustd/lowlevel.c @@ -19,7 +19,7 @@ #include "tracer.h" #include "ustd.h" -#include "localerr.h" +#include "usterr.h" /* This truncates to an offset in the buffer. */ #define USTD_BUFFER_TRUNC(offset, bufinfo) \ diff --git a/ustd/ustd.c b/ustd/ustd.c index 858bdf5..bfa6352 100644 --- a/ustd/ustd.c +++ b/ustd/ustd.c @@ -33,9 +33,8 @@ #include #include "ustd.h" -#include "localerr.h" +#include "usterr.h" #include "ustcomm.h" -#include "share.h" /* return value: 0 = subbuffer is finished, it won't produce data anymore * 1 = got subbuffer successfully