Merge branch 'for-pierre-marc' of git://git.infradead.org/users/jblunck/ust
authorPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 27 Oct 2009 22:58:15 +0000 (18:58 -0400)
committerPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 27 Oct 2009 22:58:15 +0000 (18:58 -0400)
Fixed conflicts:
include/ust/marker.h

52 files changed:
Makefile.am
configure.ac
include/Makefile.am [new file with mode: 0644]
include/share.h [new file with mode: 0644]
include/ust/immediate.h [new file with mode: 0644]
include/ust/kernelcompat.h [new file with mode: 0644]
include/ust/marker.h [new file with mode: 0644]
include/ust/tracepoint.h [new file with mode: 0644]
include/usterr.h [new file with mode: 0644]
java/Makefile.am
libinterfork/Makefile.am
libinterfork/interfork.c
libmallocwrap/Makefile.am
libmallocwrap/mallocwrap.c
libust/Makefile.am
libust/channels.c
libust/channels.h
libust/immediate.h [deleted file]
libust/marker-control.c
libust/marker.c
libust/marker.h [deleted file]
libust/relay.c
libust/serialize.c
libust/tracectl.c
libust/tracepoint.c
libust/tracepoint.h [deleted file]
libust/tracer.c
libust/tracer.h
libust/tracercore.c
libust/tracercore.h
libustcomm/ustcomm.c
share/kernelcompat.h [deleted file]
share/localerr.h [deleted file]
share/share.h [deleted file]
share/usterr.h [deleted file]
tests/basic/Makefile.am
tests/basic/basic.c
tests/basic_long/Makefile.am
tests/basic_long/basic_long.c
tests/fork/Makefile.am
tests/fork/fork.c
tests/fork/fork2.c
tests/hello/Makefile.am
tests/hello/hello.c
tests/hello/tp.c
tests/hello/tp.h
tests/hello2/Makefile.am
tests/hello2/hello2.c
ustctl/Makefile.am
ustd/Makefile.am
ustd/lowlevel.c
ustd/ustd.c

index 33be5b49a47bc2cc804571418b750271554e7c2f..1bdedea2118f695c470d052f51b8d7bccfc76532 100644 (file)
@@ -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
index 070093bbcea7e6f919f1be949e59bb200a06b998..1070e2684cbe2d075479e490ca383fa85eae1f47 100644 (file)
@@ -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 (file)
index 0000000..48a898b
--- /dev/null
@@ -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 (file)
index 0000000..f674f31
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef UST_SHARE_H
+#define UST_SHARE_H
+
+#include <unistd.h>
+#include <errno.h>
+
+/* 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 (file)
index 0000000..1b117cf
--- /dev/null
@@ -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 <mathieu.desnoyers@polymtl.ca>
+ *
+ * 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 <asm/immediate.h>
+
+/**
+ * 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 (file)
index 0000000..5cc5eaa
--- /dev/null
@@ -0,0 +1,206 @@
+#ifndef KERNELCOMPAT_H
+#define KERNELCOMPAT_H
+
+#include <kcompat.h>
+
+#include <string.h>
+#include <sys/time.h>
+
+/* 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 <pthread.h>
+
+#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 <stdlib.h>
+
+#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 <stdio.h>
+#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 <unistd.h>
+
+#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 (file)
index 0000000..5c7d1b3
--- /dev/null
@@ -0,0 +1,328 @@
+/*
+ * Code markup for dynamic and static tracing.
+ *
+ * See Documentation/marker.txt.
+ *
+ * (C) Copyright 2006 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ * (C) Copyright 2009 Pierre-Marc Fournier <pierre-marc dot fournier at polymtl dot ca>
+ *
+ * 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 <stdarg.h>
+//ust// #include <linux/types.h>
+#include <ust/immediate.h>
+//ust// #include <linux/ltt-channels.h>
+#include <ust/kernelcompat.h>
+#include <kcompat/list.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(&regs)
+
+
+
+#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, &regs, ## args);          \
+               } else {                                                \
+                       if (unlikely(_imv_read(                         \
+                                       __mark_##channel##_##name.state))) \
+                               (*__mark_##channel##_##name.call)       \
+                                       (&__mark_##channel##_##name,    \
+                                       call_private, &regs, ## 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, &regs, ## 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 (file)
index 0000000..56c62b0
--- /dev/null
@@ -0,0 +1,213 @@
+#ifndef _LINUX_TRACEPOINT_H
+#define _LINUX_TRACEPOINT_H
+
+/*
+ * Copyright (C) 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ * 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 <linux/immediate.h>
+//#include <linux/types.h>
+//#include <linux/rcupdate.h>
+
+#define _LGPL_SOURCE
+#include <urcu-bp.h>
+
+#include <ust/immediate.h>
+#include <ust/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/include/usterr.h b/include/usterr.h
new file mode 100644 (file)
index 0000000..1819f97
--- /dev/null
@@ -0,0 +1,80 @@
+#ifndef USTERR_H
+#define USTERR_H
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <errno.h>
+#include <stdarg.h>
+
+#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 */
index f9deb7acfe289b75377534fd3a8f816ef168301f..fa536287827edd13db88a8bc8d0209309a92ba7e 100644 (file)
@@ -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
index 2bcebb115a3769ccfa74255ab93278970f50ef63..6540103badc7990f0cd0ea1502a69925f1654043 100644 (file)
@@ -1,3 +1,5 @@
+AM_CPPFLAGS = -I$(top_builddir)/include
+
 lib_LTLIBRARIES = libinterfork.la
 libinterfork_la_SOURCES = interfork.c
 libinterfork_la_LIBADD = -ldl
