forked from luck/tmp_suning_uos_patched
ftrace: Move setting of clock-source out of options
There are many clock sources for the tracing system but we can only enable/disable one at a time with the trace/options file. We can move the setting of clock-source out of options and add a separate file for it: # cat trace_clock [local] global # echo global > trace_clock # cat trace_clock local [global] Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> LKML-Reference: <4A939D08.6050604@cn.fujitsu.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
87a342f5db
commit
5079f3261f
|
@ -323,12 +323,21 @@ static const char *trace_options[] = {
|
||||||
"printk-msg-only",
|
"printk-msg-only",
|
||||||
"context-info",
|
"context-info",
|
||||||
"latency-format",
|
"latency-format",
|
||||||
"global-clock",
|
|
||||||
"sleep-time",
|
"sleep-time",
|
||||||
"graph-time",
|
"graph-time",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
u64 (*func)(void);
|
||||||
|
const char *name;
|
||||||
|
} trace_clocks[] = {
|
||||||
|
{ trace_clock_local, "local" },
|
||||||
|
{ trace_clock_global, "global" },
|
||||||
|
};
|
||||||
|
|
||||||
|
int trace_clock_id;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ftrace_max_lock is used to protect the swapping of buffers
|
* ftrace_max_lock is used to protect the swapping of buffers
|
||||||
* when taking a max snapshot. The buffers themselves are
|
* when taking a max snapshot. The buffers themselves are
|
||||||
|
@ -2159,22 +2168,6 @@ static void set_tracer_flags(unsigned int mask, int enabled)
|
||||||
trace_flags |= mask;
|
trace_flags |= mask;
|
||||||
else
|
else
|
||||||
trace_flags &= ~mask;
|
trace_flags &= ~mask;
|
||||||
|
|
||||||
if (mask == TRACE_ITER_GLOBAL_CLK) {
|
|
||||||
u64 (*func)(void);
|
|
||||||
|
|
||||||
if (enabled)
|
|
||||||
func = trace_clock_global;
|
|
||||||
else
|
|
||||||
func = trace_clock_local;
|
|
||||||
|
|
||||||
mutex_lock(&trace_types_lock);
|
|
||||||
ring_buffer_set_clock(global_trace.buffer, func);
|
|
||||||
|
|
||||||
if (max_tr.buffer)
|
|
||||||
ring_buffer_set_clock(max_tr.buffer, func);
|
|
||||||
mutex_unlock(&trace_types_lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
|
@ -3142,6 +3135,62 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t tracing_clock_read(struct file *filp, char __user *ubuf,
|
||||||
|
size_t cnt, loff_t *ppos)
|
||||||
|
{
|
||||||
|
char buf[64];
|
||||||
|
int bufiter = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(trace_clocks); i++)
|
||||||
|
bufiter += snprintf(buf + bufiter, sizeof(buf) - bufiter,
|
||||||
|
"%s%s%s%s", i ? " " : "",
|
||||||
|
i == trace_clock_id ? "[" : "", trace_clocks[i].name,
|
||||||
|
i == trace_clock_id ? "]" : "");
|
||||||
|
bufiter += snprintf(buf + bufiter, sizeof(buf) - bufiter, "\n");
|
||||||
|
|
||||||
|
return simple_read_from_buffer(ubuf, cnt, ppos, buf, bufiter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t tracing_clock_write(struct file *filp, const char __user *ubuf,
|
||||||
|
size_t cnt, loff_t *fpos)
|
||||||
|
{
|
||||||
|
char buf[64];
|
||||||
|
const char *clockstr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (cnt >= sizeof(buf))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (copy_from_user(&buf, ubuf, cnt))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
buf[cnt] = 0;
|
||||||
|
|
||||||
|
clockstr = strstrip(buf);
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(trace_clocks); i++) {
|
||||||
|
if (strcmp(trace_clocks[i].name, clockstr) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == ARRAY_SIZE(trace_clocks))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
trace_clock_id = i;
|
||||||
|
|
||||||
|
mutex_lock(&trace_types_lock);
|
||||||
|
|
||||||
|
ring_buffer_set_clock(global_trace.buffer, trace_clocks[i].func);
|
||||||
|
if (max_tr.buffer)
|
||||||
|
ring_buffer_set_clock(max_tr.buffer, trace_clocks[i].func);
|
||||||
|
|
||||||
|
mutex_unlock(&trace_types_lock);
|
||||||
|
|
||||||
|
*fpos += cnt;
|
||||||
|
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct file_operations tracing_max_lat_fops = {
|
static const struct file_operations tracing_max_lat_fops = {
|
||||||
.open = tracing_open_generic,
|
.open = tracing_open_generic,
|
||||||
.read = tracing_max_lat_read,
|
.read = tracing_max_lat_read,
|
||||||
|
@ -3179,6 +3228,12 @@ static const struct file_operations tracing_mark_fops = {
|
||||||
.write = tracing_mark_write,
|
.write = tracing_mark_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct file_operations trace_clock_fops = {
|
||||||
|
.open = tracing_open_generic,
|
||||||
|
.read = tracing_clock_read,
|
||||||
|
.write = tracing_clock_write,
|
||||||
|
};
|
||||||
|
|
||||||
struct ftrace_buffer_info {
|
struct ftrace_buffer_info {
|
||||||
struct trace_array *tr;
|
struct trace_array *tr;
|
||||||
void *spare;
|
void *spare;
|
||||||
|
@ -3918,6 +3973,9 @@ static __init int tracer_init_debugfs(void)
|
||||||
trace_create_file("saved_cmdlines", 0444, d_tracer,
|
trace_create_file("saved_cmdlines", 0444, d_tracer,
|
||||||
NULL, &tracing_saved_cmdlines_fops);
|
NULL, &tracing_saved_cmdlines_fops);
|
||||||
|
|
||||||
|
trace_create_file("trace_clock", 0644, d_tracer, NULL,
|
||||||
|
&trace_clock_fops);
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
|
trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
|
||||||
&ftrace_update_tot_cnt, &tracing_dyn_info_fops);
|
&ftrace_update_tot_cnt, &tracing_dyn_info_fops);
|
||||||
|
|
|
@ -568,6 +568,8 @@ trace_vprintk(unsigned long ip, const char *fmt, va_list args);
|
||||||
|
|
||||||
extern unsigned long trace_flags;
|
extern unsigned long trace_flags;
|
||||||
|
|
||||||
|
extern int trace_clock_id;
|
||||||
|
|
||||||
/* Standard output formatting function used for function return traces */
|
/* Standard output formatting function used for function return traces */
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
extern enum print_line_t print_graph_function(struct trace_iterator *iter);
|
extern enum print_line_t print_graph_function(struct trace_iterator *iter);
|
||||||
|
@ -656,9 +658,8 @@ enum trace_iterator_flags {
|
||||||
TRACE_ITER_PRINTK_MSGONLY = 0x10000,
|
TRACE_ITER_PRINTK_MSGONLY = 0x10000,
|
||||||
TRACE_ITER_CONTEXT_INFO = 0x20000, /* Print pid/cpu/time */
|
TRACE_ITER_CONTEXT_INFO = 0x20000, /* Print pid/cpu/time */
|
||||||
TRACE_ITER_LATENCY_FMT = 0x40000,
|
TRACE_ITER_LATENCY_FMT = 0x40000,
|
||||||
TRACE_ITER_GLOBAL_CLK = 0x80000,
|
TRACE_ITER_SLEEP_TIME = 0x80000,
|
||||||
TRACE_ITER_SLEEP_TIME = 0x100000,
|
TRACE_ITER_GRAPH_TIME = 0x100000,
|
||||||
TRACE_ITER_GRAPH_TIME = 0x200000,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue
Block a user