]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
Merge branch 'tip/tracing/ftrace' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorIngo Molnar <mingo@elte.hu>
Thu, 5 Mar 2009 09:21:49 +0000 (10:21 +0100)
committerIngo Molnar <mingo@elte.hu>
Thu, 5 Mar 2009 09:21:49 +0000 (10:21 +0100)
kernel/trace/blktrace.c
kernel/trace/ring_buffer.c
kernel/trace/trace.c
kernel/trace/trace.h
kernel/trace/trace_branch.c
kernel/trace/trace_irqsoff.c
kernel/trace/trace_output.c
kernel/trace/trace_output.h
kernel/trace/trace_sched_wakeup.c

index e82cb9e930cc2e328830afe163e89af032c77f41..e39679a72a3b5c22260349b180e5b3a9ab44e033 100644 (file)
@@ -1231,7 +1231,6 @@ static struct tracer blk_tracer __read_mostly = {
 static struct trace_event trace_blk_event = {
        .type           = TRACE_BLK,
        .trace          = blk_trace_event_print,
-       .latency_trace  = blk_trace_event_print,
        .binary         = blk_trace_event_print_binary,
 };
 
index f2a163db52f9e55f3b3078639439e49324f8915a..f7473645b9c65611814dc6fd0d0ff96bf51c279a 100644 (file)
@@ -2461,6 +2461,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
        unsigned long flags;
        unsigned int commit;
        unsigned int read;
+       u64 save_timestamp;
        int ret = -1;
 
        /*
@@ -2515,6 +2516,9 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
                if (len < size)
                        goto out;
 
+               /* save the current timestamp, since the user will need it */
+               save_timestamp = cpu_buffer->read_stamp;
+
                /* Need to copy one event at a time */
                do {
                        memcpy(bpage->data + pos, rpage->data + rpos, size);
@@ -2531,7 +2535,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
 
                /* update bpage */
                local_set(&bpage->commit, pos);
-               bpage->time_stamp = rpage->time_stamp;
+               bpage->time_stamp = save_timestamp;
 
                /* we copied everything to the beginning */
                read = 0;
index c8abbb0c8397de04283d0a572d7e5b9097572b61..d1ef43999d9e0e1c17aac0356d2abcd2e5734556 100644 (file)
@@ -299,6 +299,7 @@ static const char *trace_options[] = {
        "sym-userobj",
        "printk-msg-only",
        "context-info",
+       "latency-format",
        NULL
 };
 
@@ -346,6 +347,9 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt)
        int len;
        int ret;
 
+       if (!cnt)
+               return 0;
+
        if (s->len <= s->readpos)
                return -EBUSY;
 
@@ -353,10 +357,12 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt)
        if (cnt > len)
                cnt = len;
        ret = copy_to_user(ubuf, s->buffer + s->readpos, cnt);
-       if (ret)
+       if (ret == cnt)
                return -EFAULT;
 
-       s->readpos += len;
+       cnt -= ret;
+
+       s->readpos += cnt;
        return cnt;
 }
 
@@ -375,7 +381,7 @@ ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt)
        if (!ret)
                return -EFAULT;
 
-       s->readpos += len;
+       s->readpos += cnt;
        return cnt;
 }
 
@@ -1462,33 +1468,6 @@ static void test_cpu_buff_start(struct trace_iterator *iter)
        trace_seq_printf(s, "##### CPU %u buffer started ####\n", iter->cpu);
 }
 