index 26a8bd6ad9f314525b6cc9b079d0fb03fd295ef5..e9dce9bfb188d7f60032d04a5f2b9d9dfd5f9f2b 100644 (file)
@@ -20,7 +20,7 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <signal.h>
-#include "share/usterr.h"
+#include "usterr.h"
 
 extern void ust_fork(void);
 extern void ust_potential_exec(void);
index 1f7dad3979e0ef03b1d8ea7d3c0bbc9d82953cfa..23b7004e6219e5acb772b59bb31f787fba4fb45c 100644 (file)
@@ -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
index d505b6773536d7d827f7b8e554136ec5900b6801..be1f39ed3cb4bda8c1a2bb7381e127f188a6ed91 100644 (file)
@@ -20,7 +20,7 @@
 #include <sys/types.h>
 #include <stdio.h>
 
-#include "marker.h"
+#include <ust/marker.h>
 
 #if 0
 INTERCEPT_PROTOTYPE(void, malloc, size_t size)
index 1aec7b3177bba643f7991d69b9729b73b95048ab..9ee3c9a21d2dee898b4599df9fdbd9f1eca3eaa5 100644 (file)
@@ -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"
index 10ab587cb6ca969ad5669333e40b6cce75319de6..27ceefc6d6a1cd7921ebb09f91c6d585615348e3 100644 (file)
 //ust// #include <linux/mutex.h>
 //ust// #include <linux/vmalloc.h>
 
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 #include "channels.h"
 #include "usterr.h"
-#include "marker.h"
+#include <ust/marker.h>
 
 /*
  * ltt_channel_mutex may be nested inside the LTT trace mutex.
index c91874b5c5cc23284ef4a698cc19d45dd8d49113..e460e12b916f0faa9ad58634ae180fa791db2a2e 100644 (file)
@@ -26,7 +26,7 @@
 //ust// #include <linux/list.h>
 #include <errno.h>
 
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 #include <kcompat/kref.h>
 
 #define EVENTS_PER_CHANNEL     65536
diff --git a/libust/immediate.h b/libust/immediate.h
deleted file mode 100644 (file)
index 1b117cf..0000000
+++ /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 <mathieu.desnoyers@polymtl.ca>
- *
- * 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 <asm/immediate.h>
-
-/**
- * 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
index f064316186055fac620d5ee6a2dc61a892b2ddb8..a0786bad6fb306af26c8c1c300b01d5f2526f1db 100644 (file)
 //ust// #include <linux/slab.h>
 #include <ctype.h>
 
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 //#include "list.h"
 #include "tracer.h"
-#include "localerr.h"
+#include "usterr.h"
 
 #define DEFAULT_CHANNEL "cpu"
 #define DEFAULT_PROBE "default"
index d4514f11a4f5faf4e34291c0839b4300c421c8f0..b543b166bcd52bd26928da736f69481e9b73c03d 100644 (file)
@@ -33,9 +33,9 @@
 #define _LGPL_SOURCE
 #include <urcu-bp.h>
 
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 
-#include "marker.h"
+#include <ust/marker.h>
 #include "usterr.h"
 #include "channels.h"
 #include "tracercore.h"
diff --git a/libust/marker.h b/libust/marker.h
deleted file mode 100644 (file)
index da3d30c..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Code markup for dynamic and static tracing.
- *
- * See Documentation/marker.txt.
- *
- * (C) Copyright 2006 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- * (C) Copyright 2009 Pierre-Marc Fournier <pierre-marc dot fournier at polymtl dot ca>
- *
- * 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 <stdarg.h>
-//ust// #include <linux/types.h>
-#include "immediate.h"
-//ust// #include <linux/ltt-channels.h>
-#include "kernelcompat.h"
-#include <kcompat/list.h>
-#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(&regs)
-
-
-
-#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, &regs, ## args);          \
-               } else {                                                \
-                       if (unlikely(_imv_read(                         \
-                                       __mark_##channel##_##name.state))) \
-                               (*__mark_##channel##_##name.call)       \
-                                       (&__mark_##channel##_##name,    \
-                                       call_private, &regs, ## 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, &regs, ## 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
index 0326adc119943240fd9957659af8bf2a0ea1b790..408ce906f82c7f0262d71c2ea59270790f82b052 100644 (file)
@@ -22,7 +22,7 @@
 //ust// #include <linux/cpu.h>
 //ust// #include <linux/splice.h>
 //ust// #include <linux/bitops.h>
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 #include <sys/mman.h>
 #include <sys/ipc.h>
 #include <sys/shm.h>
index f9e45b60751ed8060640d004df92f19d7ef4dec8..beaf6390b544a4dd96f0b4c30afdb0692283435f 100644 (file)
@@ -32,7 +32,7 @@
 #include <string.h>
 #include <stdint.h>
 
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 #define _LGPL_SOURCE
 #include <urcu-bp.h>
 #include <urcu/rculist.h>
index ed902574987cfa4cefceb7f53ea352dca787f35f..e28b3159d73c1408b58b072850f2bb89a45d59eb 100644 (file)
@@ -29,9 +29,9 @@
 
 #include <urcu-bp.h>
 
-#include "marker.h"
+#include <ust/marker.h>
 #include "tracer.h"
-#include "localerr.h"
+#include "usterr.h"
 #include "ustcomm.h"
 #include "relay.h" /* FIXME: remove */
 #include "marker-control.h"
