Commit 9b71272b authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'tracing-fixes-for-linus' of...

Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  ftrace: Fix the output of profile
  ring-buffer: Make it generally available
  ftrace: Remove duplicate newline
  tracing: Fix trace_buf_size boot option
  ftrace: Fix t_hash_start()
  ftrace: Don't manipulate @pos in t_start()
  ftrace: Don't increment @pos in g_start()
  tracing: Reset iterator in t_start()
  trace_stat: Don't increment @pos in seq start()
  tracing_bprintk: Don't increment @pos in t_start()
  tracing/events: Don't increment @pos in s_start()
parents 61abfd2d 0296e425
......@@ -2467,7 +2467,8 @@ and is between 256 and 4096 characters. It is defined in the file
tp720= [HW,PS2]
trace_buf_size=nn[KMG] [ftrace] will set tracing buffer size.
trace_buf_size=nn[KMG]
[FTRACE] will set tracing buffer size.
trix= [HW,OSS] MediaTrix AudioTrix Pro
Format:
......
......@@ -96,6 +96,7 @@ obj-$(CONFIG_HAVE_GENERIC_DMA_COHERENT) += dma-coherent.o
obj-$(CONFIG_FUNCTION_TRACER) += trace/
obj-$(CONFIG_TRACING) += trace/
obj-$(CONFIG_X86_DS) += trace/
obj-$(CONFIG_RING_BUFFER) += trace/
obj-$(CONFIG_SMP) += sched_cpupri.o
obj-$(CONFIG_SLOW_WORK) += slow-work.o
obj-$(CONFIG_PERF_COUNTERS) += perf_counter.o
......
......@@ -291,7 +291,9 @@ function_stat_next(void *v, int idx)
pg = (struct ftrace_profile_page *)((unsigned long)rec & PAGE_MASK);
again:
if (idx != 0)
rec++;
if ((void *)rec >= (void *)&pg->records[pg->index]) {
pg = pg->next;
if (!pg)
......@@ -1417,10 +1419,20 @@ static void *t_hash_start(struct seq_file *m, loff_t *pos)
{
struct ftrace_iterator *iter = m->private;
void *p = NULL;
loff_t l;
if (!(iter->flags & FTRACE_ITER_HASH))
*pos = 0;
iter->flags |= FTRACE_ITER_HASH;
return t_hash_next(m, p, pos);
iter->hidx = 0;
for (l = 0; l <= *pos; ) {
p = t_hash_next(m, p, &l);
if (!p)
break;
}
return p;
}
static int t_hash_show(struct seq_file *m, void *v)
......@@ -1467,8 +1479,6 @@ t_next(struct seq_file *m, void *v, loff_t *pos)
iter->pg = iter->pg->next;
iter->idx = 0;
goto retry;
} else {
iter->idx = -1;
}
} else {
rec = &iter->pg->records[iter->idx++];
......@@ -1497,6 +1507,7 @@ static void *t_start(struct seq_file *m, loff_t *pos)
{
struct ftrace_iterator *iter = m->private;
void *p = NULL;
loff_t l;
mutex_lock(&ftrace_lock);
/*
......@@ -1508,23 +1519,21 @@ static void *t_start(struct seq_file *m, loff_t *pos)
if (*pos > 0)
return t_hash_start(m, pos);
iter->flags |= FTRACE_ITER_PRINTALL;
(*pos)++;
return iter;
}
if (iter->flags & FTRACE_ITER_HASH)
return t_hash_start(m, pos);
if (*pos > 0) {
if (iter->idx < 0)
return p;
(*pos)--;
iter->idx--;
iter->pg = ftrace_pages_start;
iter->idx = 0;
for (l = 0; l <= *pos; ) {
p = t_next(m, p, &l);
if (!p)
break;
}
p = t_next(m, p, pos);
if (!p)
if (!p && iter->flags & FTRACE_ITER_FILTER)
return t_hash_start(m, pos);
return p;
......@@ -2500,32 +2509,31 @@ int ftrace_graph_count;
unsigned long ftrace_graph_funcs[FTRACE_GRAPH_MAX_FUNCS] __read_mostly;
static void *
g_next(struct seq_file *m, void *v, loff_t *pos)
__g_next(struct seq_file *m, loff_t *pos)
{
unsigned long *array = m->private;
int index = *pos;
(*pos)++;
if (index >= ftrace_graph_count)
if (*pos >= ftrace_graph_count)
return NULL;
return &array[*pos];
}
return &array[index];
static void *
g_next(struct seq_file *m, void *v, loff_t *pos)
{
(*pos)++;
return __g_next(m, pos);
}
static void *g_start(struct seq_file *m, loff_t *pos)
{
void *p = NULL;
mutex_lock(&graph_lock);
/* Nothing, tell g_show to print all functions are enabled */
if (!ftrace_graph_count && !*pos)
return (void *)1;
p = g_next(m, p, pos);
return p;
return __g_next(m, pos);
}
static void g_stop(struct seq_file *m, void *p)
......
......@@ -1563,6 +1563,8 @@ rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer,
return NULL;
}
#ifdef CONFIG_TRACING
#define TRACE_RECURSIVE_DEPTH 16
static int trace_recursive_lock(void)
......@@ -1593,6 +1595,13 @@ static void trace_recursive_unlock(void)
current->trace_recursion--;
}
#else
#define trace_recursive_lock() (0)
#define trace_recursive_unlock() do { } while (0)
#endif
static DEFINE_PER_CPU(int, rb_need_resched);
/**
......@@ -3104,6 +3113,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
}
EXPORT_SYMBOL_GPL(ring_buffer_read_page);
#ifdef CONFIG_TRACING
static ssize_t
rb_simple_read(struct file *filp, char __user *ubuf,
size_t cnt, loff_t *ppos)
......@@ -3171,6 +3181,7 @@ static __init int rb_init_debugfs(void)
}
fs_initcall(rb_init_debugfs);
#endif
#ifdef CONFIG_HOTPLUG_CPU
static int rb_cpu_notify(struct notifier_block *self,
......
......@@ -284,13 +284,12 @@ void trace_wake_up(void)
static int __init set_buf_size(char *str)
{
unsigned long buf_size;
int ret;
if (!str)
return 0;
ret = strict_strtoul(str, 0, &buf_size);
buf_size = memparse(str, &str);
/* nr_entries can not be zero */
if (ret < 0 || buf_size == 0)
if (buf_size == 0)
return 0;
trace_buf_size = buf_size;
return 1;
......@@ -2053,25 +2052,23 @@ static int tracing_open(struct inode *inode, struct file *file)
static void *
t_next(struct seq_file *m, void *v, loff_t *pos)
{
struct tracer *t = m->private;
struct tracer *t = v;
(*pos)++;
if (t)
t = t->next;
m->private = t;
return t;
}
static void *t_start(struct seq_file *m, loff_t *pos)
{
struct tracer *t = m->private;
struct tracer *t;
loff_t l = 0;
mutex_lock(&trace_types_lock);
for (; t && l < *pos; t = t_next(m, t, &l))
for (t = trace_types; t && l < *pos; t = t_next(m, t, &l))
;
return t;
......@@ -2107,18 +2104,10 @@ static struct seq_operations show_traces_seq_ops = {
static int show_traces_open(struct inode *inode, struct file *file)
{
int ret;
if (tracing_disabled)
return -ENODEV;
ret = seq_open(file, &show_traces_seq_ops);
if (!ret) {
struct seq_file *m = file->private_data;
m->private = trace_types;
}
return ret;
return seq_open(file, &show_traces_seq_ops);
}
static ssize_t
......
......@@ -597,6 +597,7 @@ print_graph_function(struct trace_iterator *iter)
extern struct pid *ftrace_pid_trace;
#ifdef CONFIG_FUNCTION_TRACER
static inline int ftrace_trace_task(struct task_struct *task)
{
if (!ftrace_pid_trace)
......@@ -604,6 +605,12 @@ static inline int ftrace_trace_task(struct task_struct *task)
return test_tsk_trace_trace(task);
}
#else
static inline int ftrace_trace_task(struct task_struct *task)
{
return 1;
}
#endif
/*
* trace_iterator_flags is an enumeration that defines bit
......
......@@ -300,10 +300,18 @@ t_next(struct seq_file *m, void *v, loff_t *pos)
static void *t_start(struct seq_file *m, loff_t *pos)
{
struct ftrace_event_call *call = NULL;
loff_t l;
mutex_lock(&event_mutex);
if (*pos == 0)
m->private = ftrace_events.next;
return t_next(m, NULL, pos);
for (l = 0; l <= *pos; ) {
call = t_next(m, NULL, &l);
if (!call)
break;
}
return call;
}
static void *
......@@ -332,10 +340,18 @@ s_next(struct seq_file *m, void *v, loff_t *pos)
static void *s_start(struct seq_file *m, loff_t *pos)
{
struct ftrace_event_call *call = NULL;
loff_t l;
mutex_lock(&event_mutex);
if (*pos == 0)
m->private = ftrace_events.next;
return s_next(m, NULL, pos);
for (l = 0; l <= *pos; ) {
call = s_next(m, NULL, &l);
if (!call)
break;
}
return call;
}
static int t_show(struct seq_file *m, void *v)
......
......@@ -302,8 +302,7 @@ ftrace_trace_onoff_print(struct seq_file *m, unsigned long ip,
if (count == -1)
seq_printf(m, ":unlimited\n");
else
seq_printf(m, ":count=%ld", count);
seq_putc(m, '\n');
seq_printf(m, ":count=%ld\n", count);
return 0;
}
......
......@@ -155,25 +155,19 @@ int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap)
EXPORT_SYMBOL_GPL(__ftrace_vprintk);
static void *
t_next(struct seq_file *m, void *v, loff_t *pos)
t_start(struct seq_file *m, loff_t *pos)
{
const char **fmt = m->private;
const char **next = fmt;
(*pos)++;
const char **fmt = __start___trace_bprintk_fmt + *pos;
if ((unsigned long)fmt >= (unsigned long)__stop___trace_bprintk_fmt)
return NULL;
next = fmt;
m->private = ++next;
return fmt;
}
static void *t_start(struct seq_file *m, loff_t *pos)
static void *t_next(struct seq_file *m, void * v, loff_t *pos)
{
return t_next(m, NULL, pos);
(*pos)++;
return t_start(m, pos);
}
static int t_show(struct seq_file *m, void *v)
......@@ -224,15 +218,7 @@ static const struct seq_operations show_format_seq_ops = {
static int
ftrace_formats_open(struct inode *inode, struct file *file)
{
int ret;
ret = seq_open(file, &show_format_seq_ops);
if (!ret) {
struct seq_file *m = file->private_data;
m->private = __start___trace_bprintk_fmt;
}
return ret;
return seq_open(file, &show_format_seq_ops);
}
static const struct file_operations ftrace_formats_fops = {
......
......@@ -199,17 +199,13 @@ static void *stat_seq_start(struct seq_file *s, loff_t *pos)
mutex_lock(&session->stat_mutex);
/* If we are in the beginning of the file, print the headers */
if (!*pos && session->ts->stat_headers) {
(*pos)++;
if (!*pos && session->ts->stat_headers)
return SEQ_START_TOKEN;
}
node = rb_first(&session->stat_root);
for (i = 0; node && i < *pos; i++)
node = rb_next(node);
(*pos)++;
return node;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment