diff options
author | Steven Rostedt (VMware) <rostedt@goodmis.org> | 2017-04-20 11:46:03 -0400 |
---|---|---|
committer | Steven Rostedt (VMware) <rostedt@goodmis.org> | 2017-04-20 22:06:48 -0400 |
commit | 2290f2c589285d0031e3b7445afff8949f3fdbb6 (patch) | |
tree | 98f8e9db7a57eadcaf517404e0f5712b0a204461 | |
parent | cab5037950821caa1301df0223de657c6ee202a8 (diff) |
tracing/ftrace: Allow for the traceonoff probe be unique to instances
Have the traceon/off function probe triggers affect only the instance they
are set in. This required making the trace_on/off accessible for other files
in the tracing directory.
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
-rw-r--r-- | kernel/trace/trace.c | 4 | ||||
-rw-r--r-- | kernel/trace/trace.h | 2 | ||||
-rw-r--r-- | kernel/trace/trace_functions.c | 21 |
3 files changed, 15 insertions, 12 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 57e9c546bebb..60c904fa5480 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -757,7 +757,7 @@ __trace_buffer_lock_reserve(struct ring_buffer *buffer, | |||
757 | return event; | 757 | return event; |
758 | } | 758 | } |
759 | 759 | ||
760 | static void tracer_tracing_on(struct trace_array *tr) | 760 | void tracer_tracing_on(struct trace_array *tr) |
761 | { | 761 | { |
762 | if (tr->trace_buffer.buffer) | 762 | if (tr->trace_buffer.buffer) |
763 | ring_buffer_record_on(tr->trace_buffer.buffer); | 763 | ring_buffer_record_on(tr->trace_buffer.buffer); |
@@ -1045,7 +1045,7 @@ void tracing_snapshot_alloc(void) | |||
1045 | EXPORT_SYMBOL_GPL(tracing_snapshot_alloc); | 1045 | EXPORT_SYMBOL_GPL(tracing_snapshot_alloc); |
1046 | #endif /* CONFIG_TRACER_SNAPSHOT */ | 1046 | #endif /* CONFIG_TRACER_SNAPSHOT */ |
1047 | 1047 | ||
1048 | static void tracer_tracing_off(struct trace_array *tr) | 1048 | void tracer_tracing_off(struct trace_array *tr) |
1049 | { | 1049 | { |
1050 | if (tr->trace_buffer.buffer) | 1050 | if (tr->trace_buffer.buffer) |
1051 | ring_buffer_record_off(tr->trace_buffer.buffer); | 1051 | ring_buffer_record_off(tr->trace_buffer.buffer); |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 8f6754fba778..bc011c1f3d71 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -582,6 +582,8 @@ void tracing_reset_all_online_cpus(void); | |||
582 | int tracing_open_generic(struct inode *inode, struct file *filp); | 582 | int tracing_open_generic(struct inode *inode, struct file *filp); |
583 | bool tracing_is_disabled(void); | 583 | bool tracing_is_disabled(void); |
584 | int tracer_tracing_is_on(struct trace_array *tr); | 584 | int tracer_tracing_is_on(struct trace_array *tr); |
585 | void tracer_tracing_on(struct trace_array *tr); | ||
586 | void tracer_tracing_off(struct trace_array *tr); | ||
585 | struct dentry *trace_create_file(const char *name, | 587 | struct dentry *trace_create_file(const char *name, |
586 | umode_t mode, | 588 | umode_t mode, |
587 | struct dentry *parent, | 589 | struct dentry *parent, |
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c index 7775e1ca5bad..8c30ca733a5c 100644 --- a/kernel/trace/trace_functions.c +++ b/kernel/trace/trace_functions.c | |||
@@ -268,7 +268,8 @@ static struct tracer function_trace __tracer_data = | |||
268 | 268 | ||
269 | #ifdef CONFIG_DYNAMIC_FTRACE | 269 | #ifdef CONFIG_DYNAMIC_FTRACE |
270 | static void update_traceon_count(struct ftrace_probe_ops *ops, | 270 | static void update_traceon_count(struct ftrace_probe_ops *ops, |
271 | unsigned long ip, bool on, | 271 | unsigned long ip, |
272 | struct trace_array *tr, bool on, | ||
272 | void *data) | 273 | void *data) |
273 | { | 274 | { |
274 | struct ftrace_func_mapper *mapper = data; | 275 | struct ftrace_func_mapper *mapper = data; |
@@ -313,13 +314,13 @@ static void update_traceon_count(struct ftrace_probe_ops *ops, | |||
313 | /* Make sure we see count before checking tracing state */ | 314 | /* Make sure we see count before checking tracing state */ |
314 | smp_rmb(); | 315 | smp_rmb(); |
315 | 316 | ||
316 | if (on == !!tracing_is_on()) | 317 | if (on == !!tracer_tracing_is_on(tr)) |
317 | return; | 318 | return; |
318 | 319 | ||
319 | if (on) | 320 | if (on) |
320 | tracing_on(); | 321 | tracer_tracing_on(tr); |
321 | else | 322 | else |
322 | tracing_off(); | 323 | tracer_tracing_off(tr); |
323 | 324 | ||
324 | /* Make sure tracing state is visible before updating count */ | 325 | /* Make sure tracing state is visible before updating count */ |
325 | smp_wmb(); | 326 | smp_wmb(); |
@@ -332,7 +333,7 @@ ftrace_traceon_count(unsigned long ip, unsigned long parent_ip, | |||
332 | struct trace_array *tr, struct ftrace_probe_ops *ops, | 333 | struct trace_array *tr, struct ftrace_probe_ops *ops, |
333 | void *data) | 334 | void *data) |
334 | { | 335 | { |
335 | update_traceon_count(ops, ip, 1, data); | 336 | update_traceon_count(ops, ip, tr, 1, data); |
336 | } | 337 | } |
337 | 338 | ||
338 | static void | 339 | static void |
@@ -340,7 +341,7 @@ ftrace_traceoff_count(unsigned long ip, unsigned long parent_ip, | |||
340 | struct trace_array *tr, struct ftrace_probe_ops *ops, | 341 | struct trace_array *tr, struct ftrace_probe_ops *ops, |
341 | void *data) | 342 | void *data) |
342 | { | 343 | { |
343 | update_traceon_count(ops, ip, 0, data); | 344 | update_traceon_count(ops, ip, tr, 0, data); |
344 | } | 345 | } |
345 | 346 | ||
346 | static void | 347 | static void |
@@ -348,10 +349,10 @@ ftrace_traceon(unsigned long ip, unsigned long parent_ip, | |||
348 | struct trace_array *tr, struct ftrace_probe_ops *ops, | 349 | struct trace_array *tr, struct ftrace_probe_ops *ops, |
349 | void *data) | 350 | void *data) |
350 | { | 351 | { |
351 | if (tracing_is_on()) | 352 | if (tracer_tracing_is_on(tr)) |
352 | return; | 353 | return; |
353 | 354 | ||
354 | tracing_on(); | 355 | tracer_tracing_on(tr); |
355 | } | 356 | } |
356 | 357 | ||
357 | static void | 358 | static void |
@@ -359,10 +360,10 @@ ftrace_traceoff(unsigned long ip, unsigned long parent_ip, | |||
359 | struct trace_array *tr, struct ftrace_probe_ops *ops, | 360 | struct trace_array *tr, struct ftrace_probe_ops *ops, |
360 | void *data) | 361 | void *data) |
361 | { | 362 | { |
362 | if (!tracing_is_on()) | 363 | if (!tracer_tracing_is_on(tr)) |
363 | return; | 364 | return; |
364 | 365 | ||
365 | tracing_off(); | 366 | tracer_tracing_off(tr); |
366 | } | 367 | } |
367 | 368 | ||
368 | /* | 369 | /* |