aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/ring_buffer.c
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-10-17 19:09:09 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2009-10-17 19:12:33 -0400
commit0f8f86c7bdd1c954fbe153af437a0d91a6c5721a (patch)
tree94a8d419a470a4f9852ca397bb9bbe48db92ff5c /kernel/trace/ring_buffer.c
parentdca2d6ac09d9ef59ff46820d4f0c94b08a671202 (diff)
parentf39cdf25bf77219676ec5360980ac40b1a7e144a (diff)
Merge commit 'perf/core' into perf/hw-breakpoint
Conflicts: kernel/Makefile kernel/trace/Makefile kernel/trace/trace.h samples/Makefile Merge reason: We need to be uptodate with the perf events development branch because we plan to rewrite the breakpoints API on top of perf events.
Diffstat (limited to 'kernel/trace/ring_buffer.c')
-rw-r--r--kernel/trace/ring_buffer.c34
1 files changed, 16 insertions, 18 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 454e74e718cf..e43c928356ee 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -201,8 +201,6 @@ int tracing_is_on(void)
201} 201}
202EXPORT_SYMBOL_GPL(tracing_is_on); 202EXPORT_SYMBOL_GPL(tracing_is_on);
203 203
204#include "trace.h"
205
206#define RB_EVNT_HDR_SIZE (offsetof(struct ring_buffer_event, array)) 204#define RB_EVNT_HDR_SIZE (offsetof(struct ring_buffer_event, array))
207#define RB_ALIGNMENT 4U 205#define RB_ALIGNMENT 4U
208#define RB_MAX_SMALL_DATA (RB_ALIGNMENT * RINGBUF_TYPE_DATA_TYPE_LEN_MAX) 206#define RB_MAX_SMALL_DATA (RB_ALIGNMENT * RINGBUF_TYPE_DATA_TYPE_LEN_MAX)
@@ -399,18 +397,21 @@ int ring_buffer_print_page_header(struct trace_seq *s)
399 int ret; 397 int ret;
400 398
401 ret = trace_seq_printf(s, "\tfield: u64 timestamp;\t" 399 ret = trace_seq_printf(s, "\tfield: u64 timestamp;\t"
402 "offset:0;\tsize:%u;\n", 400 "offset:0;\tsize:%u;\tsigned:%u;\n",
403 (unsigned int)sizeof(field.time_stamp)); 401 (unsigned int)sizeof(field.time_stamp),
402 (unsigned int)is_signed_type(u64));
404 403
405 ret = trace_seq_printf(s, "\tfield: local_t commit;\t" 404 ret = trace_seq_printf(s, "\tfield: local_t commit;\t"
406 "offset:%u;\tsize:%u;\n", 405 "offset:%u;\tsize:%u;\tsigned:%u;\n",
407 (unsigned int)offsetof(typeof(field), commit), 406 (unsigned int)offsetof(typeof(field), commit),
408 (unsigned int)sizeof(field.commit)); 407 (unsigned int)sizeof(field.commit),
408 (unsigned int)is_signed_type(long));
409 409
410 ret = trace_seq_printf(s, "\tfield: char data;\t" 410 ret = trace_seq_printf(s, "\tfield: char data;\t"
411 "offset:%u;\tsize:%u;\n", 411 "offset:%u;\tsize:%u;\tsigned:%u;\n",
412 (unsigned int)offsetof(typeof(field), data), 412 (unsigned int)offsetof(typeof(field), data),
413 (unsigned int)BUF_PAGE_SIZE); 413 (unsigned int)BUF_PAGE_SIZE,
414 (unsigned int)is_signed_type(char));
414 415
415 return ret; 416 return ret;
416} 417}
@@ -701,8 +702,8 @@ static int rb_head_page_set(struct ring_buffer_per_cpu *cpu_buffer,
701 702
702 val &= ~RB_FLAG_MASK; 703 val &= ~RB_FLAG_MASK;
703 704
704 ret = (unsigned long)cmpxchg(&list->next, 705 ret = cmpxchg((unsigned long *)&list->next,
705 val | old_flag, val | new_flag); 706 val | old_flag, val | new_flag);
706 707
707 /* check if the reader took the page */ 708 /* check if the reader took the page */
708 if ((ret & ~RB_FLAG_MASK) != val) 709 if ((ret & ~RB_FLAG_MASK) != val)
@@ -794,7 +795,7 @@ static int rb_head_page_replace(struct buffer_page *old,
794 val = *ptr & ~RB_FLAG_MASK; 795 val = *ptr & ~RB_FLAG_MASK;
795 val |= RB_PAGE_HEAD; 796 val |= RB_PAGE_HEAD;
796 797
797 ret = cmpxchg(ptr, val, &new->list); 798 ret = cmpxchg(ptr, val, (unsigned long)&new->list);
798 799
799 return ret == val; 800 return ret == val;
800} 801}
@@ -2997,15 +2998,12 @@ static void rb_advance_iter(struct ring_buffer_iter *iter)
2997} 2998}
2998 2999
2999static struct ring_buffer_event * 3000static struct ring_buffer_event *
3000rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts) 3001rb_buffer_peek(struct ring_buffer_per_cpu *cpu_buffer, u64 *ts)
3001{ 3002{
3002 struct ring_buffer_per_cpu *cpu_buffer;
3003 struct ring_buffer_event *event; 3003 struct ring_buffer_event *event;
3004 struct buffer_page *reader; 3004 struct buffer_page *reader;
3005 int nr_loops = 0; 3005 int nr_loops = 0;
3006 3006
3007 cpu_buffer = buffer->buffers[cpu];
3008
3009 again: 3007 again:
3010 /* 3008 /*
3011 * We repeat when a timestamp is encountered. It is possible 3009 * We repeat when a timestamp is encountered. It is possible
@@ -3049,7 +3047,7 @@ rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
3049 case RINGBUF_TYPE_DATA: 3047 case RINGBUF_TYPE_DATA:
3050 if (ts) { 3048 if (ts) {
3051 *ts = cpu_buffer->read_stamp + event->time_delta; 3049 *ts = cpu_buffer->read_stamp + event->time_delta;
3052 ring_buffer_normalize_time_stamp(buffer, 3050 ring_buffer_normalize_time_stamp(cpu_buffer->buffer,
3053 cpu_buffer->cpu, ts); 3051 cpu_buffer->cpu, ts);
3054 } 3052 }
3055 return event; 3053 return event;
@@ -3168,7 +3166,7 @@ ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
3168 local_irq_save(flags); 3166 local_irq_save(flags);
3169 if (dolock) 3167 if (dolock)
3170 spin_lock(&cpu_buffer->reader_lock); 3168 spin_lock(&cpu_buffer->reader_lock);
3171 event = rb_buffer_peek(buffer, cpu, ts); 3169 event = rb_buffer_peek(cpu_buffer, ts);
3172 if (event && event->type_len == RINGBUF_TYPE_PADDING) 3170 if (event && event->type_len == RINGBUF_TYPE_PADDING)
3173 rb_advance_reader(cpu_buffer); 3171 rb_advance_reader(cpu_buffer);
3174 if (dolock) 3172 if (dolock)
@@ -3237,7 +3235,7 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts)
3237 if (dolock) 3235 if (dolock)
3238 spin_lock(&cpu_buffer->reader_lock); 3236 spin_lock(&cpu_buffer->reader_lock);
3239 3237
3240 event = rb_buffer_peek(buffer, cpu, ts); 3238 event = rb_buffer_peek(cpu_buffer, ts);
3241 if (event) 3239 if (event)
3242 rb_advance_reader(cpu_buffer); 3240 rb_advance_reader(cpu_buffer);
3243 3241