Commit c7078de1 authored by Ingo Molnar's avatar Ingo Molnar Committed by Thomas Gleixner

ftrace: add tracing_cpumask

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 4ac3ba41
...@@ -70,6 +70,23 @@ static DECLARE_WAIT_QUEUE_HEAD(trace_wait); ...@@ -70,6 +70,23 @@ static DECLARE_WAIT_QUEUE_HEAD(trace_wait);
unsigned long trace_flags = TRACE_ITER_PRINT_PARENT; unsigned long trace_flags = TRACE_ITER_PRINT_PARENT;
/*
* Only trace on a CPU if the bitmask is set:
*/
static cpumask_t tracing_cpumask __read_mostly = CPU_MASK_ALL;
/*
* The tracer itself will not take this lock, but still we want
* to provide a consistent cpumask to user-space:
*/
static DEFINE_MUTEX(tracing_cpumask_update_lock);
/*
* Temporary storage for the character representation of the
* CPU bitmask:
*/
static char mask_str[NR_CPUS];
void trace_wake_up(void) void trace_wake_up(void)
{ {
/* /*
...@@ -1754,9 +1771,49 @@ static struct file_operations tracing_lt_fops = { ...@@ -1754,9 +1771,49 @@ static struct file_operations tracing_lt_fops = {
}; };
static struct file_operations show_traces_fops = { static struct file_operations show_traces_fops = {
.open = show_traces_open, .open = show_traces_open,
.read = seq_read, .read = seq_read,
.release = seq_release, .release = seq_release,
};
static ssize_t
tracing_cpumask_read(struct file *filp, char __user *ubuf,
size_t count, loff_t *ppos)
{
int err;
count = min(count, (size_t)NR_CPUS);
mutex_lock(&tracing_cpumask_update_lock);
cpumask_scnprintf(mask_str, NR_CPUS, tracing_cpumask);
err = copy_to_user(ubuf, mask_str, count);
if (err)
count = -EFAULT;
mutex_unlock(&tracing_cpumask_update_lock);
return count;
}
static ssize_t
tracing_cpumask_write(struct file *filp, const char __user *ubuf,
size_t count, loff_t *ppos)
{
int err;
mutex_lock(&tracing_cpumask_update_lock);
err = cpumask_parse_user(ubuf, count, tracing_cpumask);
mutex_unlock(&tracing_cpumask_update_lock);
if (err)
return err;
return count;
}
static struct file_operations tracing_cpumask_fops = {
.open = tracing_open_generic,
.read = tracing_cpumask_read,
.write = tracing_cpumask_write,
}; };
static ssize_t static ssize_t
...@@ -1837,9 +1894,9 @@ tracing_iter_ctrl_write(struct file *filp, const char __user *ubuf, ...@@ -1837,9 +1894,9 @@ tracing_iter_ctrl_write(struct file *filp, const char __user *ubuf,
} }
static struct file_operations tracing_iter_fops = { static struct file_operations tracing_iter_fops = {
.open = tracing_open_generic, .open = tracing_open_generic,
.read = tracing_iter_ctrl_read, .read = tracing_iter_ctrl_read,
.write = tracing_iter_ctrl_write, .write = tracing_iter_ctrl_write,
}; };
static const char readme_msg[] = static const char readme_msg[] =
...@@ -1870,8 +1927,8 @@ tracing_readme_read(struct file *filp, char __user *ubuf, ...@@ -1870,8 +1927,8 @@ tracing_readme_read(struct file *filp, char __user *ubuf,
} }
static struct file_operations tracing_readme_fops = { static struct file_operations tracing_readme_fops = {
.open = tracing_open_generic, .open = tracing_open_generic,
.read = tracing_readme_read, .read = tracing_readme_read,
}; };
static ssize_t static ssize_t
...@@ -2334,6 +2391,11 @@ static __init void tracer_init_debugfs(void) ...@@ -2334,6 +2391,11 @@ static __init void tracer_init_debugfs(void)
if (!entry) if (!entry)
pr_warning("Could not create debugfs 'iter_ctrl' entry\n"); pr_warning("Could not create debugfs 'iter_ctrl' entry\n");
entry = debugfs_create_file("tracing_cpumask", 0644, d_tracer,
NULL, &tracing_cpumask_fops);
if (!entry)
pr_warning("Could not create debugfs 'tracing_cpumask' entry\n");
entry = debugfs_create_file("latency_trace", 0444, d_tracer, entry = debugfs_create_file("latency_trace", 0444, d_tracer,
&global_trace, &tracing_lt_fops); &global_trace, &tracing_lt_fops);
if (!entry) if (!entry)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment