aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-02-26 22:19:12 -0500
committerSteven Rostedt <srostedt@redhat.com>2009-02-26 22:22:46 -0500
commita8259075074fb09c230b4cd2c8d3ee3c49d6ecd1 (patch)
treeedd6a6ab5f0365e9f93f7e992e29ced3136eaaf9 /kernel/trace/trace.c
parent5d0859cef29167d45dc6cf89d19712145e6005d6 (diff)
tracing: add options directory and core option files
This patch creates an options directory in the debugfs, that contains the available tracing options. These files contain 1 or 0, where 1 is the option is enabled and 0 it is disabled. Simply echoing in 1 will enable the option and 0 will disable it. This patch only contains the core options, not the tracer options. Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r--kernel/trace/trace.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index bdaf60d3d337..40e983ed994f 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3093,6 +3093,121 @@ static void tracing_init_debugfs_percpu(long cpu)
3093#include "trace_selftest.c" 3093#include "trace_selftest.c"
3094#endif 3094#endif
3095 3095
3096static ssize_t
3097trace_options_core_read(struct file *filp, char __user *ubuf, size_t cnt,
3098 loff_t *ppos)
3099{
3100 long index = (long)filp->private_data;
3101 char *buf;
3102
3103 if (trace_flags & (1 << index))
3104 buf = "1\n";
3105 else
3106 buf = "0\n";
3107
3108 return simple_read_from_buffer(ubuf, cnt, ppos, buf, 2);
3109}
3110
3111static ssize_t
3112trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt,
3113 loff_t *ppos)
3114{
3115 long index = (long)filp->private_data;
3116 char buf[64];
3117 unsigned long val;
3118 int ret;
3119
3120 if (cnt >= sizeof(buf))
3121 return -EINVAL;
3122
3123 if (copy_from_user(&buf, ubuf, cnt))
3124 return -EFAULT;
3125
3126 buf[cnt] = 0;
3127
3128 ret = strict_strtoul(buf, 10, &val);
3129 if (ret < 0)
3130 return ret;
3131
3132 switch (val) {
3133 case 0:
3134 trace_flags &= ~(1 << index);
3135 break;
3136 case 1:
3137 trace_flags |= 1 << index;
3138 break;
3139
3140 default:
3141 return -EINVAL;
3142 }
3143
3144 *ppos += cnt;
3145
3146 return cnt;
3147}
3148
3149
3150static const struct file_operations trace_options_core_fops = {
3151 .open = tracing_open_generic,
3152 .read = trace_options_core_read,
3153 .write = trace_options_core_write,
3154};
3155
3156static struct dentry *trace_options_init_dentry(void)
3157{
3158 struct dentry *d_tracer;
3159 static struct dentry *t_options;
3160
3161 if (t_options)
3162 return t_options;
3163
3164 d_tracer = tracing_init_dentry();
3165 if (!d_tracer)
3166 return NULL;
3167
3168 t_options = debugfs_create_dir("options", d_tracer);
3169 if (!t_options) {
3170 pr_warning("Could not create debugfs directory 'options'\n");
3171 return NULL;
3172 }
3173
3174 return t_options;
3175}
3176
3177static struct dentry *
3178create_trace_option_core_file(const char *option, long index)
3179{
3180 struct dentry *t_options;
3181 struct dentry *entry;
3182
3183 t_options = trace_options_init_dentry();
3184 if (!t_options)
3185 return NULL;
3186
3187 entry = debugfs_create_file(option, 0644, t_options, (void *)index,
3188 &trace_options_core_fops);
3189
3190 return entry;
3191}
3192
3193static __init void create_trace_options_dir(void)
3194{
3195 struct dentry *t_options;
3196 struct dentry *entry;
3197 int i;
3198
3199 t_options = trace_options_init_dentry();
3200 if (!t_options)
3201 return;
3202
3203 for (i = 0; trace_options[i]; i++) {
3204 entry = create_trace_option_core_file(trace_options[i], i);
3205 if (!entry)
3206 pr_warning("Could not create debugfs %s entry\n",
3207 trace_options[i]);
3208 }
3209}
3210
3096static __init int tracer_init_debugfs(void) 3211static __init int tracer_init_debugfs(void)
3097{ 3212{
3098 struct dentry *d_tracer; 3213 struct dentry *d_tracer;
@@ -3111,6 +3226,8 @@ static __init int tracer_init_debugfs(void)
3111 if (!entry) 3226 if (!entry)
3112 pr_warning("Could not create debugfs 'trace_options' entry\n"); 3227 pr_warning("Could not create debugfs 'trace_options' entry\n");
3113 3228
3229 create_trace_options_dir();
3230
3114 entry = debugfs_create_file("tracing_cpumask", 0644, d_tracer, 3231 entry = debugfs_create_file("tracing_cpumask", 0644, d_tracer,
3115 NULL, &tracing_cpumask_fops); 3232 NULL, &tracing_cpumask_fops);
3116 if (!entry) 3233 if (!entry)