summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (VMware) <rostedt@goodmis.org>2017-04-20 11:46:03 -0400
committerSteven Rostedt (VMware) <rostedt@goodmis.org>2017-04-20 22:06:48 -0400
commit2290f2c589285d0031e3b7445afff8949f3fdbb6 (patch)
tree98f8e9db7a57eadcaf517404e0f5712b0a204461
parentcab5037950821caa1301df0223de657c6ee202a8 (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.c4
-rw-r--r--kernel/trace/trace.h2
-rw-r--r--kernel/trace/trace_functions.c21
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
760static void tracer_tracing_on(struct trace_array *tr) 760void 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)
1045EXPORT_SYMBOL_GPL(tracing_snapshot_alloc); 1045EXPORT_SYMBOL_GPL(tracing_snapshot_alloc);
1046#endif /* CONFIG_TRACER_SNAPSHOT */ 1046#endif /* CONFIG_TRACER_SNAPSHOT */
1047 1047
1048static void tracer_tracing_off(struct trace_array *tr) 1048void 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);
582int tracing_open_generic(struct inode *inode, struct file *filp); 582int tracing_open_generic(struct inode *inode, struct file *filp);
583bool tracing_is_disabled(void); 583bool tracing_is_disabled(void);
584int tracer_tracing_is_on(struct trace_array *tr); 584int tracer_tracing_is_on(struct trace_array *tr);
585void tracer_tracing_on(struct trace_array *tr);
586void tracer_tracing_off(struct trace_array *tr);
585struct dentry *trace_create_file(const char *name, 587struct 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
270static void update_traceon_count(struct ftrace_probe_ops *ops, 270static 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
338static void 339static 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
346static void 347static 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
357static void 358static 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/*