index df94b2cb4c15e7acc091a410de0265251ea52083..cc2adf15e8e8c7ded54281be445528ac4086dcc0 100644 (file)
@@ -32,8 +32,8 @@
 
 #include <errno.h>
 
-#include "kernelcompat.h"
-#include "tracepoint.h"
+#include <ust/kernelcompat.h>
+#include <ust/tracepoint.h>
 #include "usterr.h"
 //#include "list.h"
 
diff --git a/libust/tracepoint.h b/libust/tracepoint.h
deleted file mode 100644 (file)
index b1ee16d..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-#ifndef _LINUX_TRACEPOINT_H
-#define _LINUX_TRACEPOINT_H
-
-/*
- * Copyright (C) 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- * 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 <linux/immediate.h>
-//#include <linux/types.h>
-//#include <linux/rcupdate.h>
-
-#define _LGPL_SOURCE
-#include <urcu-bp.h>
-
-#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
index 4150551af9efb09a028878a3eb4b19116a4441d8..a3ace72c0811de72d9cf08824dfab2137f80f229 100644 (file)
@@ -54,7 +54,7 @@
 //ust// #include <asm/atomic.h>
 #include <urcu/rculist.h>
 
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 #include "tracercore.h"
 #include "tracer.h"
 #include "usterr.h"
index b2ac930293badb95aaef2e66430fb847b5030f4c..502cdcce436b763e4ba06c7a6cfe00c55e6a54ed 100644 (file)
 #include <sys/types.h>
 #include <stdarg.h>
 //#include "list.h"
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 #include "buffer.h"
 #include "relay.h"
 #include "channels.h"
 #include "tracercore.h"
-#include "marker.h"
+#include <ust/marker.h>
 
 /* Number of bytes to log with a read/write event */
 #define LTT_LOG_RW_SIZE                        32L
index 90adee45b42c6734693356504b59926862bfbc4a..652de1b1eb4f67592bc4122e3dc326aff3d37c20 100644 (file)
@@ -22,7 +22,7 @@
 //ust// #include <linux/percpu.h>
 //ust// #include <linux/module.h>
 //ust// #include <linux/debugfs.h>
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 #include "tracercore.h"
 
 /* Traces structures */
index 8dfffa13f2c0750ca2d9b9a0bf5e739bb9479a3e..5a088db65e4e2c5c4e81ec91ecb640da7897aed5 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef LTT_CORE_H
 #define LTT_CORE_H
 
-#include "kernelcompat.h"
+#include <ust/kernelcompat.h>
 //ust// #include <linux/percpu.h>
 
 /* ltt's root dir in debugfs */
index 1b6843bf7d4879df38a57c946bd095d5cfd29f22..2bd86eb728442c2713f74cd24a30766706d731c8 100644 (file)
@@ -31,7 +31,7 @@
 #include <execinfo.h>
 
 #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 (file)
