From c1dea0b3d1312d0e3747da93eb949145c487eeba Mon Sep 17 00:00:00 2001 From: Pierre-Marc Fournier Date: Thu, 12 Feb 2009 14:55:53 -0500 Subject: [PATCH] ust: fix several segfaults, now seems to trace without errors --- hello/serialize.c | 2 +- libtracing/Makefile | 2 +- libtracing/relay.c | 31 +++++++++++++++++++------------ libtracing/tracer.h | 10 ++++------ share/kernelcompat.h | 31 +++++++++++++++++++------------ 5 files changed, 44 insertions(+), 32 deletions(-) diff --git a/hello/serialize.c b/hello/serialize.c index bf7cbe9..fd63682 100644 --- a/hello/serialize.c +++ b/hello/serialize.c @@ -653,7 +653,7 @@ notrace void ltt_vtrace(const struct marker *mdata, void *probe_data, ret = ltt_reserve_slot(trace, channel, &transport_data, data_size, &slot_size, &buf_offset, &tsc, &rflags, - largest_align, cpu); + largest_align); if (unlikely(ret < 0)) continue; /* buffer full */ diff --git a/libtracing/Makefile b/libtracing/Makefile index dd58ce5..b2904e8 100644 --- a/libtracing/Makefile +++ b/libtracing/Makefile @@ -1,6 +1,6 @@ all: libtracing.so libtracing.so: *.c *.h - gcc -g -fPIC -I../share -I../libtracing -shared -o libtracing.so *.c + gcc -g -fPIC -I../share -I../libtracing -I../libmarkers -shared -o libtracing.so *.c .PHONY: libtracing.so all diff --git a/libtracing/relay.c b/libtracing/relay.c index bb781f2..d78fa72 100644 --- a/libtracing/relay.c +++ b/libtracing/relay.c @@ -36,6 +36,9 @@ static DEFINE_MUTEX(relay_channels_mutex); static LIST_HEAD(relay_channels); + +static struct dentry *ltt_create_buf_file_callback(struct rchan_buf *buf); + /** * relay_alloc_buf - allocate a channel buffer * @buf: the buffer struct @@ -266,6 +269,9 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan) /* Create file in fs */ //ust// dentry = chan->cb->create_buf_file(tmpname, chan->parent, S_IRUSR, //ust// buf); + + ltt_create_buf_file_callback(buf); // ust // + //ust// if (!dentry) //ust// goto free_buf; //ust// @@ -631,6 +637,7 @@ void *ltt_relay_offset_address(struct rchan_buf *buf, size_t offset) //ust// buf->hpage[odd] = page = buf->wpage; //ust// page = ltt_relay_cache_page(buf, &buf->hpage[odd], page, offset); //ust// return page_address(page->page) + (offset & ~PAGE_MASK); + return ((char *)buf->buf_data)+offset; return NULL; } //ust// EXPORT_SYMBOL_GPL(ltt_relay_offset_address); @@ -867,8 +874,9 @@ static notrace void ltt_buffer_end_callback(struct rchan_buf *buf, header->lost_size = SUBBUF_OFFSET((buf->chan->subbuf_size - offset), buf->chan); header->cycle_count_end = tsc; - header->events_lost = ltt_buf->events_lost; - header->subbuf_corrupt = ltt_buf->corrupted_subbuffers; + header->events_lost = local_read(<t_buf->events_lost); + header->subbuf_corrupt = local_read(<t_buf->corrupted_subbuffers); + } static notrace void ltt_deliver(struct rchan_buf *buf, unsigned int subbuf_idx, @@ -881,9 +889,7 @@ static notrace void ltt_deliver(struct rchan_buf *buf, unsigned int subbuf_idx, atomic_set(<t_buf->wakeup_readers, 1); } -static struct dentry *ltt_create_buf_file_callback(const char *filename, - struct dentry *parent, int mode, - struct rchan_buf *buf) +static struct dentry *ltt_create_buf_file_callback(struct rchan_buf *buf) { struct ltt_channel_struct *ltt_chan; int err; @@ -899,6 +905,7 @@ static struct dentry *ltt_create_buf_file_callback(const char *filename, //ust// if (!dentry) //ust// goto error; //ust// return dentry; + return NULL; //ust// //ust//error: ltt_relay_destroy_buffer(ltt_chan); return NULL; @@ -1442,13 +1449,13 @@ static int ltt_relay_create_buffer(struct ltt_trace_struct *trace, unsigned int j; ltt_buf->commit_count = - malloc(sizeof(ltt_buf->commit_count) * n_subbufs); + zmalloc(sizeof(ltt_buf->commit_count) * n_subbufs); if (!ltt_buf->commit_count) return -ENOMEM; kref_get(&trace->kref); kref_get(&trace->ltt_transport_kref); kref_get(<t_chan->kref); - ltt_buf->offset = ltt_subbuffer_header_size(); + local_set(<t_buf->offset, ltt_subbuffer_header_size()); atomic_long_set(<t_buf->consumed, 0); atomic_long_set(<t_buf->active_readers, 0); for (j = 0; j < n_subbufs; j++) @@ -1459,10 +1466,10 @@ static int ltt_relay_create_buffer(struct ltt_trace_struct *trace, ltt_buffer_begin_callback(buf, trace->start_tsc, 0); - ltt_buf->commit_count[0] += ltt_subbuffer_header_size(); + local_add(ltt_subbuffer_header_size(), <t_buf->commit_count[0]); - ltt_buf->events_lost = 0; - ltt_buf->corrupted_subbuffers = 0; + local_set(<t_buf->events_lost, 0); + local_set(<t_buf->corrupted_subbuffers, 0); return 0; } @@ -2010,7 +2017,7 @@ static inline void ltt_reserve_end_switch_current( static notrace int ltt_relay_reserve_slot(struct ltt_trace_struct *trace, struct ltt_channel_struct *ltt_channel, void **transport_data, size_t data_size, size_t *slot_size, long *buf_offset, u64 *tsc, - unsigned int *rflags, int largest_align, int cpu) + unsigned int *rflags, int largest_align) { struct rchan *rchan = ltt_channel->trans_channel_data; struct rchan_buf *buf = *transport_data = rchan->buf; @@ -2283,7 +2290,7 @@ static int ltt_relay_user_blocking(struct ltt_trace_struct *trace, static void ltt_relay_print_user_errors(struct ltt_trace_struct *trace, unsigned int chan_index, size_t data_size, - struct user_dbg_data *dbg, int cpu) + struct user_dbg_data *dbg) { struct rchan *rchan; struct ltt_channel_buf_struct *ltt_buf; diff --git a/libtracing/tracer.h b/libtracing/tracer.h index cff0705..e9418c4 100644 --- a/libtracing/tracer.h +++ b/libtracing/tracer.h @@ -146,8 +146,7 @@ struct ltt_trace_ops { void **transport_data, size_t data_size, size_t *slot_size, long *buf_offset, u64 *tsc, unsigned int *rflags, - int largest_align, - int cpu); + int largest_align); void (*commit_slot) (struct ltt_channel_struct *channel, void **transport_data, long buf_offset, size_t slot_size); @@ -168,7 +167,7 @@ struct ltt_trace_ops { void (*remove_channel) (struct ltt_channel_struct *channel); void (*user_errors) (struct ltt_trace_struct *trace, unsigned int index, size_t data_size, - struct user_dbg_data *dbg, int cpu); + struct user_dbg_data *dbg); //ust// #ifdef CONFIG_HOTPLUG_CPU //ust// int (*handle_cpuhp) (struct notifier_block *nb, //ust// unsigned long action, void *hcpu, @@ -498,12 +497,11 @@ static inline int ltt_reserve_slot( long *buf_offset, u64 *tsc, unsigned int *rflags, - int largest_align, - int cpu) + int largest_align) { return trace->ops->reserve_slot(trace, channel, transport_data, data_size, slot_size, buf_offset, tsc, rflags, - largest_align, cpu); + largest_align); } diff --git a/share/kernelcompat.h b/share/kernelcompat.h index e322bdb..b442718 100644 --- a/share/kernelcompat.h +++ b/share/kernelcompat.h @@ -186,37 +186,44 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, return old; } -#define local_cmpxchg cmpxchg +//#define local_cmpxchg cmpxchg +#define local_cmpxchg(l, o, n) (cmpxchg(&((l)->a.counter), (o), (n))) + #define atomic_long_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) /* LOCAL OPS */ -typedef int local_t; +//typedef int local_t; +typedef struct +{ + atomic_long_t a; +} local_t; + -static inline void local_inc(local_t *a) +static inline void local_inc(local_t *l) { - (*a)++; + (l->a.counter)++; } -static inline void local_set(local_t *a, int v) +static inline void local_set(local_t *l, int v) { - *a = v; + l->a.counter = v; } -static inline void local_add(int v, local_t *a) +static inline void local_add(int v, local_t *l) { - *a += v; + l->a.counter += v; } -static int local_add_return(int v, local_t *a) +static int local_add_return(int v, local_t *l) { - return *a += v; + return l->a.counter += v; } -static inline int local_read(local_t *a) +static inline int local_read(local_t *l) { - return *a; + return l->a.counter; } -- 2.34.1