提交 53664738 编写于 作者: I Ingo Molnar

Merge branch 'tip/tracing/ftrace' of...

Merge branch 'tip/tracing/ftrace' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into tracing/ftrace
...@@ -1231,7 +1231,6 @@ static struct tracer blk_tracer __read_mostly = { ...@@ -1231,7 +1231,6 @@ static struct tracer blk_tracer __read_mostly = {
static struct trace_event trace_blk_event = { static struct trace_event trace_blk_event = {
.type = TRACE_BLK, .type = TRACE_BLK,
.trace = blk_trace_event_print, .trace = blk_trace_event_print,
.latency_trace = blk_trace_event_print,
.binary = blk_trace_event_print_binary, .binary = blk_trace_event_print_binary,
}; };
......
...@@ -2461,6 +2461,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer, ...@@ -2461,6 +2461,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
unsigned long flags; unsigned long flags;
unsigned int commit; unsigned int commit;
unsigned int read; unsigned int read;
u64 save_timestamp;
int ret = -1; int ret = -1;
/* /*
...@@ -2515,6 +2516,9 @@ int ring_buffer_read_page(struct ring_buffer *buffer, ...@@ -2515,6 +2516,9 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
if (len < size) if (len < size)
goto out; 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 */ /* Need to copy one event at a time */
do { do {
memcpy(bpage->data + pos, rpage->data + rpos, size); memcpy(bpage->data + pos, rpage->data + rpos, size);
...@@ -2531,7 +2535,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer, ...@@ -2531,7 +2535,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
/* update bpage */ /* update bpage */
local_set(&bpage->commit, pos); local_set(&bpage->commit, pos);
bpage->time_stamp = rpage->time_stamp; bpage->time_stamp = save_timestamp;
/* we copied everything to the beginning */ /* we copied everything to the beginning */
read = 0; read = 0;
......
...@@ -299,6 +299,7 @@ static const char *trace_options[] = { ...@@ -299,6 +299,7 @@ static const char *trace_options[] = {
"sym-userobj", "sym-userobj",
"printk-msg-only", "printk-msg-only",
"context-info", "context-info",
"latency-format",
NULL NULL
}; };
...@@ -346,6 +347,9 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt) ...@@ -346,6 +347,9 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt)
int len; int len;
int ret; int ret;
if (!cnt)
return 0;
if (s->len <= s->readpos) if (s->len <= s->readpos)
return -EBUSY; return -EBUSY;
...@@ -353,10 +357,12 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt) ...@@ -353,10 +357,12 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt)
if (cnt > len) if (cnt > len)
cnt = len; cnt = len;
ret = copy_to_user(ubuf, s->buffer + s->readpos, cnt); ret = copy_to_user(ubuf, s->buffer + s->readpos, cnt);
if (ret) if (ret == cnt)
return -EFAULT; return -EFAULT;
s->readpos += len; cnt -= ret;
s->readpos += cnt;
return cnt; return cnt;
} }
...@@ -375,7 +381,7 @@ ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt) ...@@ -375,7 +381,7 @@ ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt)
if (!ret) if (!ret)
return -EFAULT; return -EFAULT;
s->readpos += len; s->readpos += cnt;
return cnt; return cnt;
} }
...@@ -1462,33 +1468,6 @@ static void test_cpu_buff_start(struct trace_iterator *iter) ...@@ -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); 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) static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
{ {
struct trace_seq *s = &iter->seq; struct trace_seq *s = &iter->seq;
...@@ -1503,8 +1482,13 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter) ...@@ -1503,8 +1482,13 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
event = ftrace_find_event(entry->type); event = ftrace_find_event(entry->type);
if (trace_flags & TRACE_ITER_CONTEXT_INFO) { if (trace_flags & TRACE_ITER_CONTEXT_INFO) {
if (!trace_print_context(iter)) if (iter->iter_flags & TRACE_FILE_LAT_FMT) {
goto partial; if (!trace_print_lat_context(iter))
goto partial;
} else {
if (!trace_print_context(iter))
goto partial;
}
} }
if (event) if (event)
...@@ -1646,9 +1630,6 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter) ...@@ -1646,9 +1630,6 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter)
if (trace_flags & TRACE_ITER_RAW) if (trace_flags & TRACE_ITER_RAW)
return print_raw_fmt(iter); return print_raw_fmt(iter);
if (iter->iter_flags & TRACE_FILE_LAT_FMT)
return print_lat_fmt(iter);
return print_trace_fmt(iter); return print_trace_fmt(iter);
} }
...@@ -1824,26 +1805,12 @@ static int tracing_open(struct inode *inode, struct file *file) ...@@ -1824,26 +1805,12 @@ static int tracing_open(struct inode *inode, struct file *file)
iter = __tracing_open(inode, file); iter = __tracing_open(inode, file);
if (IS_ERR(iter)) if (IS_ERR(iter))
ret = PTR_ERR(iter); ret = PTR_ERR(iter);
else if (trace_flags & TRACE_ITER_LATENCY_FMT)
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
iter->iter_flags |= TRACE_FILE_LAT_FMT; iter->iter_flags |= TRACE_FILE_LAT_FMT;
return ret; return ret;
} }
static void * static void *
t_next(struct seq_file *m, void *v, loff_t *pos) t_next(struct seq_file *m, void *v, loff_t *pos)
{ {
...@@ -1922,13 +1889,6 @@ static struct file_operations tracing_fops = { ...@@ -1922,13 +1889,6 @@ static struct file_operations tracing_fops = {
.release = tracing_release, .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 = { static struct file_operations show_traces_fops = {
.open = show_traces_open, .open = show_traces_open,
.read = seq_read, .read = seq_read,
...@@ -3049,6 +3009,9 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, ...@@ -3049,6 +3009,9 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
ssize_t ret; ssize_t ret;
size_t size; size_t size;
if (!count)
return 0;
/* Do we have previous read data to read? */ /* Do we have previous read data to read? */
if (info->read < PAGE_SIZE) if (info->read < PAGE_SIZE)
goto read; goto read;
...@@ -3073,8 +3036,10 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, ...@@ -3073,8 +3036,10 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
size = count; size = count;
ret = copy_to_user(ubuf, info->spare + info->read, size); ret = copy_to_user(ubuf, info->spare + info->read, size);
if (ret) if (ret == size)
return -EFAULT; return -EFAULT;
size -= ret;
*ppos += size; *ppos += size;
info->read += size; info->read += size;
...@@ -3918,8 +3883,10 @@ void ftrace_dump(void) ...@@ -3918,8 +3883,10 @@ void ftrace_dump(void)
printk(KERN_TRACE "Dumping ftrace buffer:\n"); printk(KERN_TRACE "Dumping ftrace buffer:\n");
/* Simulate the iterator */
iter.tr = &global_trace; iter.tr = &global_trace;
iter.trace = current_trace; iter.trace = current_trace;
iter.cpu_file = TRACE_PIPE_ALL_CPU;
/* /*
* We need to stop all tracing on all CPUS to read the * We need to stop all tracing on all CPUS to read the
......
...@@ -651,7 +651,8 @@ enum trace_iterator_flags { ...@@ -651,7 +651,8 @@ enum trace_iterator_flags {
TRACE_ITER_USERSTACKTRACE = 0x4000, TRACE_ITER_USERSTACKTRACE = 0x4000,
TRACE_ITER_SYM_USEROBJ = 0x8000, TRACE_ITER_SYM_USEROBJ = 0x8000,
TRACE_ITER_PRINTK_MSGONLY = 0x10000, 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,
}; };
/* /*
......
...@@ -159,7 +159,6 @@ static enum print_line_t trace_branch_print(struct trace_iterator *iter, ...@@ -159,7 +159,6 @@ static enum print_line_t trace_branch_print(struct trace_iterator *iter,
static struct trace_event trace_branch_event = { static struct trace_event trace_branch_event = {
.type = TRACE_BRANCH, .type = TRACE_BRANCH,
.trace = trace_branch_print, .trace = trace_branch_print,
.latency_trace = trace_branch_print,
}; };
static struct tracer branch_trace __read_mostly = static struct tracer branch_trace __read_mostly =
......
...@@ -32,6 +32,8 @@ enum { ...@@ -32,6 +32,8 @@ enum {
static int trace_type __read_mostly; static int trace_type __read_mostly;
static int save_lat_flag;
#ifdef CONFIG_PREEMPT_TRACER #ifdef CONFIG_PREEMPT_TRACER
static inline int static inline int
preempt_trace(void) preempt_trace(void)
...@@ -370,6 +372,9 @@ static void stop_irqsoff_tracer(struct trace_array *tr) ...@@ -370,6 +372,9 @@ static void stop_irqsoff_tracer(struct trace_array *tr)
static void __irqsoff_tracer_init(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; tracing_max_latency = 0;
irqsoff_trace = tr; irqsoff_trace = tr;
/* make sure that the tracer is visible */ /* make sure that the tracer is visible */
...@@ -380,6 +385,9 @@ static void __irqsoff_tracer_init(struct trace_array *tr) ...@@ -380,6 +385,9 @@ static void __irqsoff_tracer_init(struct trace_array *tr)
static void irqsoff_tracer_reset(struct trace_array *tr) static void irqsoff_tracer_reset(struct trace_array *tr)
{ {
stop_irqsoff_tracer(tr); stop_irqsoff_tracer(tr);
if (!save_lat_flag)
trace_flags &= ~TRACE_ITER_LATENCY_FMT;
} }
static void irqsoff_tracer_start(struct trace_array *tr) static void irqsoff_tracer_start(struct trace_array *tr)
......
...@@ -437,8 +437,6 @@ int register_ftrace_event(struct trace_event *event) ...@@ -437,8 +437,6 @@ int register_ftrace_event(struct trace_event *event)
if (event->trace == NULL) if (event->trace == NULL)
event->trace = trace_nop_print; event->trace = trace_nop_print;
if (event->latency_trace == NULL)
event->latency_trace = trace_nop_print;
if (event->raw == NULL) if (event->raw == NULL)
event->raw = trace_nop_print; event->raw = trace_nop_print;
if (event->hex == NULL) if (event->hex == NULL)
...@@ -480,29 +478,6 @@ enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags) ...@@ -480,29 +478,6 @@ enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags)
} }
/* TRACE_FN */ /* 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) static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags)
{ {
struct ftrace_entry *field; struct ftrace_entry *field;
...@@ -573,7 +548,6 @@ static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags) ...@@ -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 = { static struct trace_event trace_fn_event = {
.type = TRACE_FN, .type = TRACE_FN,
.trace = trace_fn_trace, .trace = trace_fn_trace,
.latency_trace = trace_fn_latency,
.raw = trace_fn_raw, .raw = trace_fn_raw,
.hex = trace_fn_hex, .hex = trace_fn_hex,
.binary = trace_fn_bin, .binary = trace_fn_bin,
...@@ -705,7 +679,6 @@ static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, ...@@ -705,7 +679,6 @@ static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter,
static struct trace_event trace_ctx_event = { static struct trace_event trace_ctx_event = {
.type = TRACE_CTX, .type = TRACE_CTX,
.trace = trace_ctx_print, .trace = trace_ctx_print,
.latency_trace = trace_ctx_print,
.raw = trace_ctx_raw, .raw = trace_ctx_raw,
.hex = trace_ctx_hex, .hex = trace_ctx_hex,
.binary = trace_ctxwake_bin, .binary = trace_ctxwake_bin,
...@@ -714,7 +687,6 @@ static struct trace_event trace_ctx_event = { ...@@ -714,7 +687,6 @@ static struct trace_event trace_ctx_event = {
static struct trace_event trace_wake_event = { static struct trace_event trace_wake_event = {
.type = TRACE_WAKE, .type = TRACE_WAKE,
.trace = trace_wake_print, .trace = trace_wake_print,
.latency_trace = trace_wake_print,
.raw = trace_wake_raw, .raw = trace_wake_raw,
.hex = trace_wake_hex, .hex = trace_wake_hex,
.binary = trace_ctxwake_bin, .binary = trace_ctxwake_bin,
...@@ -770,7 +742,6 @@ static enum print_line_t trace_special_bin(struct trace_iterator *iter, ...@@ -770,7 +742,6 @@ static enum print_line_t trace_special_bin(struct trace_iterator *iter,
static struct trace_event trace_special_event = { static struct trace_event trace_special_event = {
.type = TRACE_SPECIAL, .type = TRACE_SPECIAL,
.trace = trace_special_print, .trace = trace_special_print,
.latency_trace = trace_special_print,
.raw = trace_special_print, .raw = trace_special_print,
.hex = trace_special_hex, .hex = trace_special_hex,
.binary = trace_special_bin, .binary = trace_special_bin,
...@@ -808,7 +779,6 @@ static enum print_line_t trace_stack_print(struct trace_iterator *iter, ...@@ -808,7 +779,6 @@ static enum print_line_t trace_stack_print(struct trace_iterator *iter,
static struct trace_event trace_stack_event = { static struct trace_event trace_stack_event = {
.type = TRACE_STACK, .type = TRACE_STACK,
.trace = trace_stack_print, .trace = trace_stack_print,
.latency_trace = trace_stack_print,
.raw = trace_special_print, .raw = trace_special_print,
.hex = trace_special_hex, .hex = trace_special_hex,
.binary = trace_special_bin, .binary = trace_special_bin,
...@@ -838,7 +808,6 @@ static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, ...@@ -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 = { static struct trace_event trace_user_stack_event = {
.type = TRACE_USER_STACK, .type = TRACE_USER_STACK,
.trace = trace_user_stack_print, .trace = trace_user_stack_print,
.latency_trace = trace_user_stack_print,
.raw = trace_special_print, .raw = trace_special_print,
.hex = trace_special_hex, .hex = trace_special_hex,
.binary = trace_special_bin, .binary = trace_special_bin,
...@@ -883,7 +852,6 @@ static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) ...@@ -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 = { static struct trace_event trace_print_event = {
.type = TRACE_PRINT, .type = TRACE_PRINT,
.trace = trace_print_print, .trace = trace_print_print,
.latency_trace = trace_print_print,
.raw = trace_print_raw, .raw = trace_print_raw,
}; };
......
...@@ -10,7 +10,6 @@ struct trace_event { ...@@ -10,7 +10,6 @@ struct trace_event {
struct hlist_node node; struct hlist_node node;
int type; int type;
trace_print_func trace; trace_print_func trace;
trace_print_func latency_trace;
trace_print_func raw; trace_print_func raw;
trace_print_func hex; trace_print_func hex;
trace_print_func binary; trace_print_func binary;
......
...@@ -32,6 +32,8 @@ static raw_spinlock_t wakeup_lock = ...@@ -32,6 +32,8 @@ static raw_spinlock_t wakeup_lock =
static void __wakeup_reset(struct trace_array *tr); static void __wakeup_reset(struct trace_array *tr);
static int save_lat_flag;
#ifdef CONFIG_FUNCTION_TRACER #ifdef CONFIG_FUNCTION_TRACER
/* /*
* irqsoff uses its own tracer function to keep the overhead down: * irqsoff uses its own tracer function to keep the overhead down:
...@@ -324,6 +326,9 @@ static void stop_wakeup_tracer(struct trace_array *tr) ...@@ -324,6 +326,9 @@ static void stop_wakeup_tracer(struct trace_array *tr)
static int __wakeup_tracer_init(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; tracing_max_latency = 0;
wakeup_trace = tr; wakeup_trace = tr;
start_wakeup_tracer(tr); start_wakeup_tracer(tr);
...@@ -347,6 +352,9 @@ static void wakeup_tracer_reset(struct trace_array *tr) ...@@ -347,6 +352,9 @@ static void wakeup_tracer_reset(struct trace_array *tr)
stop_wakeup_tracer(tr); stop_wakeup_tracer(tr);
/* make sure we put back any tasks we are tracing */ /* make sure we put back any tasks we are tracing */
wakeup_reset(tr); wakeup_reset(tr);
if (!save_lat_flag)
trace_flags &= ~TRACE_ITER_LATENCY_FMT;
} }
static void wakeup_tracer_start(struct trace_array *tr) static void wakeup_tracer_start(struct trace_array *tr)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册