index 5cc5eaa..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-#ifndef KERNELCOMPAT_H
-#define KERNELCOMPAT_H
-
-#include <kcompat.h>
-
-#include <string.h>
-#include <sys/time.h>
-
-/* 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 <pthread.h>
-
-#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 <stdlib.h>
-
-#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 <stdio.h>
-#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 <unistd.h>
-
-#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 (file)
index eef0d4f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "usterr.h"
diff --git a/share/share.h b/share/share.h
deleted file mode 100644 (file)
index f674f31..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef UST_SHARE_H
-#define UST_SHARE_H
-
-#include <unistd.h>
-#include <errno.h>
-
-/* 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 (file)
index 1819f97..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef USTERR_H
-#define USTERR_H
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/syscall.h>
-#include <errno.h>
-#include <stdarg.h>
-
-#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 */
index 669cb8267efa3ce2a554e7204016f02286691e9e..4945cdf15764254bcdb3ccc84dfe3b5a77daf234 100644 (file)
@@ -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
index a5ceff3639a6eab106ed945a1fd6a3212d3071e9..c1fa806903f3860a8ff0b975dd302468ff91d138 100644 (file)
@@ -1,8 +1,7 @@
 #include <stdio.h>
 #include <unistd.h>
 
-#include "marker.h"
-
+#include <ust/marker.h>
 
 int main()
 {
index a6e0f7c502b93010d4b95970ab78f258d29f6b78..00b5ec618a40d98a3e75d08afd92728be65cda93 100644 (file)
@@ -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
index 29f26ef9a5ee804b132fed5bc370eca6214c631a..803d7ea6c1603db5a9eec17f32827076a4685a3d 100644 (file)
@@ -1,8 +1,7 @@
 #include <stdio.h>
 #include <unistd.h>
 
-#include "marker.h"
-
+#include <ust/marker.h>
 
 int main()
 {
index 86a1a798a9a9d27aaa99d5a3da59cbad85b8bb41..7bbef71d5b2699b6adab4ff7264a2b3dff472907 100644 (file)
@@ -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
index 677261b17d7c7d03eb91d655f9052450307a42f7..241ef8121484f065cd7b56fcd5816416f2dc366e 100644 (file)
@@ -2,8 +2,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 
-#include "marker.h"
-
+#include <ust/marker.h>
 
 int main(int argc, char **argv, char *env[])
 {
index 7d0dda7dc2224fa89f573e3b735485e8fb08c7c0..63659c47342aea16ee1766e821187662653f873b 100644 (file)
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <unistd.h>
 
-#include "marker.h"
+#include <ust/marker.h>
 
 int main()
 {
index bef643db2bbed61c99ec7f8b75f5d359299ecc2e..ce0ad2fe86d1af397482f6cb9bfabe42650ca17d 100644 (file)
@@ -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
index 0417f1e962215807ef1f590314b01167e7b14b85..c48b6df53359474c1410323bbf3f4a3631766093 100644 (file)
@@ -7,11 +7,8 @@
 #include <fcntl.h>
 #include <signal.h>
 
-#include "marker.h"
+#include <ust/marker.h>
 #include "usterr.h"
-#include "tracer.h"
-#include "marker-control.h"
-#include "relay.h"
 #include "tp.h"
 
 
index 2ee7392b192f3aee81b602b313219682dfaea1d4..e3d67618866e04e32f3e75ec3b0e07849f4e8697 100644 (file)
@@ -1,5 +1,5 @@
 #include "tp.h"
-#include "marker.h"
+#include <ust/marker.h>
 #include "usterr.h"
 
 DEFINE_TRACE(hello_tptest);
index 6064283b068d43070ed0002406378591939794a9..ea401e11b29d9a4a440286edd50f3a1a6c4b50e1 100644 (file)
@@ -1,4 +1,4 @@
-#include "tracepoint.h"
+#include <ust/tracepoint.h>
 
 DECLARE_TRACE(hello_tptest,
              TPPROTO(int anint),
index 8c3aad1e7650ed6538713462a7834f3b5a19ab58..e06d50592c8539b7ec4c29298ca1d22063906e13 100644 (file)
@@ -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
index bd3856cb810039036415cd0b45f82bc338e3feae..17e478cfe4ed8bddda83bafff741e14878046536 100644 (file)
@@ -2,7 +2,8 @@
 #include <time.h>
 #include <errno.h>
 
-#include "marker.h"
+#include <ust/marker.h>
+
 int main()
 {
        int i;
index a27880a03404ae3dd7642ac77ab9a4b3fd552720..93c5629c98b5a7c501a0c4ec69fbfcf5f38c9e43 100644 (file)
@@ -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
index df49a82083e4f81e56614ab14accd60ac3c950ae..8c8fe647ab328b67d06069c39df1a1e86c9d9cae 100644 (file)
@@ -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
index 3509bf58799ab932d27d0618dcae002477ab5084..6a91accbb5bac43c7a55f0233fd447c473338461 100644 (file)
@@ -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) \
index 858bdf52b46c9e21ac6bab46e358ff016c117505..bfa6352e1ccf2b4063660ff279b007f29ec3702a 100644 (file)
@@ -33,9 +33,8 @@
 #include <getopt.h>
 
 #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
This page took 0.061204 seconds and 4 git commands to generate.