-static enum print_line_t print_lat_fmt(struct trace_iterator *iter)
-{
-       struct trace_seq *s = &iter->seq;
-       unsigned long sym_flags = (trace_flags & TRACE_ITER_SYM_MASK);
-       struct trace_event *event;
-       struct trace_entry *entry = iter->ent;
-
-       test_cpu_buff_start(iter);
-
-       event = ftrace_find_event(entry->type);
-
-       if (trace_flags & TRACE_ITER_CONTEXT_INFO) {
-               if (!trace_print_lat_context(iter))
-                       goto partial;
-       }
-
-       if (event)
-               return event->latency_trace(iter, sym_flags);
-
-       if (!trace_seq_printf(s, "Unknown type %d\n", entry->type))
-               goto partial;
-
-       return TRACE_TYPE_HANDLED;
-partial:
-       return TRACE_TYPE_PARTIAL_LINE;
-}
-
 static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
 {
        struct trace_seq *s = &iter->seq;
@@ -1503,8 +1482,13 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
        event = ftrace_find_event(entry->type);
 
        if (trace_flags & TRACE_ITER_CONTEXT_INFO) {
-               if (!trace_print_context(iter))
-                       goto partial;
+               if (iter->iter_flags & TRACE_FILE_LAT_FMT) {
+                       if (!trace_print_lat_context(iter))
+                               goto partial;
+               } else {
+                       if (!trace_print_context(iter))
+                               goto partial;
+               }
        }
 
        if (event)
@@ -1646,9 +1630,6 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter)
        if (trace_flags & TRACE_ITER_RAW)
                return print_raw_fmt(iter);
 
-       if (iter->iter_flags & TRACE_FILE_LAT_FMT)
-               return print_lat_fmt(iter);
-
        return print_trace_fmt(iter);
 }
 
@@ -1824,26 +1805,12 @@ static int tracing_open(struct inode *inode, struct file *file)
        iter = __tracing_open(inode, file);
        if (IS_ERR(iter))
                ret = PTR_ERR(iter);
-
-       return ret;
-}
-
-static int tracing_lt_open(struct inode *inode, struct file *file)
-{
-       struct trace_iterator *iter;
-       int ret = 0;
-
-       iter = __tracing_open(inode, file);
-
-       if (IS_ERR(iter))
-               ret = PTR_ERR(iter);
-       else
+       else if (trace_flags & TRACE_ITER_LATENCY_FMT)
                iter->iter_flags |= TRACE_FILE_LAT_FMT;
 
        return ret;
 }
 
