From f218ff2821b494cf7b0fc3978e944070ad418772 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 17 Feb 2011 13:25:52 -0500 Subject: [PATCH] tracepoints: export pointer array Fixes odd alignment issues between linker and compiler, caused by compiler using larger alignment values than expected for structures -- and the linker adding unexpected padding within the sections. Use the same technique recently introduced for Linux kernel tracepoints. Signed-off-by: Mathieu Desnoyers --- include/ust/tracepoint.h | 44 +++++++++++++++++++--------------------- libust/tracepoint.c | 34 +++++++++++++++---------------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/include/ust/tracepoint.h b/include/ust/tracepoint.h index 1d286a0..05e5c11 100644 --- a/include/ust/tracepoint.h +++ b/include/ust/tracepoint.h @@ -42,12 +42,7 @@ struct tracepoint { const char *name; /* Tracepoint name */ DEFINE_IMV(char, state); /* State. */ struct probe *probes; -} __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 PARAMS(args...) args @@ -128,18 +123,21 @@ struct tracepoint { data); \ } -#define DEFINE_TRACE_FN(name, reg, unreg) \ +#define DEFINE_TRACE_FN(name, reg, unreg) \ static const char __tpstrtab_##name[] \ __attribute__((section("__tracepoints_strings"))) = #name; \ struct tracepoint __tracepoint_##name \ - __attribute__((section("__tracepoints"), aligned(32))) = \ - { __tpstrtab_##name, 0, NULL } + __attribute__((section("__tracepoints"))) = \ + { __tpstrtab_##name, 0, NULL }; \ + static struct tracepoint * const __tracepoint_ptr_##name \ + __attribute__((used, section("__tracepoints_ptrs"))) = \ + &__tracepoint_##name; #define DEFINE_TRACE(name) \ - DEFINE_TRACE_FN(name, NULL, NULL); + DEFINE_TRACE_FN(name, NULL, NULL) -extern void tracepoint_update_probe_range(struct tracepoint *begin, - struct tracepoint *end); +extern void tracepoint_update_probe_range(struct tracepoint * const *begin, + struct tracepoint * const *end); #else /* !CONFIG_TRACEPOINTS */ #define __DECLARE_TRACE(name, proto, args) \ @@ -147,11 +145,11 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin, { } \ static inline void _trace_##name(proto) \ { } \ - static inline int register_trace_##name(void (*probe)(proto)) \ + static inline int register_trace_##name(void (*probe)(proto), void *data) \ { \ return -ENOSYS; \ } \ - static inline int unregister_trace_##name(void (*probe)(proto)) \ + static inline int unregister_trace_##name(void (*probe)(proto), void *data) \ { \ return -ENOSYS; \ } @@ -191,15 +189,15 @@ extern void tracepoint_probe_update_all(void); struct tracepoint_iter { //ust// struct module *module; struct tracepoint_lib *lib; - struct tracepoint *tracepoint; + struct tracepoint * const *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); +extern int tracepoint_get_iter_range(struct tracepoint * const **tracepoint, + struct tracepoint * const *begin, struct tracepoint * const *end); /* * tracepoint_synchronize_unregister must be called between the last tracepoint @@ -212,22 +210,22 @@ static inline void tracepoint_synchronize_unregister(void) } struct tracepoint_lib { - struct tracepoint *tracepoints_start; + struct tracepoint * const *tracepoints_start; int tracepoints_count; struct cds_list_head list; }; -extern int tracepoint_register_lib(struct tracepoint *tracepoints_start, +extern int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tracepoints_count); -extern int tracepoint_unregister_lib(struct tracepoint *tracepoints_start); +extern int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_start); #define TRACEPOINT_LIB \ - extern struct tracepoint __start___tracepoints[] __attribute__((weak, visibility("hidden"))); \ - extern struct tracepoint __stop___tracepoints[] __attribute__((weak, visibility("hidden"))); \ + extern struct tracepoint * const __start___tracepoints[] __attribute__((weak, visibility("hidden"))); \ + extern struct tracepoint * const __stop___tracepoints[] __attribute__((weak, visibility("hidden"))); \ static void __attribute__((constructor)) __tracepoints__init(void) \ { \ tracepoint_register_lib(__start___tracepoints, \ - (((long)__stop___tracepoints)-((long)__start___tracepoints))/sizeof(struct tracepoint)); \ + (((long)__stop___tracepoints)-((long)__start___tracepoints)) / sizeof(*__start___tracepoints)); \ } \ \ static void __attribute__((destructor)) __tracepoints__destroy(void) \ diff --git a/libust/tracepoint.c b/libust/tracepoint.c index 47d3785..ca40902 100644 --- a/libust/tracepoint.c +++ b/libust/tracepoint.c @@ -287,24 +287,24 @@ static void disable_tracepoint(struct tracepoint *elem) * * Updates the probe callback corresponding to a range of tracepoints. */ -void tracepoint_update_probe_range(struct tracepoint *begin, - struct tracepoint *end) +void tracepoint_update_probe_range(struct tracepoint * const *begin, + struct tracepoint * const *end) { - struct tracepoint *iter; + struct tracepoint * const *iter; struct tracepoint_entry *mark_entry; pthread_mutex_lock(&tracepoints_mutex); for (iter = begin; iter < end; iter++) { - if (!iter->name) { - disable_tracepoint(iter); + if (!(*iter)->name) { + disable_tracepoint(*iter); continue; } - mark_entry = get_tracepoint(iter->name); + mark_entry = get_tracepoint((*iter)->name); if (mark_entry) { - set_tracepoint(&mark_entry, iter, + set_tracepoint(&mark_entry, *iter, !!mark_entry->refcount); } else { - disable_tracepoint(iter); + disable_tracepoint(*iter); } } pthread_mutex_unlock(&tracepoints_mutex); @@ -547,8 +547,8 @@ int lib_get_iter_tracepoints(struct tracepoint_iter *iter) * Will return the first tracepoint in the range if the input tracepoint is * NULL. */ -int tracepoint_get_iter_range(struct tracepoint **tracepoint, - struct tracepoint *begin, struct tracepoint *end) +int tracepoint_get_iter_range(struct tracepoint * const **tracepoint, + struct tracepoint * const *begin, struct tracepoint * const *end) { if (!*tracepoint && begin != end) { *tracepoint = begin; @@ -648,17 +648,17 @@ void tracepoint_set_new_tracepoint_cb(void (*cb)(struct tracepoint *)) new_tracepoint_cb = cb; } -static void new_tracepoints(struct tracepoint *start, struct tracepoint *end) +static void new_tracepoints(struct tracepoint * const *start, struct tracepoint * const *end) { - if(new_tracepoint_cb) { - struct tracepoint *t; + if (new_tracepoint_cb) { + struct tracepoint * const *t; for(t=start; t < end; t++) { - new_tracepoint_cb(t); + new_tracepoint_cb(*t); } } } -int tracepoint_register_lib(struct tracepoint *tracepoints_start, int tracepoints_count) +int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tracepoints_count) { struct tracepoint_lib *pl; @@ -682,14 +682,14 @@ int tracepoint_register_lib(struct tracepoint *tracepoints_start, int tracepoint return 0; } -int tracepoint_unregister_lib(struct tracepoint *tracepoints_start) +int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_start) { struct tracepoint_lib *lib; pthread_mutex_lock(&tracepoints_mutex); cds_list_for_each_entry(lib, &libs, list) { - if(lib->tracepoints_start == tracepoints_start) { + if (lib->tracepoints_start == tracepoints_start) { struct tracepoint_lib *lib2free = lib; cds_list_del(&lib->list); free(lib2free); -- 2.34.1