trace_stat: Fix missing entry in stat file
PATCH 1/3 trace_stat: Fix missing entry in stat file
One entry is missing in the output of a stat file.
The cause is, when stat_seq_start() is called the 2nd time, we should start from the (pos-1)th elem in the rbtree but not pos, because pos == 0 is the header.
--- kernel/trace/trace_stat.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-)
kernel/trace/trace_stat.c +7 -3
@@ -203,17 +203,21 @@ static void *stat_seq_start(struct seq_file *s, loff_t *pos) {struct stat_session *session = s->private;struct rb_node *node; +int n = *pos;int i;/* Prevent from tracer switch or rbtree modification */ mutex_lock (&session->stat_mutex);/* If we are in the beginning of the file, print the headers */ -if (!*pos && session->ts->stat_headers) -return SEQ_START_TOKEN ; +if (session->ts->stat_headers) { +if (n ==0 ) +return SEQ_START_TOKEN ; + n--; + } node =rb_first (&session->stat_root); -for (i =0 ; node && i < *pos; i++) +for (i =0 ; node && i < n; i++) node =rb_next (node);return node;
Signature · 1 line
1.6.3
PATCH 2/3 trace_stack: Simplify seqfile code
Extract duplicate code in t_start() and t_next().
--- kernel/trace/trace_stack.c | 34 ++++++++++++---------------------- 1 files changed, 12 insertions(+), 22 deletions(-)
kernel/trace/trace_stack.c +12 -22
@@ -186,43 +186,33 @@ static const struct file_operations stack_max_size_fops = { };static void * -t_next (struct seq_file *m,void *v,loff_t *pos) +__next (struct seq_file *m,loff_t *pos) { -long i; +long n = *pos -1 ; - (*pos)++; - -if (v ==SEQ_START_TOKEN ) - i =0 ; -else { - i = *(long *)v; - i++; - } - -if (i >= max_stack_trace.nr_entries || - stack_dump_trace[i] ==ULONG_MAX ) +if (n >= max_stack_trace.nr_entries || stack_dump_trace[n] ==ULONG_MAX )return NULL ; - m->private = (void *)i; - + m->private = (void *)n;return &m->private; } -static void *t_start (struct seq_file *m,loff_t *pos) +static void * +t_next (struct seq_file *m,void *v,loff_t *pos) { -void *t =SEQ_START_TOKEN ; -loff_t l =0 ; + (*pos)++; +return __next (m, pos); +} +static void *t_start (struct seq_file *m,loff_t *pos) +{local_irq_disable ();__raw_spin_lock (&max_stack_lock);if (*pos ==0 )return SEQ_START_TOKEN ; -for (; t && l < *pos; t =t_next (m, t, &l)) - ; - -return t; +return __next (m, pos); }static void t_stop (struct seq_file *m,void *p)
Signature · 1 line
1.6.3
PATCH 3/3 ftrace: Simplify seqfile code
In reply to Li ZefanUse seq_release_private().
--- kernel/trace/ftrace.c | 15 ++------------- 1 files changed, 2 insertions(+), 13 deletions(-)
kernel/trace/ftrace.c +2 -13
@@ -1556,17 +1556,6 @@ ftrace_avail_open(struct inode *inode, struct file *file)return ret; } -int ftrace_avail_release (struct inode *inode,struct file *file) -{ -struct seq_file *m = (struct seq_file *)file->private_data; -struct ftrace_iterator *iter = m->private; - -seq_release (inode, file); -kfree (iter); - -return 0 ; -} -static int ftrace_failures_open (struct inode *inode,struct file *file) {
@@ -2427,14 +2416,14 @@ static const struct file_operations ftrace_avail_fops = { .open = ftrace_avail_open, .read = seq_read, .llseek = seq_lseek, - .release = ftrace_avail_release, + .release = seq_release_private, };static const struct file_operations ftrace_failures_fops = { .open = ftrace_failures_open, .read = seq_read, .llseek = seq_lseek, - .release = ftrace_avail_release, + .release = seq_release_private, };static const struct file_operations ftrace_filter_fops = {
Signature · 1 line
1.6.3
[tip:tracing/core] trace_stack: Simplify seqfile code
In reply to Li ZefanCommit-ID: 2fc5f0cff4cf1c4cd336d0f61f11bca6eeee1d84 Gitweb: http://git.kernel.org/tip/2fc5f0cff4cf1c4cd336d0f61f11bca6eeee1d84 Author: Li Zefan <[email protected]> AuthorDate: Mon, 17 Aug 2009 16:53:37 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 17 Aug 2009 11:25:09 +0200
trace_stack: Simplify seqfile code
Extract duplicate code in t_start() and t_next().
LKML-Reference: <[email protected]>
--- kernel/trace/trace_stack.c | 34 ++++++++++++---------------------- 1 files changed, 12 insertions(+), 22 deletions(-)
kernel/trace/trace_stack.c +12 -22
@@ -186,43 +186,33 @@ static const struct file_operations stack_max_size_fops = { };static void * -t_next (struct seq_file *m,void *v,loff_t *pos) +__next (struct seq_file *m,loff_t *pos) { -long i; +long n = *pos -1 ; - (*pos)++; - -if (v ==SEQ_START_TOKEN ) - i =0 ; -else { - i = *(long *)v; - i++; - } - -if (i >= max_stack_trace.nr_entries || - stack_dump_trace[i] ==ULONG_MAX ) +if (n >= max_stack_trace.nr_entries || stack_dump_trace[n] ==ULONG_MAX )return NULL ; - m->private = (void *)i; - + m->private = (void *)n;return &m->private; } -static void *t_start (struct seq_file *m,loff_t *pos) +static void * +t_next (struct seq_file *m,void *v,loff_t *pos) { -void *t =SEQ_START_TOKEN ; -loff_t l =0 ; + (*pos)++; +return __next (m, pos); +} +static void *t_start (struct seq_file *m,loff_t *pos) +{local_irq_disable ();__raw_spin_lock (&max_stack_lock);if (*pos ==0 )return SEQ_START_TOKEN ; -for (; t && l < *pos; t =t_next (m, t, &l)) - ; - -return t; +return __next (m, pos); }static void t_stop (struct seq_file *m,void *p)
Commit-ID: 97d53202a5670a08b79c8ef2e4fff1c1ee21317c Gitweb: http://git.kernel.org/tip/97d53202a5670a08b79c8ef2e4fff1c1ee21317c Author: Li Zefan <[email protected]> AuthorDate: Mon, 17 Aug 2009 16:52:53 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 17 Aug 2009 11:25:09 +0200
trace_stat: Fix missing entry in stat file
One entry is missing in the output of a stat file.
The cause is, when stat_seq_start() is called the 2nd time, we should start from the (pos-1)th elem in the rbtree but not pos, because pos == 0 is the header.
LKML-Reference: <[email protected]>
--- kernel/trace/trace_stat.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-)
kernel/trace/trace_stat.c +7 -3
@@ -203,17 +203,21 @@ static void *stat_seq_start(struct seq_file *s, loff_t *pos) {struct stat_session *session = s->private;struct rb_node *node; +int n = *pos;int i;/* Prevent from tracer switch or rbtree modification */ mutex_lock (&session->stat_mutex);/* If we are in the beginning of the file, print the headers */ -if (!*pos && session->ts->stat_headers) -return SEQ_START_TOKEN ; +if (session->ts->stat_headers) { +if (n ==0 ) +return SEQ_START_TOKEN ; + n--; + } node =rb_first (&session->stat_root); -for (i =0 ; node && i < *pos; i++) +for (i =0 ; node && i < n; i++) node =rb_next (node);return node;
[tip:tracing/core] ftrace: Simplify seqfile code
In reply to Li ZefanCommit-ID: 3be04b471b95b870bd129a138463756629e86f3f Gitweb: http://git.kernel.org/tip/3be04b471b95b870bd129a138463756629e86f3f Author: Li Zefan <[email protected]> AuthorDate: Mon, 17 Aug 2009 16:54:03 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 17 Aug 2009 11:25:10 +0200
ftrace: Simplify seqfile code
Use seq_release_private().
LKML-Reference: <[email protected]>
--- kernel/trace/ftrace.c | 15 ++------------- 1 files changed, 2 insertions(+), 13 deletions(-)
kernel/trace/ftrace.c +2 -13
@@ -1556,17 +1556,6 @@ ftrace_avail_open(struct inode *inode, struct file *file)return ret; } -int ftrace_avail_release (struct inode *inode,struct file *file) -{ -struct seq_file *m = (struct seq_file *)file->private_data; -struct ftrace_iterator *iter = m->private; - -seq_release (inode, file); -kfree (iter); - -return 0 ; -} -static int ftrace_failures_open (struct inode *inode,struct file *file) {
@@ -2427,14 +2416,14 @@ static const struct file_operations ftrace_avail_fops = { .open = ftrace_avail_open, .read = seq_read, .llseek = seq_lseek, - .release = ftrace_avail_release, + .release = seq_release_private, };static const struct file_operations ftrace_failures_fops = { .open = ftrace_failures_open, .read = seq_read, .llseek = seq_lseek, - .release = ftrace_avail_release, + .release = seq_release_private, };static const struct file_operations ftrace_filter_fops = {