-
 static void *
 t_next(struct seq_file *m, void *v, loff_t *pos)
 {
@@ -1922,13 +1889,6 @@ static struct file_operations tracing_fops = {
        .release        = tracing_release,
 };
 
-static struct file_operations tracing_lt_fops = {
-       .open           = tracing_lt_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = tracing_release,
-};
-
 static struct file_operations show_traces_fops = {
        .open           = show_traces_open,
        .read           = seq_read,
@@ -3049,6 +3009,9 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
        ssize_t ret;
        size_t size;
 
+       if (!count)
+               return 0;
+
        /* Do we have previous read data to read? */
        if (info->read < PAGE_SIZE)
                goto read;
@@ -3073,8 +3036,10 @@ read:
                size = count;
 
        ret = copy_to_user(ubuf, info->spare + info->read, size);
-       if (ret)
+       if (ret == size)
                return -EFAULT;
+       size -= ret;
+
        *ppos += size;
        info->read += size;
 
@@ -3918,8 +3883,10 @@ void ftrace_dump(void)
 
        printk(KERN_TRACE "Dumping ftrace buffer:\n");
 
+       /* Simulate the iterator */
        iter.tr = &global_trace;
        iter.trace = current_trace;
+       iter.cpu_file = TRACE_PIPE_ALL_CPU;
 
        /*
         * We need to stop all tracing on all CPUS to read the
index 561bb5c5d9881850fd39c5a0c839c0c9a0e87801..12cd119cca3284de67ef87916b56fe17d5adf287 100644 (file)
@@ -651,7 +651,8 @@ enum trace_iterator_flags {
        TRACE_ITER_USERSTACKTRACE       = 0x4000,
        TRACE_ITER_SYM_USEROBJ          = 0x8000,
        TRACE_ITER_PRINTK_MSGONLY       = 0x10000,
-       TRACE_ITER_CONTEXT_INFO         = 0x20000 /* Print pid/cpu/time */
+       TRACE_ITER_CONTEXT_INFO         = 0x20000, /* Print pid/cpu/time */
+       TRACE_ITER_LATENCY_FMT          = 0x40000,
 };
 
 /*
index c2e68d440c4da925f8810e57009abf40e3ca77b7..aaa0755268b97bfc7e6f7f5ea9bcfb1cb344dc12 100644 (file)
@@ -159,7 +159,6 @@ static enum print_line_t trace_branch_print(struct trace_iterator *iter,
 static struct trace_event trace_branch_event = {
        .type           = TRACE_BRANCH,
        .trace          = trace_branch_print,
-       .latency_trace  = trace_branch_print,
 };
 
 static struct tracer branch_trace __read_mostly =
index 9e5ebd844158d8ba0e85af9fb1847a133e39a940..b923d13e2fad9793dba42bfa05b582a36f306800 100644 (file)
@@ -32,6 +32,8 @@ enum {
 
 static int trace_type __read_mostly;
 
+static int save_lat_flag;
+
 #ifdef CONFIG_PREEMPT_TRACER
 static inline int
 preempt_trace(void)
@@ -370,6 +372,9 @@ static void stop_irqsoff_tracer(struct trace_array *tr)
 
 static void __irqsoff_tracer_init(struct trace_array *tr)
 {
+       save_lat_flag = trace_flags & TRACE_ITER_LATENCY_FMT;
+       trace_flags |= TRACE_ITER_LATENCY_FMT;
+
        tracing_max_latency = 0;
        irqsoff_trace = tr;
        /* make sure that the tracer is visible */
@@ -380,6 +385,9 @@ static void __irqsoff_tracer_init(struct trace_array *tr)
 static void irqsoff_tracer_reset(struct trace_array *tr)
 {
        stop_irqsoff_tracer(tr);
+
+       if (!save_lat_flag)
+               trace_flags &= ~TRACE_ITER_LATENCY_FMT;
 }
 
 static void irqsoff_tracer_start(struct trace_array *tr)
index 9fc815031b097b5a14eb3926a3f2a39f7936780d..306fef84c503b86439c18fc44ff8f34460900881 100644 (file)
@@ -437,8 +437,6 @@ int register_ftrace_event(struct trace_event *event)
 
        if (event->trace == NULL)
                event->trace = trace_nop_print;
-       if (event->latency_trace == NULL)
-               event->latency_trace = trace_nop_print;
        if (event->raw == NULL)
                event->raw = trace_nop_print;
        if (event->hex == NULL)
@@ -480,29 +478,6 @@ enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags)
 }
 
 /* TRACE_FN */
