Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 140634
b: refs/heads/master
c: 5592217
h: refs/heads/master
v: v3
  • Loading branch information
Ingo Molnar committed Jan 15, 2009
1 parent 957106e commit 0f406af
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 77 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 42fab4b2cdc02cf28e2474ccfd75bc9225076590
refs/heads/master: 55922173f1f63903b6de03711ab8ff980cbe58d2
147 changes: 71 additions & 76 deletions trunk/kernel/trace/trace_stat.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,16 @@

/* List of stat entries from a tracer */
struct trace_stat_list {
struct list_head list;
void *stat;
struct list_head list;
void *stat;
};

/* A stat session is the stats output in one file */
struct tracer_stat_session {
struct list_head session_list;
struct tracer_stat *ts;
struct list_head stat_list;
struct mutex stat_mutex;
struct tracer_stat *ts;
struct list_head stat_list;
struct mutex stat_mutex;
struct dentry *file;
};

Expand All @@ -35,7 +35,7 @@ static LIST_HEAD(all_stat_sessions);
static DEFINE_MUTEX(all_stat_sessions_mutex);

/* The root directory for all stat files */
static struct dentry *stat_dir;
static struct dentry *stat_dir;


static void reset_stat_session(struct tracer_stat_session *session)
Expand All @@ -56,71 +56,6 @@ static void destroy_session(struct tracer_stat_session *session)
kfree(session);
}


static int init_stat_file(struct tracer_stat_session *session);

int register_stat_tracer(struct tracer_stat *trace)
{
struct tracer_stat_session *session, *node, *tmp;
int ret;

if (!trace)
return -EINVAL;

if (!trace->stat_start || !trace->stat_next || !trace->stat_show)
return -EINVAL;

/* Already registered? */
mutex_lock(&all_stat_sessions_mutex);
list_for_each_entry_safe(node, tmp, &all_stat_sessions, session_list) {
if (node->ts == trace) {
mutex_unlock(&all_stat_sessions_mutex);
return -EINVAL;
}
}
mutex_unlock(&all_stat_sessions_mutex);

/* Init the session */
session = kmalloc(sizeof(struct tracer_stat_session), GFP_KERNEL);
if (!session)
return -ENOMEM;

session->ts = trace;
INIT_LIST_HEAD(&session->session_list);
INIT_LIST_HEAD(&session->stat_list);
mutex_init(&session->stat_mutex);
session->file = NULL;

ret = init_stat_file(session);
if (ret) {
destroy_session(session);
return ret;
}

/* Register */
mutex_lock(&all_stat_sessions_mutex);
list_add_tail(&session->session_list, &all_stat_sessions);
mutex_unlock(&all_stat_sessions_mutex);

return 0;
}

void unregister_stat_tracer(struct tracer_stat *trace)
{
struct tracer_stat_session *node, *tmp;

mutex_lock(&all_stat_sessions_mutex);
list_for_each_entry_safe(node, tmp, &all_stat_sessions, session_list) {
if (node->ts == trace) {
list_del(&node->session_list);
destroy_session(node);
break;
}
}
mutex_unlock(&all_stat_sessions_mutex);
}


/*
* For tracers that don't provide a stat_cmp callback.
* This one will force an immediate insertion on tail of
Expand Down Expand Up @@ -252,10 +187,10 @@ static int stat_seq_show(struct seq_file *s, void *v)
}

static const struct seq_operations trace_stat_seq_ops = {
.start = stat_seq_start,
.next = stat_seq_next,
.stop = stat_seq_stop,
.show = stat_seq_show
.start = stat_seq_start,
.next = stat_seq_next,
.stop = stat_seq_stop,
.show = stat_seq_show
};

/* The session stat is refilled and resorted at each stat file opening */
Expand All @@ -275,7 +210,6 @@ static int tracing_stat_open(struct inode *inode, struct file *file)
return ret;
}


/*
* Avoid consuming memory with our now useless list.
*/
Expand Down Expand Up @@ -322,3 +256,64 @@ static int init_stat_file(struct tracer_stat_session *session)
return -ENOMEM;
return 0;
}

int register_stat_tracer(struct tracer_stat *trace)
{
struct tracer_stat_session *session, *node, *tmp;
int ret;

if (!trace)
return -EINVAL;

if (!trace->stat_start || !trace->stat_next || !trace->stat_show)
return -EINVAL;

/* Already registered? */
mutex_lock(&all_stat_sessions_mutex);
list_for_each_entry_safe(node, tmp, &all_stat_sessions, session_list) {
if (node->ts == trace) {
mutex_unlock(&all_stat_sessions_mutex);
return -EINVAL;
}
}
mutex_unlock(&all_stat_sessions_mutex);

/* Init the session */
session = kmalloc(sizeof(struct tracer_stat_session), GFP_KERNEL);
if (!session)
return -ENOMEM;

session->ts = trace;
INIT_LIST_HEAD(&session->session_list);
INIT_LIST_HEAD(&session->stat_list);
mutex_init(&session->stat_mutex);
session->file = NULL;

ret = init_stat_file(session);
if (ret) {
destroy_session(session);
return ret;
}

/* Register */
mutex_lock(&all_stat_sessions_mutex);
list_add_tail(&session->session_list, &all_stat_sessions);
mutex_unlock(&all_stat_sessions_mutex);

return 0;
}

void unregister_stat_tracer(struct tracer_stat *trace)
{
struct tracer_stat_session *node, *tmp;

mutex_lock(&all_stat_sessions_mutex);
list_for_each_entry_safe(node, tmp, &all_stat_sessions, session_list) {
if (node->ts == trace) {
list_del(&node->session_list);
destroy_session(node);
break;
}
}
mutex_unlock(&all_stat_sessions_mutex);
}

0 comments on commit 0f406af

Please sign in to comment.