ust: fix several segfaults, now seems to trace without errors
authorPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Thu, 12 Feb 2009 19:55:53 +0000 (14:55 -0500)
committerPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Thu, 12 Feb 2009 19:55:53 +0000 (14:55 -0500)
hello/serialize.c
libtracing/Makefile
libtracing/relay.c
libtracing/tracer.h
share/kernelcompat.h

index bf7cbe9d52fe6ed9b74c4e1196637d88aedb400c..fd636822e9617904f6659097c41c464d096dfc7b 100644 (file)
@@ -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 */
 
index dd58ce5d3b37e1ab9b0759f21e26fb0677c608a0..b2904e85e2dc0e5de450ecc2cdf5d40e022a90ea 100644 (file)
@@ -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
index bb781f2cde3f6d396ab1d2de3644a32812ec15bb..d78fa72a7ae2ac248cc07e309ba1c48236fcfbc2 100644 (file)
@@ -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(&ltt_buf->events_lost);
+       header->subbuf_corrupt = local_read(&ltt_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(&ltt_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(&ltt_chan->kref);
-       ltt_buf->offset = ltt_subbuffer_header_size();
+       local_set(&ltt_buf->offset, ltt_subbuffer_header_size());
        atomic_long_set(&ltt_buf->consumed, 0);
        atomic_long_set(&ltt_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(), &ltt_buf->commit_count[0]);
 
-       ltt_buf->events_lost = 0;
-       ltt_buf->corrupted_subbuffers = 0;
+       local_set(&ltt_buf->events_lost, 0);
+       local_set(&ltt_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;
index cff0705c1020ef15e95a0e93a7cff07d7f449e35..e9418c4c993c5bef01f9919b61c0c7830d5a0e5c 100644 (file)
@@ -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);
 }
 
 
index e322bdbaad8c504e7e679e09afaf6a0432adb914..b442718e2af19a7e611aa36d03f04118834f6ab8 100644 (file)
@@ -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;
 }
 
 
This page took 0.032 seconds and 4 git commands to generate.