tracing: add global-clock option to provide cross CPU clock to traces
Impact: feature to allow better serialized clock This patch adds an option called "global-clock" that will allow the tracer to switch to a slower but more accurate (across CPUs) clock. Signed-off-by: Steven Rostedt <srostedt@redhat.com>
This commit is contained in:
@@ -315,6 +315,7 @@ static const char *trace_options[] = {
|
|||||||
"printk-msg-only",
|
"printk-msg-only",
|
||||||
"context-info",
|
"context-info",
|
||||||
"latency-format",
|
"latency-format",
|
||||||
|
"global-clock",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2251,6 +2252,34 @@ static int set_tracer_option(struct tracer *trace, char *cmp, int neg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_tracer_flags(unsigned int mask, int enabled)
|
||||||
|
{
|
||||||
|
/* do nothing if flag is already set */
|
||||||
|
if (!!(trace_flags & mask) == !!enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
|
trace_flags |= mask;
|
||||||
|
else
|
||||||
|
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
|
||||||
tracing_trace_options_write(struct file *filp, const char __user *ubuf,
|
tracing_trace_options_write(struct file *filp, const char __user *ubuf,
|
||||||
size_t cnt, loff_t *ppos)
|
size_t cnt, loff_t *ppos)
|
||||||
@@ -2278,10 +2307,7 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,
|
|||||||
int len = strlen(trace_options[i]);
|
int len = strlen(trace_options[i]);
|
||||||
|
|
||||||
if (strncmp(cmp, trace_options[i], len) == 0) {
|
if (strncmp(cmp, trace_options[i], len) == 0) {
|
||||||
if (neg)
|
set_tracer_flags(1 << i, !neg);
|
||||||
trace_flags &= ~(1 << i);
|
|
||||||
else
|
|
||||||
trace_flags |= (1 << i);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -667,6 +667,7 @@ 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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user