1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * ring buffer based function tracer
4  *
5  * Copyright (C) 2007-2008 Steven Rostedt <srostedt@redhat.com>
6  * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com>
7  *
8  * Based on code from the latency_tracer, that is:
9  *
10  *  Copyright (C) 2004-2006 Ingo Molnar
11  *  Copyright (C) 2004 Nadia Yvette Chambers
12  */
13 #include <linux/ring_buffer.h>
14 #include <linux/debugfs.h>
15 #include <linux/uaccess.h>
16 #include <linux/ftrace.h>
17 #include <linux/slab.h>
18 #include <linux/fs.h>
19 
20 #include "trace.h"
21 
22 static void tracing_start_function_trace(struct trace_array *tr);
23 static void tracing_stop_function_trace(struct trace_array *tr);
24 static void
25 function_trace_call(unsigned long ip, unsigned long parent_ip,
26 		    struct ftrace_ops *op, struct ftrace_regs *fregs);
27 static void
28 function_stack_trace_call(unsigned long ip, unsigned long parent_ip,
29 			  struct ftrace_ops *op, struct ftrace_regs *fregs);
30 static void
31 function_no_repeats_trace_call(unsigned long ip, unsigned long parent_ip,
32 			       struct ftrace_ops *op, struct ftrace_regs *fregs);
33 static void
34 function_stack_no_repeats_trace_call(unsigned long ip, unsigned long parent_ip,
35 				     struct ftrace_ops *op,
36 				     struct ftrace_regs *fregs);
37 static struct tracer_flags func_flags;
38 
39 /* Our option */
40 enum {
41 
42 	TRACE_FUNC_NO_OPTS		= 0x0, /* No flags set. */
43 	TRACE_FUNC_OPT_STACK		= 0x1,
44 	TRACE_FUNC_OPT_NO_REPEATS	= 0x2,
45 
46 	/* Update this to next highest bit. */
47 	TRACE_FUNC_OPT_HIGHEST_BIT	= 0x4
48 };
49 
50 #define TRACE_FUNC_OPT_MASK	(TRACE_FUNC_OPT_HIGHEST_BIT - 1)
51 
ftrace_allocate_ftrace_ops(struct trace_array * tr)52 int ftrace_allocate_ftrace_ops(struct trace_array *tr)
53 {
54 	struct ftrace_ops *ops;
55 
56 	/* The top level array uses the "global_ops" */
57 	if (tr->flags & TRACE_ARRAY_FL_GLOBAL)
58 		return 0;
59 
60 	ops = kzalloc(sizeof(*ops), GFP_KERNEL);
61 	if (!ops)
62 		return -ENOMEM;
63 
64 	/* Currently only the non stack version is supported */
65 	ops->func = function_trace_call;
66 	ops->flags = FTRACE_OPS_FL_PID;
67 
68 	tr->ops = ops;
69 	ops->private = tr;
70 
71 	return 0;
72 }
73 
ftrace_free_ftrace_ops(struct trace_array * tr)74 void ftrace_free_ftrace_ops(struct trace_array *tr)
75 {
76 	kfree(tr->ops);
77 	tr->ops = NULL;
78 }
79 
ftrace_create_function_files(struct trace_array * tr,struct dentry * parent)80 int ftrace_create_function_files(struct trace_array *tr,
81 				 struct dentry *parent)
82 {
83 	/*
84 	 * The top level array uses the "global_ops", and the files are
85 	 * created on boot up.
86 	 */
87 	if (tr->flags & TRACE_ARRAY_FL_GLOBAL)
88 		return 0;
89 
90 	if (!tr->ops)
91 		return -EINVAL;
92 
93 	ftrace_create_filter_files(tr->ops, parent);
94 
95 	return 0;
96 }
97 
ftrace_destroy_function_files(struct trace_array * tr)98 void ftrace_destroy_function_files(struct trace_array *tr)
99 {
100 	ftrace_destroy_filter_files(tr->ops);
101 	ftrace_free_ftrace_ops(tr);
102 }
103 
select_trace_function(u32 flags_val)104 static ftrace_func_t select_trace_function(u32 flags_val)
105 {
106 	switch (flags_val & TRACE_FUNC_OPT_MASK) {
107 	case TRACE_FUNC_NO_OPTS:
108 		return function_trace_call;
109 	case TRACE_FUNC_OPT_STACK:
110 		return function_stack_trace_call;
111 	case TRACE_FUNC_OPT_NO_REPEATS:
112 		return function_no_repeats_trace_call;
113 	case TRACE_FUNC_OPT_STACK | TRACE_FUNC_OPT_NO_REPEATS:
114 		return function_stack_no_repeats_trace_call;
115 	default:
116 		return NULL;
117 	}
118 }
119 
handle_func_repeats(struct trace_array * tr,u32 flags_val)120 static bool handle_func_repeats(struct trace_array *tr, u32 flags_val)
121 {
122 	if (!tr->last_func_repeats &&
123 	    (flags_val & TRACE_FUNC_OPT_NO_REPEATS)) {
124 		tr->last_func_repeats = alloc_percpu(struct trace_func_repeats);
125 		if (!tr->last_func_repeats)
126 			return false;
127 	}
128 
129 	return true;
130 }
131 
function_trace_init(struct trace_array * tr)132 static int function_trace_init(struct trace_array *tr)
133 {
134 	ftrace_func_t func;
135 	/*
136 	 * Instance trace_arrays get their ops allocated
137 	 * at instance creation. Unless it failed
138 	 * the allocation.
139 	 */
140 	if (!tr->ops)
141 		return -ENOMEM;
142 
143 	func = select_trace_function(func_flags.val);
144 	if (!func)
145 		return -EINVAL;
146 
147 	if (!handle_func_repeats(tr, func_flags.val))
148 		return -ENOMEM;
149 
150 	ftrace_init_array_ops(tr, func);
151 
152 	tr->array_buffer.cpu = raw_smp_processor_id();
153 
154 	tracing_start_cmdline_record();
155 	tracing_start_function_trace(tr);
156 	return 0;
157 }
158 
function_trace_reset(struct trace_array * tr)159 static void function_trace_reset(struct trace_array *tr)
160 {
161 	tracing_stop_function_trace(tr);
162 	tracing_stop_cmdline_record();
163 	ftrace_reset_array_ops(tr);
164 }
165 
function_trace_start(struct trace_array * tr)166 static void function_trace_start(struct trace_array *tr)
167 {
168 	tracing_reset_online_cpus(&tr->array_buffer);
169 }
170 
171 static void
function_trace_call(unsigned long ip,unsigned long parent_ip,struct ftrace_ops * op,struct ftrace_regs * fregs)172 function_trace_call(unsigned long ip, unsigned long parent_ip,
173 		    struct ftrace_ops *op, struct ftrace_regs *fregs)
174 {
175 	struct trace_array *tr = op->private;
176 	struct trace_array_cpu *data;
177 	unsigned int trace_ctx;
178 	int bit;
179 	int cpu;
180 
181 	if (unlikely(!tr->function_enabled))
182 		return;
183 
184 	bit = ftrace_test_recursion_trylock(ip, parent_ip);
185 	if (bit < 0)
186 		return;
187 
188 	trace_ctx = tracing_gen_ctx();
189 	preempt_disable_notrace();
190 
191 	cpu = smp_processor_id();
192 	data = per_cpu_ptr(tr->array_buffer.data, cpu);
193 	if (!atomic_read(&data->disabled))
194 		trace_function(tr, ip, parent_ip, trace_ctx);
195 
196 	ftrace_test_recursion_unlock(bit);
197 	preempt_enable_notrace();
198 }
199 
200 #ifdef CONFIG_UNWINDER_ORC
201 /*
202  * Skip 2:
203  *
204  *   function_stack_trace_call()
205  *   ftrace_call()
206  */
207 #define STACK_SKIP 2
208 #else
209 /*
210  * Skip 3:
211  *   __trace_stack()
212  *   function_stack_trace_call()
213  *   ftrace_call()
214  */
215 #define STACK_SKIP 3
216 #endif
217 
218 static void
function_stack_trace_call(unsigned long ip,unsigned long parent_ip,struct ftrace_ops * op,struct ftrace_regs * fregs)219 function_stack_trace_call(unsigned long ip, unsigned long parent_ip,
220 			  struct ftrace_ops *op, struct ftrace_regs *fregs)
221 {
222 	struct trace_array *tr = op->private;
223 	struct trace_array_cpu *data;
224 	unsigned long flags;
225 	long disabled;
226 	int cpu;
227 	unsigned int trace_ctx;
228 
229 	if (unlikely(!tr->function_enabled))
230 		return;
231 
232 	/*
233 	 * Need to use raw, since this must be called before the
234 	 * recursive protection is performed.
235 	 */
236 	local_irq_save(flags);
237 	cpu = raw_smp_processor_id();
238 	data = per_cpu_ptr(tr->array_buffer.data, cpu);
239 	disabled = atomic_inc_return(&data->disabled);
240 
241 	if (likely(disabled == 1)) {
242 		trace_ctx = tracing_gen_ctx_flags(flags);
243 		trace_function(tr, ip, parent_ip, trace_ctx);
244 		__trace_stack(tr, trace_ctx, STACK_SKIP);
245 	}
246 
247 	atomic_dec(&data->disabled);
248 	local_irq_restore(flags);
249 }
250 
is_repeat_check(struct trace_array * tr,struct trace_func_repeats * last_info,unsigned long ip,unsigned long parent_ip)251 static inline bool is_repeat_check(struct trace_array *tr,
252 				   struct trace_func_repeats *last_info,
253 				   unsigned long ip, unsigned long parent_ip)
254 {
255 	if (last_info->ip == ip &&
256 	    last_info->parent_ip == parent_ip &&
257 	    last_info->count < U16_MAX) {
258 		last_info->ts_last_call =
259 			ring_buffer_time_stamp(tr->array_buffer.buffer);
260 		last_info->count++;
261 		return true;
262 	}
263 
264 	return false;
265 }
266 
process_repeats(struct trace_array * tr,unsigned long ip,unsigned long parent_ip,struct trace_func_repeats * last_info,unsigned int trace_ctx)267 static inline void process_repeats(struct trace_array *tr,
268 				   unsigned long ip, unsigned long parent_ip,
269 				   struct trace_func_repeats *last_info,
270 				   unsigned int trace_ctx)
271 {
272 	if (last_info->count) {
273 		trace_last_func_repeats(tr, last_info, trace_ctx);
274 		last_info->count = 0;
275 	}
276 
277 	last_info->ip = ip;
278 	last_info->parent_ip = parent_ip;
279 }
280 
281 static void
function_no_repeats_trace_call(unsigned long ip,unsigned long parent_ip,struct ftrace_ops * op,struct ftrace_regs * fregs)282 function_no_repeats_trace_call(unsigned long ip, unsigned long parent_ip,
283 			       struct ftrace_ops *op,
284 			       struct ftrace_regs *fregs)
285 {
286 	struct trace_func_repeats *last_info;
287 	struct trace_array *tr = op->private;
288 	struct trace_array_cpu *data;
289 	unsigned int trace_ctx;
290 	unsigned long flags;
291 	int bit;
292 	int cpu;
293 
294 	if (unlikely(!tr->function_enabled))
295 		return;
296 
297 	bit = ftrace_test_recursion_trylock(ip, parent_ip);
298 	if (bit < 0)
299 		return;
300 
301 	preempt_disable_notrace();
302 
303 	cpu = smp_processor_id();
304 	data = per_cpu_ptr(tr->array_buffer.data, cpu);
305 	if (atomic_read(&data->disabled))
306 		goto out;
307 
308 	/*
309 	 * An interrupt may happen at any place here. But as far as I can see,
310 	 * the only damage that this can cause is to mess up the repetition
311 	 * counter without valuable data being lost.
312 	 * TODO: think about a solution that is better than just hoping to be
313 	 * lucky.
314 	 */
315 	last_info = per_cpu_ptr(tr->last_func_repeats, cpu);
316 	if (is_repeat_check(tr, last_info, ip, parent_ip))
317 		goto out;
318 
319 	local_save_flags(flags);
320 	trace_ctx = tracing_gen_ctx_flags(flags);
321 	process_repeats(tr, ip, parent_ip, last_info, trace_ctx);
322 
323 	trace_function(tr, ip, parent_ip, trace_ctx);
324 
325 out:
326 	ftrace_test_recursion_unlock(bit);
327 	preempt_enable_notrace();
328 }
329 
330 static void
function_stack_no_repeats_trace_call(unsigned long ip,unsigned long parent_ip,struct ftrace_ops * op,struct ftrace_regs * fregs)331 function_stack_no_repeats_trace_call(unsigned long ip, unsigned long parent_ip,
332 				     struct ftrace_ops *op,
333 				     struct ftrace_regs *fregs)
334 {
335 	struct trace_func_repeats *last_info;
336 	struct trace_array *tr = op->private;
337 	struct trace_array_cpu *data;
338 	unsigned long flags;
339 	long disabled;
340 	int cpu;
341 	unsigned int trace_ctx;
342 
343 	if (unlikely(!tr->function_enabled))
344 		return;
345 
346 	/*
347 	 * Need to use raw, since this must be called before the
348 	 * recursive protection is performed.
349 	 */
350 	local_irq_save(flags);
351 	cpu = raw_smp_processor_id();
352 	data = per_cpu_ptr(tr->array_buffer.data, cpu);
353 	disabled = atomic_inc_return(&data->disabled);
354 
355 	if (likely(disabled == 1)) {
356 		last_info = per_cpu_ptr(tr->last_func_repeats, cpu);
357 		if (is_repeat_check(tr, last_info, ip, parent_ip))
358 			goto out;
359 
360 		trace_ctx = tracing_gen_ctx_flags(flags);
361 		process_repeats(tr, ip, parent_ip, last_info, trace_ctx);
362 
363 		trace_function(tr, ip, parent_ip, trace_ctx);
364 		__trace_stack(tr, trace_ctx, STACK_SKIP);
365 	}
366 
367  out:
368 	atomic_dec(&data->disabled);
369 	local_irq_restore(flags);
370 }
371 
372 static struct tracer_opt func_opts[] = {
373 #ifdef CONFIG_STACKTRACE
374 	{ TRACER_OPT(func_stack_trace, TRACE_FUNC_OPT_STACK) },
375 #endif
376 	{ TRACER_OPT(func-no-repeats, TRACE_FUNC_OPT_NO_REPEATS) },
377 	{ } /* Always set a last empty entry */
378 };
379 
380 static struct tracer_flags func_flags = {
381 	.val = TRACE_FUNC_NO_OPTS, /* By default: all flags disabled */
382 	.opts = func_opts
383 };
384 
tracing_start_function_trace(struct trace_array * tr)385 static void tracing_start_function_trace(struct trace_array *tr)
386 {
387 	tr->function_enabled = 0;
388 	register_ftrace_function(tr->ops);
389 	tr->function_enabled = 1;
390 }
391 
tracing_stop_function_trace(struct trace_array * tr)392 static void tracing_stop_function_trace(struct trace_array *tr)
393 {
394 	tr->function_enabled = 0;
395 	unregister_ftrace_function(tr->ops);
396 }
397 
398 static struct tracer function_trace;
399 
400 static int
func_set_flag(struct trace_array * tr,u32 old_flags,u32 bit,int set)401 func_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)
402 {
403 	ftrace_func_t func;
404 	u32 new_flags;
405 
406 	/* Do nothing if already set. */
407 	if (!!set == !!(func_flags.val & bit))
408 		return 0;
409 
410 	/* We can change this flag only when not running. */
411 	if (tr->current_trace != &function_trace)
412 		return 0;
413 
414 	new_flags = (func_flags.val & ~bit) | (set ? bit : 0);
415 	func = select_trace_function(new_flags);
416 	if (!func)
417 		return -EINVAL;
418 
419 	/* Check if there's anything to change. */
420 	if (tr->ops->func == func)
421 		return 0;
422 
423 	if (!handle_func_repeats(tr, new_flags))
424 		return -ENOMEM;
425 
426 	unregister_ftrace_function(tr->ops);
427 	tr->ops->func = func;
428 	register_ftrace_function(tr->ops);
429 
430 	return 0;
431 }
432 
433 static struct tracer function_trace __tracer_data =
434 {
435 	.name		= "function",
436 	.init		= function_trace_init,
437 	.reset		= function_trace_reset,
438 	.start		= function_trace_start,
439 	.flags		= &func_flags,
440 	.set_flag	= func_set_flag,
441 	.allow_instances = true,
442 #ifdef CONFIG_FTRACE_SELFTEST
443 	.selftest	= trace_selftest_startup_function,
444 #endif
445 };
446 
447 #ifdef CONFIG_DYNAMIC_FTRACE
update_traceon_count(struct ftrace_probe_ops * ops,unsigned long ip,struct trace_array * tr,bool on,void * data)448 static void update_traceon_count(struct ftrace_probe_ops *ops,
449 				 unsigned long ip,
450 				 struct trace_array *tr, bool on,
451 				 void *data)
452 {
453 	struct ftrace_func_mapper *mapper = data;
454 	long *count;
455 	long old_count;
456 
457 	/*
458 	 * Tracing gets disabled (or enabled) once per count.
459 	 * This function can be called at the same time on multiple CPUs.
460 	 * It is fine if both disable (or enable) tracing, as disabling
461 	 * (or enabling) the second time doesn't do anything as the
462 	 * state of the tracer is already disabled (or enabled).
463 	 * What needs to be synchronized in this case is that the count
464 	 * only gets decremented once, even if the tracer is disabled
465 	 * (or enabled) twice, as the second one is really a nop.
466 	 *
467 	 * The memory barriers guarantee that we only decrement the
468 	 * counter once. First the count is read to a local variable
469 	 * and a read barrier is used to make sure that it is loaded
470 	 * before checking if the tracer is in the state we want.
471 	 * If the tracer is not in the state we want, then the count
472 	 * is guaranteed to be the old count.
473 	 *
474 	 * Next the tracer is set to the state we want (disabled or enabled)
475 	 * then a write memory barrier is used to make sure that
476 	 * the new state is visible before changing the counter by
477 	 * one minus the old counter. This guarantees that another CPU
478 	 * executing this code will see the new state before seeing
479 	 * the new counter value, and would not do anything if the new
480 	 * counter is seen.
481 	 *
482 	 * Note, there is no synchronization between this and a user
483 	 * setting the tracing_on file. But we currently don't care
484 	 * about that.
485 	 */
486 	count = (long *)ftrace_func_mapper_find_ip(mapper, ip);
487 	old_count = *count;
488 
489 	if (old_count <= 0)
490 		return;
491 
492 	/* Make sure we see count before checking tracing state */
493 	smp_rmb();
494 
495 	if (on == !!tracer_tracing_is_on(tr))
496 		return;
497 
498 	if (on)
499 		tracer_tracing_on(tr);
500 	else
501 		tracer_tracing_off(tr);
502 
503 	/* Make sure tracing state is visible before updating count */
504 	smp_wmb();
505 
506 	*count = old_count - 1;
507 }
508 
509 static void
ftrace_traceon_count(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)510 ftrace_traceon_count(unsigned long ip, unsigned long parent_ip,
511 		     struct trace_array *tr, struct ftrace_probe_ops *ops,
512 		     void *data)
513 {
514 	update_traceon_count(ops, ip, tr, 1, data);
515 }
516 
517 static void
ftrace_traceoff_count(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)518 ftrace_traceoff_count(unsigned long ip, unsigned long parent_ip,
519 		      struct trace_array *tr, struct ftrace_probe_ops *ops,
520 		      void *data)
521 {
522 	update_traceon_count(ops, ip, tr, 0, data);
523 }
524 
525 static void
ftrace_traceon(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)526 ftrace_traceon(unsigned long ip, unsigned long parent_ip,
527 	       struct trace_array *tr, struct ftrace_probe_ops *ops,
528 	       void *data)
529 {
530 	if (tracer_tracing_is_on(tr))
531 		return;
532 
533 	tracer_tracing_on(tr);
534 }
535 
536 static void
ftrace_traceoff(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)537 ftrace_traceoff(unsigned long ip, unsigned long parent_ip,
538 		struct trace_array *tr, struct ftrace_probe_ops *ops,
539 		void *data)
540 {
541 	if (!tracer_tracing_is_on(tr))
542 		return;
543 
544 	tracer_tracing_off(tr);
545 }
546 
547 #ifdef CONFIG_UNWINDER_ORC
548 /*
549  * Skip 3:
550  *
551  *   function_trace_probe_call()
552  *   ftrace_ops_assist_func()
553  *   ftrace_call()
554  */
555 #define FTRACE_STACK_SKIP 3
556 #else
557 /*
558  * Skip 5:
559  *
560  *   __trace_stack()
561  *   ftrace_stacktrace()
562  *   function_trace_probe_call()
563  *   ftrace_ops_assist_func()
564  *   ftrace_call()
565  */
566 #define FTRACE_STACK_SKIP 5
567 #endif
568 
trace_stack(struct trace_array * tr)569 static __always_inline void trace_stack(struct trace_array *tr)
570 {
571 	unsigned int trace_ctx;
572 
573 	trace_ctx = tracing_gen_ctx();
574 
575 	__trace_stack(tr, trace_ctx, FTRACE_STACK_SKIP);
576 }
577 
578 static void
ftrace_stacktrace(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)579 ftrace_stacktrace(unsigned long ip, unsigned long parent_ip,
580 		  struct trace_array *tr, struct ftrace_probe_ops *ops,
581 		  void *data)
582 {
583 	trace_stack(tr);
584 }
585 
586 static void
ftrace_stacktrace_count(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)587 ftrace_stacktrace_count(unsigned long ip, unsigned long parent_ip,
588 			struct trace_array *tr, struct ftrace_probe_ops *ops,
589 			void *data)
590 {
591 	struct ftrace_func_mapper *mapper = data;
592 	long *count;
593 	long old_count;
594 	long new_count;
595 
596 	if (!tracing_is_on())
597 		return;
598 
599 	/* unlimited? */
600 	if (!mapper) {
601 		trace_stack(tr);
602 		return;
603 	}
604 
605 	count = (long *)ftrace_func_mapper_find_ip(mapper, ip);
606 
607 	/*
608 	 * Stack traces should only execute the number of times the
609 	 * user specified in the counter.
610 	 */
611 	do {
612 		old_count = *count;
613 
614 		if (!old_count)
615 			return;
616 
617 		new_count = old_count - 1;
618 		new_count = cmpxchg(count, old_count, new_count);
619 		if (new_count == old_count)
620 			trace_stack(tr);
621 
622 		if (!tracing_is_on())
623 			return;
624 
625 	} while (new_count != old_count);
626 }
627 
update_count(struct ftrace_probe_ops * ops,unsigned long ip,void * data)628 static int update_count(struct ftrace_probe_ops *ops, unsigned long ip,
629 			void *data)
630 {
631 	struct ftrace_func_mapper *mapper = data;
632 	long *count = NULL;
633 
634 	if (mapper)
635 		count = (long *)ftrace_func_mapper_find_ip(mapper, ip);
636 
637 	if (count) {
638 		if (*count <= 0)
639 			return 0;
640 		(*count)--;
641 	}
642 
643 	return 1;
644 }
645 
646 static void
ftrace_dump_probe(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)647 ftrace_dump_probe(unsigned long ip, unsigned long parent_ip,
648 		  struct trace_array *tr, struct ftrace_probe_ops *ops,
649 		  void *data)
650 {
651 	if (update_count(ops, ip, data))
652 		ftrace_dump(DUMP_ALL);
653 }
654 
655 /* Only dump the current CPU buffer. */
656 static void
ftrace_cpudump_probe(unsigned long ip,unsigned long parent_ip,struct trace_array * tr,struct ftrace_probe_ops * ops,void * data)657 ftrace_cpudump_probe(unsigned long ip, unsigned long parent_ip,
658 		     struct trace_array *tr, struct ftrace_probe_ops *ops,
659 		     void *data)
660 {
661 	if (update_count(ops, ip, data))
662 		ftrace_dump(DUMP_ORIG);
663 }
664 
665 static int
ftrace_probe_print(const char * name,struct seq_file * m,unsigned long ip,struct ftrace_probe_ops * ops,void * data)666 ftrace_probe_print(const char *name, struct seq_file *m,
667 		   unsigned long ip, struct ftrace_probe_ops *ops,
668 		   void *data)
669 {
670 	struct ftrace_func_mapper *mapper = data;
671 	long *count = NULL;
672 
673 	seq_printf(m, "%ps:%s", (void *)ip, name);
674 
675 	if (mapper)
676 		count = (long *)ftrace_func_mapper_find_ip(mapper, ip);
677 
678 	if (count)
679 		seq_printf(m, ":count=%ld\n", *count);
680 	else
681 		seq_puts(m, ":unlimited\n");
682 
683 	return 0;
684 }
685 
686 static int
ftrace_traceon_print(struct seq_file * m,unsigned long ip,struct ftrace_probe_ops * ops,void * data)687 ftrace_traceon_print(struct seq_file *m, unsigned long ip,
688 		     struct ftrace_probe_ops *ops,
689 		     void *data)
690 {
691 	return ftrace_probe_print("traceon", m, ip, ops, data);
692 }
693 
694 static int
ftrace_traceoff_print(struct seq_file * m,unsigned long ip,struct ftrace_probe_ops * ops,void * data)695 ftrace_traceoff_print(struct seq_file *m, unsigned long ip,
696 			 struct ftrace_probe_ops *ops, void *data)
697 {
698 	return ftrace_probe_print("traceoff", m, ip, ops, data);
699 }
700 
701 static int
ftrace_stacktrace_print(struct seq_file * m,unsigned long ip,struct ftrace_probe_ops * ops,void * data)702 ftrace_stacktrace_print(struct seq_file *m, unsigned long ip,
703 			struct ftrace_probe_ops *ops, void *data)
704 {
705 	return ftrace_probe_print("stacktrace", m, ip, ops, data);
706 }
707 
708 static int
ftrace_dump_print(struct seq_file * m,unsigned long ip,struct ftrace_probe_ops * ops,void * data)709 ftrace_dump_print(struct seq_file *m, unsigned long ip,
710 			struct ftrace_probe_ops *ops, void *data)
711 {
712 	return ftrace_probe_print("dump", m, ip, ops, data);
713 }
714 
715 static int
ftrace_cpudump_print(struct seq_file * m,unsigned long ip,struct ftrace_probe_ops * ops,void * data)716 ftrace_cpudump_print(struct seq_file *m, unsigned long ip,
717 			struct ftrace_probe_ops *ops, void *data)
718 {
719 	return ftrace_probe_print("cpudump", m, ip, ops, data);
720 }
721 
722 
723 static int
ftrace_count_init(struct ftrace_probe_ops * ops,struct trace_array * tr,unsigned long ip,void * init_data,void ** data)724 ftrace_count_init(struct ftrace_probe_ops *ops, struct trace_array *tr,
725 		  unsigned long ip, void *init_data, void **data)
726 {
727 	struct ftrace_func_mapper *mapper = *data;
728 
729 	if (!mapper) {
730 		mapper = allocate_ftrace_func_mapper();
731 		if (!mapper)
732 			return -ENOMEM;
733 		*data = mapper;
734 	}
735 
736 	return ftrace_func_mapper_add_ip(mapper, ip, init_data);
737 }
738 
739 static void
ftrace_count_free(struct ftrace_probe_ops * ops,struct trace_array * tr,unsigned long ip,void * data)740 ftrace_count_free(struct ftrace_probe_ops *ops, struct trace_array *tr,
741 		  unsigned long ip, void *data)
742 {
743 	struct ftrace_func_mapper *mapper = data;
744 
745 	if (!ip) {
746 		free_ftrace_func_mapper(mapper, NULL);
747 		return;
748 	}
749 
750 	ftrace_func_mapper_remove_ip(mapper, ip);
751 }
752 
753 static struct ftrace_probe_ops traceon_count_probe_ops = {
754 	.func			= ftrace_traceon_count,
755 	.print			= ftrace_traceon_print,
756 	.init			= ftrace_count_init,
757 	.free			= ftrace_count_free,
758 };
759 
760 static struct ftrace_probe_ops traceoff_count_probe_ops = {
761 	.func			= ftrace_traceoff_count,
762 	.print			= ftrace_traceoff_print,
763 	.init			= ftrace_count_init,
764 	.free			= ftrace_count_free,
765 };
766 
767 static struct ftrace_probe_ops stacktrace_count_probe_ops = {
768 	.func			= ftrace_stacktrace_count,
769 	.print			= ftrace_stacktrace_print,
770 	.init			= ftrace_count_init,
771 	.free			= ftrace_count_free,
772 };
773 
774 static struct ftrace_probe_ops dump_probe_ops = {
775 	.func			= ftrace_dump_probe,
776 	.print			= ftrace_dump_print,
777 	.init			= ftrace_count_init,
778 	.free			= ftrace_count_free,
779 };
780 
781 static struct ftrace_probe_ops cpudump_probe_ops = {
782 	.func			= ftrace_cpudump_probe,
783 	.print			= ftrace_cpudump_print,
784 };
785 
786 static struct ftrace_probe_ops traceon_probe_ops = {
787 	.func			= ftrace_traceon,
788 	.print			= ftrace_traceon_print,
789 };
790 
791 static struct ftrace_probe_ops traceoff_probe_ops = {
792 	.func			= ftrace_traceoff,
793 	.print			= ftrace_traceoff_print,
794 };
795 
796 static struct ftrace_probe_ops stacktrace_probe_ops = {
797 	.func			= ftrace_stacktrace,
798 	.print			= ftrace_stacktrace_print,
799 };
800 
801 static int
ftrace_trace_probe_callback(struct trace_array * tr,struct ftrace_probe_ops * ops,struct ftrace_hash * hash,char * glob,char * cmd,char * param,int enable)802 ftrace_trace_probe_callback(struct trace_array *tr,
803 			    struct ftrace_probe_ops *ops,
804 			    struct ftrace_hash *hash, char *glob,
805 			    char *cmd, char *param, int enable)
806 {
807 	void *count = (void *)-1;
808 	char *number;
809 	int ret;
810 
811 	/* hash funcs only work with set_ftrace_filter */
812 	if (!enable)
813 		return -EINVAL;
814 
815 	if (glob[0] == '!')
816 		return unregister_ftrace_function_probe_func(glob+1, tr, ops);
817 
818 	if (!param)
819 		goto out_reg;
820 
821 	number = strsep(&param, ":");
822 
823 	if (!strlen(number))
824 		goto out_reg;
825 
826 	/*
827 	 * We use the callback data field (which is a pointer)
828 	 * as our counter.
829 	 */
830 	ret = kstrtoul(number, 0, (unsigned long *)&count);
831 	if (ret)
832 		return ret;
833 
834  out_reg:
835 	ret = register_ftrace_function_probe(glob, tr, ops, count);
836 
837 	return ret < 0 ? ret : 0;
838 }
839 
840 static int
ftrace_trace_onoff_callback(struct trace_array * tr,struct ftrace_hash * hash,char * glob,char * cmd,char * param,int enable)841 ftrace_trace_onoff_callback(struct trace_array *tr, struct ftrace_hash *hash,
842 			    char *glob, char *cmd, char *param, int enable)
843 {
844 	struct ftrace_probe_ops *ops;
845 
846 	if (!tr)
847 		return -ENODEV;
848 
849 	/* we register both traceon and traceoff to this callback */
850 	if (strcmp(cmd, "traceon") == 0)
851 		ops = param ? &traceon_count_probe_ops : &traceon_probe_ops;
852 	else
853 		ops = param ? &traceoff_count_probe_ops : &traceoff_probe_ops;
854 
855 	return ftrace_trace_probe_callback(tr, ops, hash, glob, cmd,
856 					   param, enable);
857 }
858 
859 static int
ftrace_stacktrace_callback(struct trace_array * tr,struct ftrace_hash * hash,char * glob,char * cmd,char * param,int enable)860 ftrace_stacktrace_callback(struct trace_array *tr, struct ftrace_hash *hash,
861 			   char *glob, char *cmd, char *param, int enable)
862 {
863 	struct ftrace_probe_ops *ops;
864 
865 	if (!tr)
866 		return -ENODEV;
867 
868 	ops = param ? &stacktrace_count_probe_ops : &stacktrace_probe_ops;
869 
870 	return ftrace_trace_probe_callback(tr, ops, hash, glob, cmd,
871 					   param, enable);
872 }
873 
874 static int
ftrace_dump_callback(struct trace_array * tr,struct ftrace_hash * hash,char * glob,char * cmd,char * param,int enable)875 ftrace_dump_callback(struct trace_array *tr, struct ftrace_hash *hash,
876 			   char *glob, char *cmd, char *param, int enable)
877 {
878 	struct ftrace_probe_ops *ops;
879 
880 	if (!tr)
881 		return -ENODEV;
882 
883 	ops = &dump_probe_ops;
884 
885 	/* Only dump once. */
886 	return ftrace_trace_probe_callback(tr, ops, hash, glob, cmd,
887 					   "1", enable);
888 }
889 
890 static int
ftrace_cpudump_callback(struct trace_array * tr,struct ftrace_hash * hash,char * glob,char * cmd,char * param,int enable)891 ftrace_cpudump_callback(struct trace_array *tr, struct ftrace_hash *hash,
892 			   char *glob, char *cmd, char *param, int enable)
893 {
894 	struct ftrace_probe_ops *ops;
895 
896 	if (!tr)
897 		return -ENODEV;
898 
899 	ops = &cpudump_probe_ops;
900 
901 	/* Only dump once. */
902 	return ftrace_trace_probe_callback(tr, ops, hash, glob, cmd,
903 					   "1", enable);
904 }
905 
906 static struct ftrace_func_command ftrace_traceon_cmd = {
907 	.name			= "traceon",
908 	.func			= ftrace_trace_onoff_callback,
909 };
910 
911 static struct ftrace_func_command ftrace_traceoff_cmd = {
912 	.name			= "traceoff",
913 	.func			= ftrace_trace_onoff_callback,
914 };
915 
916 static struct ftrace_func_command ftrace_stacktrace_cmd = {
917 	.name			= "stacktrace",
918 	.func			= ftrace_stacktrace_callback,
919 };
920 
921 static struct ftrace_func_command ftrace_dump_cmd = {
922 	.name			= "dump",
923 	.func			= ftrace_dump_callback,
924 };
925 
926 static struct ftrace_func_command ftrace_cpudump_cmd = {
927 	.name			= "cpudump",
928 	.func			= ftrace_cpudump_callback,
929 };
930 
init_func_cmd_traceon(void)931 static int __init init_func_cmd_traceon(void)
932 {
933 	int ret;
934 
935 	ret = register_ftrace_command(&ftrace_traceoff_cmd);
936 	if (ret)
937 		return ret;
938 
939 	ret = register_ftrace_command(&ftrace_traceon_cmd);
940 	if (ret)
941 		goto out_free_traceoff;
942 
943 	ret = register_ftrace_command(&ftrace_stacktrace_cmd);
944 	if (ret)
945 		goto out_free_traceon;
946 
947 	ret = register_ftrace_command(&ftrace_dump_cmd);
948 	if (ret)
949 		goto out_free_stacktrace;
950 
951 	ret = register_ftrace_command(&ftrace_cpudump_cmd);
952 	if (ret)
953 		goto out_free_dump;
954 
955 	return 0;
956 
957  out_free_dump:
958 	unregister_ftrace_command(&ftrace_dump_cmd);
959  out_free_stacktrace:
960 	unregister_ftrace_command(&ftrace_stacktrace_cmd);
961  out_free_traceon:
962 	unregister_ftrace_command(&ftrace_traceon_cmd);
963  out_free_traceoff:
964 	unregister_ftrace_command(&ftrace_traceoff_cmd);
965 
966 	return ret;
967 }
968 #else
init_func_cmd_traceon(void)969 static inline int init_func_cmd_traceon(void)
970 {
971 	return 0;
972 }
973 #endif /* CONFIG_DYNAMIC_FTRACE */
974 
init_function_trace(void)975 __init int init_function_trace(void)
976 {
977 	init_func_cmd_traceon();
978 	return register_tracer(&function_trace);
979 }
980