aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace_stat.c41
1 files changed, 5 insertions, 36 deletions
diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c
index 847f88a6194b..7af67360b330 100644
--- a/kernel/trace/trace_stat.c
+++ b/kernel/trace/trace_stat.c
@@ -43,46 +43,15 @@ static DEFINE_MUTEX(all_stat_sessions_mutex);
43/* The root directory for all stat files */ 43/* The root directory for all stat files */
44static struct dentry *stat_dir; 44static struct dentry *stat_dir;
45 45
46/* 46static void __reset_stat_session(struct stat_session *session)
47 * Iterate through the rbtree using a post order traversal path
48 * to release the next node.
49 * It won't necessary release one at each iteration
50 * but it will at least advance closer to the next one
51 * to be released.
52 */
53static struct rb_node *release_next(struct tracer_stat *ts,
54 struct rb_node *node)
55{ 47{
56 struct stat_node *snode; 48 struct stat_node *snode, *n;
57 struct rb_node *parent = rb_parent(node);
58
59 if (node->rb_left)
60 return node->rb_left;
61 else if (node->rb_right)
62 return node->rb_right;
63 else {
64 if (!parent)
65 ;
66 else if (parent->rb_left == node)
67 parent->rb_left = NULL;
68 else
69 parent->rb_right = NULL;
70 49
71 snode = container_of(node, struct stat_node, node); 50 rbtree_postorder_for_each_entry_safe(snode, n, &session->stat_root, node) {
72 if (ts->stat_release) 51 if (session->ts->stat_release)
73 ts->stat_release(snode->stat); 52 session->ts->stat_release(snode->stat);
74 kfree(snode); 53 kfree(snode);
75
76 return parent;
77 } 54 }
78}
79
80static void __reset_stat_session(struct stat_session *session)
81{
82 struct rb_node *node = session->stat_root.rb_node;
83
84 while (node)
85 node = release_next(session->ts, node);
86 55
87 session->stat_root = RB_ROOT; 56 session->stat_root = RB_ROOT;
88} 57}