-static enum print_line_t trace_fn_latency(struct trace_iterator *iter,
-                                         int flags)
-{
-       struct ftrace_entry *field;
-       struct trace_seq *s = &iter->seq;
-
-       trace_assign_type(field, iter->ent);
-
-       if (!seq_print_ip_sym(s, field->ip, flags))
-               goto partial;
-       if (!trace_seq_puts(s, " ("))
-               goto partial;
-       if (!seq_print_ip_sym(s, field->parent_ip, flags))
-               goto partial;
-       if (!trace_seq_puts(s, ")\n"))
-               goto partial;
-
-       return TRACE_TYPE_HANDLED;
-
- partial:
-       return TRACE_TYPE_PARTIAL_LINE;
-}
-
 static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags)
 {
        struct ftrace_entry *field;
@@ -573,7 +548,6 @@ static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags)
 static struct trace_event trace_fn_event = {
        .type           = TRACE_FN,
        .trace          = trace_fn_trace,
-       .latency_trace  = trace_fn_latency,
        .raw            = trace_fn_raw,
        .hex            = trace_fn_hex,
        .binary         = trace_fn_bin,
@@ -705,7 +679,6 @@ static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter,
 static struct trace_event trace_ctx_event = {
        .type           = TRACE_CTX,
        .trace          = trace_ctx_print,
-       .latency_trace  = trace_ctx_print,
        .raw            = trace_ctx_raw,
        .hex            = trace_ctx_hex,
        .binary         = trace_ctxwake_bin,
@@ -714,7 +687,6 @@ static struct trace_event trace_ctx_event = {
 static struct trace_event trace_wake_event = {
        .type           = TRACE_WAKE,
        .trace          = trace_wake_print,
-       .latency_trace  = trace_wake_print,
        .raw            = trace_wake_raw,
        .hex            = trace_wake_hex,
        .binary         = trace_ctxwake_bin,
@@ -770,7 +742,6 @@ static enum print_line_t trace_special_bin(struct trace_iterator *iter,
 static struct trace_event trace_special_event = {
        .type           = TRACE_SPECIAL,
        .trace          = trace_special_print,
-       .latency_trace  = trace_special_print,
        .raw            = trace_special_print,
        .hex            = trace_special_hex,
        .binary         = trace_special_bin,
@@ -808,7 +779,6 @@ static enum print_line_t trace_stack_print(struct trace_iterator *iter,
 static struct trace_event trace_stack_event = {
        .type           = TRACE_STACK,
        .trace          = trace_stack_print,
-       .latency_trace  = trace_stack_print,
        .raw            = trace_special_print,
        .hex            = trace_special_hex,
        .binary         = trace_special_bin,
@@ -838,7 +808,6 @@ static enum print_line_t trace_user_stack_print(struct trace_iterator *iter,
 static struct trace_event trace_user_stack_event = {
        .type           = TRACE_USER_STACK,
        .trace          = trace_user_stack_print,
-       .latency_trace  = trace_user_stack_print,
        .raw            = trace_special_print,
        .hex            = trace_special_hex,
        .binary         = trace_special_bin,
@@ -883,7 +852,6 @@ static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags)
 static struct trace_event trace_print_event = {
        .type           = TRACE_PRINT,
        .trace          = trace_print_print,
-       .latency_trace  = trace_print_print,
        .raw            = trace_print_raw,
 };
 
index 551a25a72217f10228c850d9e27ea7da97b22a42..8a34d688ed63fb2011362829769048a50a7a5079 100644 (file)
@@ -10,7 +10,6 @@ struct trace_event {
        struct hlist_node       node;
        int                     type;
        trace_print_func        trace;
-       trace_print_func        latency_trace;
        trace_print_func        raw;
        trace_print_func        hex;
        trace_print_func        binary;
index db55f7aaa64088ba2600f308a14bcc9065ae5013..3c5ad6b2ec846256472d83348dbe5747d034c963 100644 (file)
@@ -32,6 +32,8 @@ static raw_spinlock_t wakeup_lock =
 
 static void __wakeup_reset(struct trace_array *tr);
 
+static int save_lat_flag;
+
 #ifdef CONFIG_FUNCTION_TRACER
 /*
  * irqsoff uses its own tracer function to keep the overhead down:
@@ -324,6 +326,9 @@ static void stop_wakeup_tracer(struct trace_array *tr)
 
 static int __wakeup_tracer_init(struct trace_array *tr)
 {
+       save_lat_flag = trace_flags & TRACE_ITER_LATENCY_FMT;
+       trace_flags |= TRACE_ITER_LATENCY_FMT;
+
        tracing_max_latency = 0;
        wakeup_trace = tr;
        start_wakeup_tracer(tr);
@@ -347,6 +352,9 @@ static void wakeup_tracer_reset(struct trace_array *tr)
        stop_wakeup_tracer(tr);
        /* make sure we put back any tasks we are tracing */
        wakeup_reset(tr);
+
+       if (!save_lat_flag)
+               trace_flags &= ~TRACE_ITER_LATENCY_FMT;
 }
 
 static void wakeup_tracer_start(struct trace_array *tr)