diff options
| author | Lai Jiangshan <laijs@cn.fujitsu.com> | 2009-07-06 04:10:18 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-07-10 06:14:05 -0400 |
| commit | d8ea37d5de58d35a39d0b4e7d209751aaa1b8174 (patch) | |
| tree | a64ffb2c844ad0f0e99616a69e6f548370d31665 /kernel/trace | |
| parent | 80098c200e2ee3b4c86a9d1e156dbcd05380e08f (diff) | |
tracing/stat: Add stat_release() callback
Add stat_release() callback to struct tracer_stat, so a stat tracer
can release it's entries after the stat file has been read out.
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <4A51B16A.6020708@cn.fujitsu.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/trace_stat.c | 7 | ||||
| -rw-r--r-- | kernel/trace/trace_stat.h | 2 |
2 files changed, 7 insertions, 2 deletions
diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c index e66f5e493342..f069461f10bd 100644 --- a/kernel/trace/trace_stat.c +++ b/kernel/trace/trace_stat.c | |||
| @@ -49,7 +49,8 @@ static struct dentry *stat_dir; | |||
| 49 | * but it will at least advance closer to the next one | 49 | * but it will at least advance closer to the next one |
| 50 | * to be released. | 50 | * to be released. |
| 51 | */ | 51 | */ |
| 52 | static struct rb_node *release_next(struct rb_node *node) | 52 | static struct rb_node *release_next(struct tracer_stat *ts, |
| 53 | struct rb_node *node) | ||
| 53 | { | 54 | { |
| 54 | struct stat_node *snode; | 55 | struct stat_node *snode; |
| 55 | struct rb_node *parent = rb_parent(node); | 56 | struct rb_node *parent = rb_parent(node); |
| @@ -67,6 +68,8 @@ static struct rb_node *release_next(struct rb_node *node) | |||
| 67 | parent->rb_right = NULL; | 68 | parent->rb_right = NULL; |
| 68 | 69 | ||
| 69 | snode = container_of(node, struct stat_node, node); | 70 | snode = container_of(node, struct stat_node, node); |
| 71 | if (ts->stat_release) | ||
| 72 | ts->stat_release(snode->stat); | ||
| 70 | kfree(snode); | 73 | kfree(snode); |
| 71 | 74 | ||
| 72 | return parent; | 75 | return parent; |
| @@ -78,7 +81,7 @@ static void reset_stat_session(struct stat_session *session) | |||
| 78 | struct rb_node *node = session->stat_root.rb_node; | 81 | struct rb_node *node = session->stat_root.rb_node; |
| 79 | 82 | ||
| 80 | while (node) | 83 | while (node) |
| 81 | node = release_next(node); | 84 | node = release_next(session->ts, node); |
| 82 | 85 | ||
| 83 | session->stat_root = RB_ROOT; | 86 | session->stat_root = RB_ROOT; |
| 84 | } | 87 | } |
diff --git a/kernel/trace/trace_stat.h b/kernel/trace/trace_stat.h index f3546a2cd826..8f03914b9a6a 100644 --- a/kernel/trace/trace_stat.h +++ b/kernel/trace/trace_stat.h | |||
| @@ -18,6 +18,8 @@ struct tracer_stat { | |||
| 18 | int (*stat_cmp)(void *p1, void *p2); | 18 | int (*stat_cmp)(void *p1, void *p2); |
| 19 | /* Print a stat entry */ | 19 | /* Print a stat entry */ |
| 20 | int (*stat_show)(struct seq_file *s, void *p); | 20 | int (*stat_show)(struct seq_file *s, void *p); |
| 21 | /* Release an entry */ | ||
| 22 | void (*stat_release)(void *stat); | ||
| 21 | /* Print the headers of your stat entries */ | 23 | /* Print the headers of your stat entries */ |
| 22 | int (*stat_headers)(struct seq_file *s); | 24 | int (*stat_headers)(struct seq_file *s); |
| 23 | }; | 25 | }; |
