tracing: Move the pid_list seq_file functions to be global
To allow other aspects of ftrace to use the pid_list logic, we need to reuse the seq_file functions. Making the generic part into functions that can be called by other files will help in this regard. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
d8275c454d
commit
5cc8976bd5
3 changed files with 77 additions and 31 deletions
|
@ -397,6 +397,77 @@ void trace_filter_add_remove_task(struct trace_pid_list *pid_list,
|
|||
clear_bit(task->pid, pid_list->pids);
|
||||
}
|
||||
|
||||
/**
|
||||
* trace_pid_next - Used for seq_file to get to the next pid of a pid_list
|
||||
* @pid_list: The pid list to show
|
||||
* @v: The last pid that was shown (+1 the actual pid to let zero be displayed)
|
||||
* @pos: The position of the file
|
||||
*
|
||||
* This is used by the seq_file "next" operation to iterate the pids
|
||||
* listed in a trace_pid_list structure.
|
||||
*
|
||||
* Returns the pid+1 as we want to display pid of zero, but NULL would
|
||||
* stop the iteration.
|
||||
*/
|
||||
void *trace_pid_next(struct trace_pid_list *pid_list, void *v, loff_t *pos)
|
||||
{
|
||||
unsigned long pid = (unsigned long)v;
|
||||
|
||||
(*pos)++;
|
||||
|
||||
/* pid already is +1 of the actual prevous bit */
|
||||
pid = find_next_bit(pid_list->pids, pid_list->pid_max, pid);
|
||||
|
||||
/* Return pid + 1 to allow zero to be represented */
|
||||
if (pid < pid_list->pid_max)
|
||||
return (void *)(pid + 1);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* trace_pid_start - Used for seq_file to start reading pid lists
|
||||
* @pid_list: The pid list to show
|
||||
* @pos: The position of the file
|
||||
*
|
||||
* This is used by seq_file "start" operation to start the iteration
|
||||
* of listing pids.
|
||||
*
|
||||
* Returns the pid+1 as we want to display pid of zero, but NULL would
|
||||
* stop the iteration.
|
||||
*/
|
||||
void *trace_pid_start(struct trace_pid_list *pid_list, loff_t *pos)
|
||||
{
|
||||
unsigned long pid;
|
||||
loff_t l = 0;
|
||||
|
||||
pid = find_first_bit(pid_list->pids, pid_list->pid_max);
|
||||
if (pid >= pid_list->pid_max)
|
||||
return NULL;
|
||||
|
||||
/* Return pid + 1 so that zero can be the exit value */
|
||||
for (pid++; pid && l < *pos;
|
||||
pid = (unsigned long)trace_pid_next(pid_list, (void *)pid, &l))
|
||||
;
|
||||
return (void *)pid;
|
||||
}
|
||||
|
||||
/**
|
||||
* trace_pid_show - show the current pid in seq_file processing
|
||||
* @m: The seq_file structure to write into
|
||||
* @v: A void pointer of the pid (+1) value to display
|
||||
*
|
||||
* Can be directly used by seq_file operations to display the current
|
||||
* pid value.
|
||||
*/
|
||||
int trace_pid_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long pid = (unsigned long)v - 1;
|
||||
|
||||
seq_printf(m, "%lu\n", pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cycle_t buffer_ftrace_now(struct trace_buffer *buf, int cpu)
|
||||
{
|
||||
u64 ts;
|
||||
|
|
|
@ -636,6 +636,9 @@ bool trace_ignore_this_task(struct trace_pid_list *filtered_pids,
|
|||
void trace_filter_add_remove_task(struct trace_pid_list *pid_list,
|
||||
struct task_struct *self,
|
||||
struct task_struct *task);
|
||||
void *trace_pid_next(struct trace_pid_list *pid_list, void *v, loff_t *pos);
|
||||
void *trace_pid_start(struct trace_pid_list *pid_list, loff_t *pos);
|
||||
int trace_pid_show(struct seq_file *m, void *v);
|
||||
|
||||
#ifdef CONFIG_TRACER_MAX_TRACE
|
||||
void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu);
|
||||
|
|
|
@ -983,18 +983,8 @@ p_next(struct seq_file *m, void *v, loff_t *pos)
|
|||
{
|
||||
struct trace_array *tr = m->private;
|
||||
struct trace_pid_list *pid_list = rcu_dereference_sched(tr->filtered_pids);
|
||||
unsigned long pid = (unsigned long)v;
|
||||
|
||||
(*pos)++;
|
||||
|
||||
/* pid already is +1 of the actual prevous bit */
|
||||
pid = find_next_bit(pid_list->pids, pid_list->pid_max, pid);
|
||||
|
||||
/* Return pid + 1 to allow zero to be represented */
|
||||
if (pid < pid_list->pid_max)
|
||||
return (void *)(pid + 1);
|
||||
|
||||
return NULL;
|
||||
return trace_pid_next(pid_list, v, pos);
|
||||
}
|
||||
|
||||
static void *p_start(struct seq_file *m, loff_t *pos)
|
||||
|
@ -1002,8 +992,6 @@ static void *p_start(struct seq_file *m, loff_t *pos)
|
|||
{
|
||||
struct trace_pid_list *pid_list;
|
||||
struct trace_array *tr = m->private;
|
||||
unsigned long pid;
|
||||
loff_t l = 0;
|
||||
|
||||
/*
|
||||
* Grab the mutex, to keep calls to p_next() having the same
|
||||
|
@ -1019,15 +1007,7 @@ static void *p_start(struct seq_file *m, loff_t *pos)
|
|||
if (!pid_list)
|
||||
return NULL;
|
||||
|
||||
pid = find_first_bit(pid_list->pids, pid_list->pid_max);
|
||||
if (pid >= pid_list->pid_max)
|
||||
return NULL;
|
||||
|
||||
/* Return pid + 1 so that zero can be the exit value */
|
||||
for (pid++; pid && l < *pos;
|
||||
pid = (unsigned long)p_next(m, (void *)pid, &l))
|
||||
;
|
||||
return (void *)pid;
|
||||
return trace_pid_start(pid_list, pos);
|
||||
}
|
||||
|
||||
static void p_stop(struct seq_file *m, void *p)
|
||||
|
@ -1037,14 +1017,6 @@ static void p_stop(struct seq_file *m, void *p)
|
|||
mutex_unlock(&event_mutex);
|
||||
}
|
||||
|
||||
static int p_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long pid = (unsigned long)v - 1;
|
||||
|
||||
seq_printf(m, "%lu\n", pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
event_enable_read(struct file *filp, char __user *ubuf, size_t cnt,
|
||||
loff_t *ppos)
|
||||
|
@ -1795,7 +1767,7 @@ static const struct seq_operations show_set_event_seq_ops = {
|
|||
static const struct seq_operations show_set_pid_seq_ops = {
|
||||
.start = p_start,
|
||||
.next = p_next,
|
||||
.show = p_show,
|
||||
.show = trace_pid_show,
|
||||
.stop = p_stop,
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue