trace_functions_graph.c 39.0 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2 3 4
/*
 *
 * Function graph tracer.
5
 * Copyright (c) 2008-2009 Frederic Weisbecker <fweisbec@gmail.com>
6 7 8 9 10 11
 * Mostly borrowed from function tracer which
 * is Copyright (c) Steven Rostedt <srostedt@redhat.com>
 *
 */
#include <linux/uaccess.h>
#include <linux/ftrace.h>
12
#include <linux/interrupt.h>
13
#include <linux/slab.h>
14 15 16
#include <linux/fs.h>

#include "trace.h"
17
#include "trace_output.h"
18

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
static bool kill_ftrace_graph;

/**
 * ftrace_graph_is_dead - returns true if ftrace_graph_stop() was called
 *
 * ftrace_graph_stop() is called when a severe error is detected in
 * the function graph tracing. This function is called by the critical
 * paths of function graph to keep those paths from doing any more harm.
 */
bool ftrace_graph_is_dead(void)
{
	return kill_ftrace_graph;
}

/**
 * ftrace_graph_stop - set to permanently disable function graph tracincg
 *
 * In case of an error int function graph tracing, this is called
 * to try to keep function graph tracing from causing any more harm.
 * Usually this is pretty severe and this is called to try to at least
 * get a warning out to the user.
 */
void ftrace_graph_stop(void)
{
	kill_ftrace_graph = true;
}

46 47 48
/* When set, irq functions will be ignored */
static int ftrace_graph_skip_irqs;

49
struct fgraph_cpu_data {
50 51
	pid_t		last_pid;
	int		depth;
52
	int		depth_irq;
53
	int		ignore;
54
	unsigned long	enter_funcs[FTRACE_RETFUNC_DEPTH];
55 56 57
};

struct fgraph_data {
58
	struct fgraph_cpu_data __percpu *cpu_data;
59 60 61 62 63 64

	/* Place to preserve last processed entry. */
	struct ftrace_graph_ent_entry	ent;
	struct ftrace_graph_ret_entry	ret;
	int				failed;
	int				cpu;
65 66
};

67
#define TRACE_GRAPH_INDENT	2
68

69
unsigned int fgraph_max_depth;
70

71
static struct tracer_opt trace_opts[] = {
72
	/* Display overruns? (for self-debug purpose) */
73 74 75 76 77
	{ TRACER_OPT(funcgraph-overrun, TRACE_GRAPH_PRINT_OVERRUN) },
	/* Display CPU ? */
	{ TRACER_OPT(funcgraph-cpu, TRACE_GRAPH_PRINT_CPU) },
	/* Display Overhead ? */
	{ TRACER_OPT(funcgraph-overhead, TRACE_GRAPH_PRINT_OVERHEAD) },
78 79
	/* Display proc name/pid */
	{ TRACER_OPT(funcgraph-proc, TRACE_GRAPH_PRINT_PROC) },
80 81 82 83
	/* Display duration of execution */
	{ TRACER_OPT(funcgraph-duration, TRACE_GRAPH_PRINT_DURATION) },
	/* Display absolute time of an entry */
	{ TRACER_OPT(funcgraph-abstime, TRACE_GRAPH_PRINT_ABS_TIME) },
84 85
	/* Display interrupts */
	{ TRACER_OPT(funcgraph-irqs, TRACE_GRAPH_PRINT_IRQS) },
86 87
	/* Display function name after trailing } */
	{ TRACER_OPT(funcgraph-tail, TRACE_GRAPH_PRINT_TAIL) },
88 89 90 91
	/* Include sleep time (scheduled out) between entry and return */
	{ TRACER_OPT(sleep-time, TRACE_GRAPH_SLEEP_TIME) },
	/* Include time within nested functions */
	{ TRACER_OPT(graph-time, TRACE_GRAPH_GRAPH_TIME) },
92 93 94 95
	{ } /* Empty entry */
};

static struct tracer_flags tracer_flags = {
96
	/* Don't display overruns, proc, or tail by default */
97
	.val = TRACE_GRAPH_PRINT_CPU | TRACE_GRAPH_PRINT_OVERHEAD |
98 99
	       TRACE_GRAPH_PRINT_DURATION | TRACE_GRAPH_PRINT_IRQS |
	       TRACE_GRAPH_SLEEP_TIME | TRACE_GRAPH_GRAPH_TIME,
100 101 102
	.opts = trace_opts
};

103
static struct trace_array *graph_array;
104

105 106 107 108 109 110
/*
 * DURATION column is being also used to display IRQ signs,
 * following values are used by print_graph_irq and others
 * to fill in space into DURATION column.
 */
enum {
111 112 113
	FLAGS_FILL_FULL  = 1 << TRACE_GRAPH_PRINT_FILL_SHIFT,
	FLAGS_FILL_START = 2 << TRACE_GRAPH_PRINT_FILL_SHIFT,
	FLAGS_FILL_END   = 3 << TRACE_GRAPH_PRINT_FILL_SHIFT,
114 115
};

116
static void
117 118
print_graph_duration(struct trace_array *tr, unsigned long long duration,
		     struct trace_seq *s, u32 flags);
119

120
/* Add a function return address to the trace stack on thread info.*/
121
static int
122
ftrace_push_return_trace(unsigned long ret, unsigned long func,
123
			 unsigned long frame_pointer, unsigned long *retp)
124
{
125
	unsigned long long calltime;
126 127
	int index;

128 129 130
	if (unlikely(ftrace_graph_is_dead()))
		return -EBUSY;

131 132 133
	if (!current->ret_stack)
		return -EBUSY;

134 135 136 137 138 139
	/*
	 * We must make sure the ret_stack is tested before we read
	 * anything else.
	 */
	smp_rmb();

140 141 142 143 144 145
	/* The return trace stack is full */
	if (current->curr_ret_stack == FTRACE_RETFUNC_DEPTH - 1) {
		atomic_inc(&current->trace_overrun);
		return -EBUSY;
	}

146 147 148 149 150 151 152 153 154 155 156 157 158 159
	/*
	 * The curr_ret_stack is an index to ftrace return stack of
	 * current task.  Its value should be in [0, FTRACE_RETFUNC_
	 * DEPTH) when the function graph tracer is used.  To support
	 * filtering out specific functions, it makes the index
	 * negative by subtracting huge value (FTRACE_NOTRACE_DEPTH)
	 * so when it sees a negative index the ftrace will ignore
	 * the record.  And the index gets recovered when returning
	 * from the filtered function by adding the FTRACE_NOTRACE_
	 * DEPTH and then it'll continue to record functions normally.
	 *
	 * The curr_ret_stack is initialized to -1 and get increased
	 * in this function.  So it can be less than -1 only if it was
	 * filtered out via ftrace_graph_notrace_addr() which can be
160
	 * set from set_graph_notrace file in tracefs by user.
161 162 163 164
	 */
	if (current->curr_ret_stack < -1)
		return -EBUSY;

165 166
	calltime = trace_clock_local();

167
	index = ++current->curr_ret_stack;
168 169
	if (ftrace_graph_notrace_addr(func))
		current->curr_ret_stack -= FTRACE_NOTRACE_DEPTH;
170 171 172
	barrier();
	current->ret_stack[index].ret = ret;
	current->ret_stack[index].func = func;
173
	current->ret_stack[index].calltime = calltime;
174
#ifdef HAVE_FUNCTION_GRAPH_FP_TEST
175
	current->ret_stack[index].fp = frame_pointer;
176 177 178
#endif
#ifdef HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
	current->ret_stack[index].retp = retp;
179
#endif
180 181 182
	return 0;
}

183 184 185 186 187 188
int function_graph_enter(unsigned long ret, unsigned long func,
			 unsigned long frame_pointer, unsigned long *retp)
{
	struct ftrace_graph_ent trace;

	trace.func = func;
189
	trace.depth = ++current->curr_ret_depth;
190

191 192 193 194
	if (ftrace_push_return_trace(ret, func,
				     frame_pointer, retp))
		goto out;

195 196 197 198
	/* Only trace if the calling function expects to */
	if (!ftrace_graph_entry(&trace))
		goto out_ret;

199
	return 0;
200 201
 out_ret:
	current->curr_ret_stack--;
202 203 204
 out:
	current->curr_ret_depth--;
	return -EBUSY;
205 206
}

207
/* Retrieve a function return address to the trace stack on thread info.*/
208
static void
209 210
ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret,
			unsigned long frame_pointer)
211 212 213 214 215
{
	int index;

	index = current->curr_ret_stack;

216 217 218 219 220 221 222 223 224 225 226
	/*
	 * A negative index here means that it's just returned from a
	 * notrace'd function.  Recover index to get an original
	 * return address.  See ftrace_push_return_trace().
	 *
	 * TODO: Need to check whether the stack gets corrupted.
	 */
	if (index < 0)
		index += FTRACE_NOTRACE_DEPTH;

	if (unlikely(index < 0 || index >= FTRACE_RETFUNC_DEPTH)) {
227 228 229 230 231 232 233
		ftrace_graph_stop();
		WARN_ON(1);
		/* Might as well panic, otherwise we have no where to go */
		*ret = (unsigned long)panic;
		return;
	}

234
#ifdef HAVE_FUNCTION_GRAPH_FP_TEST
235 236 237 238 239 240 241 242 243 244
	/*
	 * The arch may choose to record the frame pointer used
	 * and check it here to make sure that it is what we expect it
	 * to be. If gcc does not set the place holder of the return
	 * address in the frame pointer, and does a copy instead, then
	 * the function graph trace will fail. This test detects this
	 * case.
	 *
	 * Currently, x86_32 with optimize for size (-Os) makes the latest
	 * gcc do the above.
245 246 247
	 *
	 * Note, -mfentry does not use frame pointers, and this test
	 *  is not needed if CC_USING_FENTRY is set.
248 249 250 251
	 */
	if (unlikely(current->ret_stack[index].fp != frame_pointer)) {
		ftrace_graph_stop();
		WARN(1, "Bad frame pointer: expected %lx, received %lx\n"
252
		     "  from func %ps return to %lx\n",
253 254 255 256 257 258 259 260 261
		     current->ret_stack[index].fp,
		     frame_pointer,
		     (void *)current->ret_stack[index].func,
		     current->ret_stack[index].ret);
		*ret = (unsigned long)panic;
		return;
	}
#endif

262 263 264 265
	*ret = current->ret_stack[index].ret;
	trace->func = current->ret_stack[index].func;
	trace->calltime = current->ret_stack[index].calltime;
	trace->overrun = atomic_read(&current->trace_overrun);
266 267 268 269 270 271 272
	trace->depth = current->curr_ret_depth--;
	/*
	 * We still want to trace interrupts coming in if
	 * max_depth is set to 1. Make sure the decrement is
	 * seen before ftrace_graph_return.
	 */
	barrier();
273 274 275 276 277 278
}

/*
 * Send the trace to the ring-buffer.
 * @return the original return address.
 */
279
unsigned long ftrace_return_to_handler(unsigned long frame_pointer)
280 281 282 283
{
	struct ftrace_graph_ret trace;
	unsigned long ret;

284
	ftrace_pop_return_trace(&trace, &ret, frame_pointer);
285
	trace.rettime = trace_clock_local();
286 287 288 289 290 291
	ftrace_graph_return(&trace);
	/*
	 * The ftrace_graph_return() may still access the current
	 * ret_stack structure, we need to make sure the update of
	 * curr_ret_stack is after that.
	 */
292 293
	barrier();
	current->curr_ret_stack--;
294 295 296 297 298 299 300 301 302
	/*
	 * The curr_ret_stack can be less than -1 only if it was
	 * filtered out and it's about to return from the function.
	 * Recover the index and continue to trace normal functions.
	 */
	if (current->curr_ret_stack < -1) {
		current->curr_ret_stack += FTRACE_NOTRACE_DEPTH;
		return ret;
	}
303 304 305 306 307 308 309 310 311 312 313

	if (unlikely(!ret)) {
		ftrace_graph_stop();
		WARN_ON(1);
		/* Might as well panic. What else to do? */
		ret = (unsigned long)panic;
	}

	return ret;
}

314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
/**
 * ftrace_graph_ret_addr - convert a potentially modified stack return address
 *			   to its original value
 *
 * This function can be called by stack unwinding code to convert a found stack
 * return address ('ret') to its original value, in case the function graph
 * tracer has modified it to be 'return_to_handler'.  If the address hasn't
 * been modified, the unchanged value of 'ret' is returned.
 *
 * 'idx' is a state variable which should be initialized by the caller to zero
 * before the first call.
 *
 * 'retp' is a pointer to the return address on the stack.  It's ignored if
 * the arch doesn't have HAVE_FUNCTION_GRAPH_RET_ADDR_PTR defined.
 */
#ifdef HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
unsigned long ftrace_graph_ret_addr(struct task_struct *task, int *idx,
				    unsigned long ret, unsigned long *retp)
{
	int index = task->curr_ret_stack;
	int i;

	if (ret != (unsigned long)return_to_handler)
		return ret;

	if (index < -1)
		index += FTRACE_NOTRACE_DEPTH;

	if (index < 0)
		return ret;

	for (i = 0; i <= index; i++)
		if (task->ret_stack[i].retp == retp)
			return task->ret_stack[i].ret;

	return ret;
}
#else /* !HAVE_FUNCTION_GRAPH_RET_ADDR_PTR */
unsigned long ftrace_graph_ret_addr(struct task_struct *task, int *idx,
				    unsigned long ret, unsigned long *retp)
{
	int task_idx;

	if (ret != (unsigned long)return_to_handler)
		return ret;

	task_idx = task->curr_ret_stack;

	if (!task->ret_stack || task_idx < *idx)
		return ret;

	task_idx -= *idx;
	(*idx)++;

	return task->ret_stack[task_idx].ret;
}
#endif /* HAVE_FUNCTION_GRAPH_RET_ADDR_PTR */

372
int __trace_graph_entry(struct trace_array *tr,
373 374 375 376
				struct ftrace_graph_ent *trace,
				unsigned long flags,
				int pc)
{
377
	struct trace_event_call *call = &event_funcgraph_entry;
378
	struct ring_buffer_event *event;
379
	struct ring_buffer *buffer = tr->trace_buffer.buffer;
380 381
	struct ftrace_graph_ent_entry *entry;

382
	event = trace_buffer_lock_reserve(buffer, TRACE_GRAPH_ENT,
383 384 385 386 387
					  sizeof(*entry), flags, pc);
	if (!event)
		return 0;
	entry	= ring_buffer_event_data(event);
	entry->graph_ent			= *trace;
388
	if (!call_filter_check_discard(call, entry, buffer, event))
389
		trace_buffer_unlock_commit_nostack(buffer, event);
390 391 392 393

	return 1;
}

394 395
static inline int ftrace_graph_ignore_irqs(void)
{
396
	if (!ftrace_graph_skip_irqs || trace_recursion_test(TRACE_IRQ_BIT))
397 398 399 400 401
		return 0;

	return in_irq();
}

402 403 404 405 406 407 408 409 410 411
int trace_graph_entry(struct ftrace_graph_ent *trace)
{
	struct trace_array *tr = graph_array;
	struct trace_array_cpu *data;
	unsigned long flags;
	long disabled;
	int ret;
	int cpu;
	int pc;

412
	if (!ftrace_trace_task(tr))
413 414
		return 0;

415 416 417 418
	if (ftrace_graph_ignore_func(trace))
		return 0;

	if (ftrace_graph_ignore_irqs())
419 420
		return 0;

421 422 423 424 425 426 427 428 429 430
	/*
	 * Do not trace a function if it's filtered by set_graph_notrace.
	 * Make the index of ret stack negative to indicate that it should
	 * ignore further functions.  But it needs its own ret stack entry
	 * to recover the original index in order to continue tracing after
	 * returning from the function.
	 */
	if (ftrace_graph_notrace_addr(trace->func))
		return 1;

431 432 433 434 435 436 437
	/*
	 * Stop here if tracing_threshold is set. We only write function return
	 * events to the ring buffer.
	 */
	if (tracing_thresh)
		return 1;

438 439
	local_irq_save(flags);
	cpu = raw_smp_processor_id();
440
	data = per_cpu_ptr(tr->trace_buffer.data, cpu);
441 442 443 444 445 446 447 448 449 450 451 452 453 454
	disabled = atomic_inc_return(&data->disabled);
	if (likely(disabled == 1)) {
		pc = preempt_count();
		ret = __trace_graph_entry(tr, trace, flags, pc);
	} else {
		ret = 0;
	}

	atomic_dec(&data->disabled);
	local_irq_restore(flags);

	return ret;
}

455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
static void
__trace_graph_function(struct trace_array *tr,
		unsigned long ip, unsigned long flags, int pc)
{
	u64 time = trace_clock_local();
	struct ftrace_graph_ent ent = {
		.func  = ip,
		.depth = 0,
	};
	struct ftrace_graph_ret ret = {
		.func     = ip,
		.depth    = 0,
		.calltime = time,
		.rettime  = time,
	};

	__trace_graph_entry(tr, &ent, flags, pc);
	__trace_graph_return(tr, &ret, flags, pc);
}

void
trace_graph_function(struct trace_array *tr,
		unsigned long ip, unsigned long parent_ip,
		unsigned long flags, int pc)
{
	__trace_graph_function(tr, ip, flags, pc);
}

483
void __trace_graph_return(struct trace_array *tr,
484 485 486 487
				struct ftrace_graph_ret *trace,
				unsigned long flags,
				int pc)
{
488
	struct trace_event_call *call = &event_funcgraph_exit;
489
	struct ring_buffer_event *event;
490
	struct ring_buffer *buffer = tr->trace_buffer.buffer;
491 492
	struct ftrace_graph_ret_entry *entry;

493
	event = trace_buffer_lock_reserve(buffer, TRACE_GRAPH_RET,
494 495 496 497 498
					  sizeof(*entry), flags, pc);
	if (!event)
		return;
	entry	= ring_buffer_event_data(event);
	entry->ret				= *trace;
499
	if (!call_filter_check_discard(call, entry, buffer, event))
500
		trace_buffer_unlock_commit_nostack(buffer, event);
501 502 503 504 505 506 507 508 509 510 511 512 513
}

void trace_graph_return(struct ftrace_graph_ret *trace)
{
	struct trace_array *tr = graph_array;
	struct trace_array_cpu *data;
	unsigned long flags;
	long disabled;
	int cpu;
	int pc;

	local_irq_save(flags);
	cpu = raw_smp_processor_id();
514
	data = per_cpu_ptr(tr->trace_buffer.data, cpu);
515 516 517 518 519 520 521 522 523
	disabled = atomic_inc_return(&data->disabled);
	if (likely(disabled == 1)) {
		pc = preempt_count();
		__trace_graph_return(tr, trace, flags, pc);
	}
	atomic_dec(&data->disabled);
	local_irq_restore(flags);
}

524 525 526 527 528 529 530 531 532
void set_graph_array(struct trace_array *tr)
{
	graph_array = tr;

	/* Make graph_array visible before we start tracing */

	smp_mb();
}

533
static void trace_graph_thresh_return(struct ftrace_graph_ret *trace)
534 535 536 537 538 539 540 541
{
	if (tracing_thresh &&
	    (trace->rettime - trace->calltime < tracing_thresh))
		return;
	else
		trace_graph_return(trace);
}

542 543
static int graph_trace_init(struct trace_array *tr)
{
544 545
	int ret;

546
	set_graph_array(tr);
547 548
	if (tracing_thresh)
		ret = register_ftrace_graph(&trace_graph_thresh_return,
549
					    &trace_graph_entry);
550 551 552
	else
		ret = register_ftrace_graph(&trace_graph_return,
					    &trace_graph_entry);
553 554 555 556 557
	if (ret)
		return ret;
	tracing_start_cmdline_record();

	return 0;
558 559 560 561
}

static void graph_trace_reset(struct trace_array *tr)
{
562 563
	tracing_stop_cmdline_record();
	unregister_ftrace_graph();
564 565
}

566
static int graph_trace_update_thresh(struct trace_array *tr)
567 568 569 570 571
{
	graph_trace_reset(tr);
	return graph_trace_init(tr);
}

572
static int max_bytes_for_cpu;
573

574
static void print_graph_cpu(struct trace_seq *s, int cpu)
575
{
576 577 578 579 580
	/*
	 * Start with a space character - to make it stand out
	 * to the right a bit when trace output is pasted into
	 * email:
	 */
581
	trace_seq_printf(s, " %*d) ", max_bytes_for_cpu, cpu);
582 583
}

584 585
#define TRACE_GRAPH_PROCINFO_LENGTH	14

586
static void print_graph_proc(struct trace_seq *s, pid_t pid)
587
{
588
	char comm[TASK_COMM_LEN];
589 590
	/* sign + log10(MAX_INT) + '\0' */
	char pid_str[11];
591 592 593
	int spaces = 0;
	int len;
	int i;
594

595
	trace_find_cmdline(pid, comm);
596 597 598 599 600 601 602 603 604 605
	comm[7] = '\0';
	sprintf(pid_str, "%d", pid);

	/* 1 stands for the "-" character */
	len = strlen(comm) + strlen(pid_str) + 1;

	if (len < TRACE_GRAPH_PROCINFO_LENGTH)
		spaces = TRACE_GRAPH_PROCINFO_LENGTH - len;

	/* First spaces to align center */
606 607
	for (i = 0; i < spaces / 2; i++)
		trace_seq_putc(s, ' ');
608

609
	trace_seq_printf(s, "%s-%s", comm, pid_str);
610 611

	/* Last spaces to align center */
612 613
	for (i = 0; i < spaces - (spaces / 2); i++)
		trace_seq_putc(s, ' ');
614 615
}

616

617
static void print_graph_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
618
{
619 620
	trace_seq_putc(s, ' ');
	trace_print_lat_fmt(s, entry);
621 622
}

623
/* If the pid changed since the last trace, output this event */
624
static void
625
verif_pid(struct trace_seq *s, pid_t pid, int cpu, struct fgraph_data *data)
626
{
627
	pid_t prev_pid;
628
	pid_t *last_pid;
629

630
	if (!data)
631
		return;
632

633
	last_pid = &(per_cpu_ptr(data->cpu_data, cpu)->last_pid);
634 635

	if (*last_pid == pid)
636
		return;
637

638 639
	prev_pid = *last_pid;
	*last_pid = pid;
640

641
	if (prev_pid == -1)
642
		return;
643 644 645 646 647 648 649 650
/*
 * Context-switch trace line:

 ------------------------------------------
 | 1)  migration/0--1  =>  sshd-1755
 ------------------------------------------

 */
651 652 653 654 655 656
	trace_seq_puts(s, " ------------------------------------------\n");
	print_graph_cpu(s, cpu);
	print_graph_proc(s, prev_pid);
	trace_seq_puts(s, " => ");
	print_graph_proc(s, pid);
	trace_seq_puts(s, "\n ------------------------------------------\n\n");
657 658
}

659 660
static struct ftrace_graph_ret_entry *
get_return_for_leaf(struct trace_iterator *iter,
661 662
		struct ftrace_graph_ent_entry *curr)
{
663 664
	struct fgraph_data *data = iter->private;
	struct ring_buffer_iter *ring_iter = NULL;
665 666 667
	struct ring_buffer_event *event;
	struct ftrace_graph_ret_entry *next;

668 669 670 671 672 673 674 675
	/*
	 * If the previous output failed to write to the seq buffer,
	 * then we just reuse the data from before.
	 */
	if (data && data->failed) {
		curr = &data->ent;
		next = &data->ret;
	} else {
676

677
		ring_iter = trace_buffer_iter(iter, iter->cpu);
678 679 680 681 682 683 684 685 686

		/* First peek to compare current entry and the next one */
		if (ring_iter)
			event = ring_buffer_iter_peek(ring_iter, NULL);
		else {
			/*
			 * We need to consume the current entry to see
			 * the next one.
			 */
687
			ring_buffer_consume(iter->trace_buffer->buffer, iter->cpu,
688
					    NULL, NULL);
689
			event = ring_buffer_peek(iter->trace_buffer->buffer, iter->cpu,
690
						 NULL, NULL);
691
		}
692

693 694 695 696
		if (!event)
			return NULL;

		next = ring_buffer_event_data(event);
697

698 699 700 701 702 703
		if (data) {
			/*
			 * Save current and next entries for later reference
			 * if the output fails.
			 */
			data->ent = *curr;
704 705 706 707 708 709 710 711 712
			/*
			 * If the next event is not a return type, then
			 * we only care about what type it is. Otherwise we can
			 * safely copy the entire event.
			 */
			if (next->ent.type == TRACE_GRAPH_RET)
				data->ret = *next;
			else
				data->ret.ent.type = next->ent.type;
713 714
		}
	}
715 716

	if (next->ent.type != TRACE_GRAPH_RET)
717
		return NULL;
718 719 720

	if (curr->ent.pid != next->ent.pid ||
			curr->graph_ent.func != next->ret.func)
721
		return NULL;
722

723 724 725 726 727
	/* this is a leaf, now advance the iterator */
	if (ring_iter)
		ring_buffer_read(ring_iter, NULL);

	return next;
728 729
}

730
static void print_graph_abs_time(u64 t, struct trace_seq *s)
731 732 733 734 735 736
{
	unsigned long usecs_rem;

	usecs_rem = do_div(t, NSEC_PER_SEC);
	usecs_rem /= 1000;

737 738
	trace_seq_printf(s, "%5lu.%06lu |  ",
			 (unsigned long)t, usecs_rem);
739 740
}

741
static void
742
print_graph_irq(struct trace_iterator *iter, unsigned long addr,
743
		enum trace_type type, int cpu, pid_t pid, u32 flags)
744
{
745
	struct trace_array *tr = iter->tr;
746
	struct trace_seq *s = &iter->seq;
747
	struct trace_entry *ent = iter->ent;
748 749 750

	if (addr < (unsigned long)__irqentry_text_start ||
		addr >= (unsigned long)__irqentry_text_end)
751
		return;
752

753
	if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) {
754
		/* Absolute time */
755 756
		if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
			print_graph_abs_time(iter->ts, s);
757

758
		/* Cpu */
759 760
		if (flags & TRACE_GRAPH_PRINT_CPU)
			print_graph_cpu(s, cpu);
761

762 763
		/* Proc */
		if (flags & TRACE_GRAPH_PRINT_PROC) {
764 765
			print_graph_proc(s, pid);
			trace_seq_puts(s, " | ");
766
		}
767 768

		/* Latency format */
769
		if (tr->trace_flags & TRACE_ITER_LATENCY_FMT)
770
			print_graph_lat_fmt(s, ent);
771
	}
772

773
	/* No overhead */
774
	print_graph_duration(tr, 0, s, flags | FLAGS_FILL_START);
775

776
	if (type == TRACE_GRAPH_ENT)
777
		trace_seq_puts(s, "==========>");
778
	else
779
		trace_seq_puts(s, "<==========");
780

781
	print_graph_duration(tr, 0, s, flags | FLAGS_FILL_END);
782
	trace_seq_putc(s, '\n');
783
}
784

785
void
786
trace_print_graph_duration(unsigned long long duration, struct trace_seq *s)
787 788
{
	unsigned long nsecs_rem = do_div(duration, 1000);
789
	/* log10(ULONG_MAX) + '\0' */
790
	char usecs_str[21];
791
	char nsecs_str[5];
792
	int len;
793 794
	int i;

795
	sprintf(usecs_str, "%lu", (unsigned long) duration);
796 797

	/* Print msecs */
798
	trace_seq_printf(s, "%s", usecs_str);
799

800
	len = strlen(usecs_str);
801 802 803

	/* Print nsecs (we don't want to exceed 7 numbers) */
	if (len < 7) {
804 805 806
		size_t slen = min_t(size_t, sizeof(nsecs_str), 8UL - len);

		snprintf(nsecs_str, slen, "%03lu", nsecs_rem);
807
		trace_seq_printf(s, ".%s", nsecs_str);
808
		len += strlen(nsecs_str) + 1;
809 810
	}

811
	trace_seq_puts(s, " us ");
812 813

	/* Print remaining spaces to fit the row's width */
814
	for (i = len; i < 8; i++)
815
		trace_seq_putc(s, ' ');
816 817
}

818
static void
819 820
print_graph_duration(struct trace_array *tr, unsigned long long duration,
		     struct trace_seq *s, u32 flags)
821
{
822
	if (!(flags & TRACE_GRAPH_PRINT_DURATION) ||
823
	    !(tr->trace_flags & TRACE_ITER_CONTEXT_INFO))
824
		return;
825 826

	/* No real adata, just filling the column with spaces */
827 828
	switch (flags & TRACE_GRAPH_PRINT_FILL_MASK) {
	case FLAGS_FILL_FULL:
829 830
		trace_seq_puts(s, "              |  ");
		return;
831
	case FLAGS_FILL_START:
832 833
		trace_seq_puts(s, "  ");
		return;
834
	case FLAGS_FILL_END:
835 836
		trace_seq_puts(s, " |");
		return;
837 838 839
	}

	/* Signal a overhead of time execution to the output */
840 841 842
	if (flags & TRACE_GRAPH_PRINT_OVERHEAD)
		trace_seq_printf(s, "%c ", trace_find_mark(duration));
	else
843
		trace_seq_puts(s, "  ");
844

845 846
	trace_print_graph_duration(duration, s);
	trace_seq_puts(s, "|  ");
847 848 849
}

/* Case of a leaf function on its call entry */
850
static enum print_line_t
851
print_graph_entry_leaf(struct trace_iterator *iter,
852
		struct ftrace_graph_ent_entry *entry,
853 854
		struct ftrace_graph_ret_entry *ret_entry,
		struct trace_seq *s, u32 flags)
855
{
856
	struct fgraph_data *data = iter->private;
857
	struct trace_array *tr = iter->tr;
858 859 860
	struct ftrace_graph_ret *graph_ret;
	struct ftrace_graph_ent *call;
	unsigned long long duration;
861
	int cpu = iter->cpu;
862
	int i;
863

864 865 866 867
	graph_ret = &ret_entry->ret;
	call = &entry->graph_ent;
	duration = graph_ret->rettime - graph_ret->calltime;

868
	if (data) {
869 870 871
		struct fgraph_cpu_data *cpu_data;

		cpu_data = per_cpu_ptr(data->cpu_data, cpu);
872

873 874 875 876
		/* If a graph tracer ignored set_graph_notrace */
		if (call->depth < -1)
			call->depth += FTRACE_NOTRACE_DEPTH;

877 878 879 880 881
		/*
		 * Comments display at + 1 to depth. Since
		 * this is a leaf function, keep the comments
		 * equal to this depth.
		 */
882 883 884
		cpu_data->depth = call->depth - 1;

		/* No need to keep this function around for this depth */
885 886
		if (call->depth < FTRACE_RETFUNC_DEPTH &&
		    !WARN_ON_ONCE(call->depth < 0))
887
			cpu_data->enter_funcs[call->depth] = 0;
888 889
	}

890
	/* Overhead and duration */
891
	print_graph_duration(tr, duration, s, flags);
892

893
	/* Function */
894 895
	for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++)
		trace_seq_putc(s, ' ');
896

897
	trace_seq_printf(s, "%ps();\n", (void *)call->func);
898

899 900 901
	print_graph_irq(iter, graph_ret->func, TRACE_GRAPH_RET,
			cpu, iter->ent->pid, flags);

902
	return trace_handle_return(s);
903 904 905
}

static enum print_line_t
906 907
print_graph_entry_nested(struct trace_iterator *iter,
			 struct ftrace_graph_ent_entry *entry,
908
			 struct trace_seq *s, int cpu, u32 flags)
909 910
{
	struct ftrace_graph_ent *call = &entry->graph_ent;
911
	struct fgraph_data *data = iter->private;
912
	struct trace_array *tr = iter->tr;
913 914 915
	int i;

	if (data) {
916
		struct fgraph_cpu_data *cpu_data;
917 918
		int cpu = iter->cpu;

919 920 921 922
		/* If a graph tracer ignored set_graph_notrace */
		if (call->depth < -1)
			call->depth += FTRACE_NOTRACE_DEPTH;

923 924 925 926
		cpu_data = per_cpu_ptr(data->cpu_data, cpu);
		cpu_data->depth = call->depth;

		/* Save this function pointer to see if the exit matches */
927 928
		if (call->depth < FTRACE_RETFUNC_DEPTH &&
		    !WARN_ON_ONCE(call->depth < 0))
929
			cpu_data->enter_funcs[call->depth] = call->func;
930
	}
931

932
	/* No time */
933
	print_graph_duration(tr, 0, s, flags | FLAGS_FILL_FULL);
934

935
	/* Function */
936 937 938 939
	for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++)
		trace_seq_putc(s, ' ');

	trace_seq_printf(s, "%ps() {\n", (void *)call->func);
940

941
	if (trace_seq_has_overflowed(s))
942 943
		return TRACE_TYPE_PARTIAL_LINE;

944 945 946 947 948
	/*
	 * we already consumed the current entry to check the next one
	 * and see if this is a leaf.
	 */
	return TRACE_TYPE_NO_CONSUME;
949 950
}

951
static void
952
print_graph_prologue(struct trace_iterator *iter, struct trace_seq *s,
953
		     int type, unsigned long addr, u32 flags)
954
{
955
	struct fgraph_data *data = iter->private;
956
	struct trace_entry *ent = iter->ent;
957
	struct trace_array *tr = iter->tr;
958
	int cpu = iter->cpu;
959

960
	/* Pid */
961
	verif_pid(s, ent->pid, cpu, data);
962

963
	if (type)
964
		/* Interrupt */
965
		print_graph_irq(iter, addr, type, cpu, ent->pid, flags);
966

967
	if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO))
968
		return;
969

970
	/* Absolute time */
971 972
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
		print_graph_abs_time(iter->ts, s);
973

974
	/* Cpu */
975 976
	if (flags & TRACE_GRAPH_PRINT_CPU)
		print_graph_cpu(s, cpu);
977 978

	/* Proc */
979
	if (flags & TRACE_GRAPH_PRINT_PROC) {
980 981
		print_graph_proc(s, ent->pid);
		trace_seq_puts(s, " | ");
982
	}
983

984
	/* Latency format */
985
	if (tr->trace_flags & TRACE_ITER_LATENCY_FMT)
986
		print_graph_lat_fmt(s, ent);
987

988
	return;
989 990
}

991 992 993 994 995
/*
 * Entry check for irq code
 *
 * returns 1 if
 *  - we are inside irq code
L
Lucas De Marchi 已提交
996
 *  - we just entered irq code
997 998 999 1000 1001 1002 1003 1004 1005 1006
 *
 * retunns 0 if
 *  - funcgraph-interrupts option is set
 *  - we are not inside irq code
 */
static int
check_irq_entry(struct trace_iterator *iter, u32 flags,
		unsigned long addr, int depth)
{
	int cpu = iter->cpu;
1007
	int *depth_irq;
1008 1009
	struct fgraph_data *data = iter->private;

1010 1011 1012 1013 1014 1015 1016
	/*
	 * If we are either displaying irqs, or we got called as
	 * a graph event and private data does not exist,
	 * then we bypass the irq check.
	 */
	if ((flags & TRACE_GRAPH_PRINT_IRQS) ||
	    (!data))
1017 1018
		return 0;

1019 1020
	depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
	/*
	 * We are inside the irq code
	 */
	if (*depth_irq >= 0)
		return 1;

	if ((addr < (unsigned long)__irqentry_text_start) ||
	    (addr >= (unsigned long)__irqentry_text_end))
		return 0;

	/*
	 * We are entering irq code.
	 */
	*depth_irq = depth;
	return 1;
}

/*
 * Return check for irq code
 *
 * returns 1 if
 *  - we are inside irq code
 *  - we just left irq code
 *
 * returns 0 if
 *  - funcgraph-interrupts option is set
 *  - we are not inside irq code
 */
static int
check_irq_return(struct trace_iterator *iter, u32 flags, int depth)
{
	int cpu = iter->cpu;
1053
	int *depth_irq;
1054 1055
	struct fgraph_data *data = iter->private;

1056 1057 1058 1059 1060 1061 1062
	/*
	 * If we are either displaying irqs, or we got called as
	 * a graph event and private data does not exist,
	 * then we bypass the irq check.
	 */
	if ((flags & TRACE_GRAPH_PRINT_IRQS) ||
	    (!data))
1063 1064
		return 0;

1065 1066
	depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
	/*
	 * We are not inside the irq code.
	 */
	if (*depth_irq == -1)
		return 0;

	/*
	 * We are inside the irq code, and this is returning entry.
	 * Let's not trace it and clear the entry depth, since
	 * we are out of irq code.
	 *
	 * This condition ensures that we 'leave the irq code' once
	 * we are out of the entry depth. Thus protecting us from
	 * the RETURN entry loss.
	 */
	if (*depth_irq >= depth) {
		*depth_irq = -1;
		return 1;
	}

	/*
	 * We are inside the irq code, and this is not the entry.
	 */
	return 1;
}

1093 1094
static enum print_line_t
print_graph_entry(struct ftrace_graph_ent_entry *field, struct trace_seq *s,
1095
			struct trace_iterator *iter, u32 flags)
1096
{
1097
	struct fgraph_data *data = iter->private;
1098 1099
	struct ftrace_graph_ent *call = &field->graph_ent;
	struct ftrace_graph_ret_entry *leaf_ret;
1100 1101
	static enum print_line_t ret;
	int cpu = iter->cpu;
1102

1103 1104 1105
	if (check_irq_entry(iter, flags, call->func, call->depth))
		return TRACE_TYPE_HANDLED;

1106
	print_graph_prologue(iter, s, TRACE_GRAPH_ENT, call->func, flags);
1107

1108 1109
	leaf_ret = get_return_for_leaf(iter, field);
	if (leaf_ret)
1110
		ret = print_graph_entry_leaf(iter, field, leaf_ret, s, flags);
1111
	else
1112
		ret = print_graph_entry_nested(iter, field, s, cpu, flags);
1113

1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
	if (data) {
		/*
		 * If we failed to write our output, then we need to make
		 * note of it. Because we already consumed our entry.
		 */
		if (s->full) {
			data->failed = 1;
			data->cpu = cpu;
		} else
			data->failed = 0;
	}

	return ret;
1127 1128
}

1129 1130
static enum print_line_t
print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
1131 1132
		   struct trace_entry *ent, struct trace_iterator *iter,
		   u32 flags)
1133
{
1134
	unsigned long long duration = trace->rettime - trace->calltime;
1135
	struct fgraph_data *data = iter->private;
1136
	struct trace_array *tr = iter->tr;
1137 1138
	pid_t pid = ent->pid;
	int cpu = iter->cpu;
1139
	int func_match = 1;
1140 1141
	int i;

1142 1143 1144
	if (check_irq_return(iter, flags, trace->depth))
		return TRACE_TYPE_HANDLED;

1145
	if (data) {
1146 1147 1148 1149
		struct fgraph_cpu_data *cpu_data;
		int cpu = iter->cpu;

		cpu_data = per_cpu_ptr(data->cpu_data, cpu);
1150 1151 1152 1153 1154 1155

		/*
		 * Comments display at + 1 to depth. This is the
		 * return from a function, we now want the comments
		 * to display at the same level of the bracket.
		 */
1156 1157
		cpu_data->depth = trace->depth - 1;

1158 1159
		if (trace->depth < FTRACE_RETFUNC_DEPTH &&
		    !WARN_ON_ONCE(trace->depth < 0)) {
1160 1161 1162 1163
			if (cpu_data->enter_funcs[trace->depth] != trace->func)
				func_match = 0;
			cpu_data->enter_funcs[trace->depth] = 0;
		}
1164
	}
1165

1166
	print_graph_prologue(iter, s, 0, 0, flags);
1167

1168
	/* Overhead and duration */
1169
	print_graph_duration(tr, duration, s, flags);
1170

1171
	/* Closing brace */
1172 1173
	for (i = 0; i < trace->depth * TRACE_GRAPH_INDENT; i++)
		trace_seq_putc(s, ' ');
1174

1175 1176 1177 1178
	/*
	 * If the return function does not have a matching entry,
	 * then the entry was lost. Instead of just printing
	 * the '}' and letting the user guess what function this
1179 1180
	 * belongs to, write out the function name. Always do
	 * that if the funcgraph-tail option is enabled.
1181
	 */
1182 1183 1184 1185
	if (func_match && !(flags & TRACE_GRAPH_PRINT_TAIL))
		trace_seq_puts(s, "}\n");
	else
		trace_seq_printf(s, "} /* %ps */\n", (void *)trace->func);
1186

1187
	/* Overrun */
1188 1189 1190
	if (flags & TRACE_GRAPH_PRINT_OVERRUN)
		trace_seq_printf(s, " (Overruns: %lu)\n",
				 trace->overrun);
1191

1192 1193
	print_graph_irq(iter, trace->func, TRACE_GRAPH_RET,
			cpu, pid, flags);
1194

1195
	return trace_handle_return(s);
1196 1197
}

1198
static enum print_line_t
1199 1200
print_graph_comment(struct trace_seq *s, struct trace_entry *ent,
		    struct trace_iterator *iter, u32 flags)
1201
{
1202 1203
	struct trace_array *tr = iter->tr;
	unsigned long sym_flags = (tr->trace_flags & TRACE_ITER_SYM_MASK);
1204
	struct fgraph_data *data = iter->private;
1205
	struct trace_event *event;
1206
	int depth = 0;
1207
	int ret;
1208 1209 1210
	int i;

	if (data)
1211
		depth = per_cpu_ptr(data->cpu_data, iter->cpu)->depth;
1212

1213
	print_graph_prologue(iter, s, 0, 0, flags);
1214

1215
	/* No time */
1216
	print_graph_duration(tr, 0, s, flags | FLAGS_FILL_FULL);
1217 1218

	/* Indentation */
1219
	if (depth > 0)
1220 1221
		for (i = 0; i < (depth + 1) * TRACE_GRAPH_INDENT; i++)
			trace_seq_putc(s, ' ');
1222 1223

	/* The comment */
1224
	trace_seq_puts(s, "/* ");
1225

1226
	switch (iter->ent->type) {
1227 1228 1229 1230 1231
	case TRACE_BPUTS:
		ret = trace_print_bputs_msg_only(iter);
		if (ret != TRACE_TYPE_HANDLED)
			return ret;
		break;
1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
	case TRACE_BPRINT:
		ret = trace_print_bprintk_msg_only(iter);
		if (ret != TRACE_TYPE_HANDLED)
			return ret;
		break;
	case TRACE_PRINT:
		ret = trace_print_printk_msg_only(iter);
		if (ret != TRACE_TYPE_HANDLED)
			return ret;
		break;
	default:
		event = ftrace_find_event(ent->type);
		if (!event)
			return TRACE_TYPE_UNHANDLED;

1247
		ret = event->funcs->trace(iter, sym_flags, event);
1248 1249 1250
		if (ret != TRACE_TYPE_HANDLED)
			return ret;
	}
1251

1252 1253 1254
	if (trace_seq_has_overflowed(s))
		goto out;

1255
	/* Strip ending newline */
1256 1257 1258
	if (s->buffer[s->seq.len - 1] == '\n') {
		s->buffer[s->seq.len - 1] = '\0';
		s->seq.len--;
1259 1260
	}

1261
	trace_seq_puts(s, " */\n");
1262
 out:
1263
	return trace_handle_return(s);
1264 1265 1266
}


1267
enum print_line_t
1268
print_graph_function_flags(struct trace_iterator *iter, u32 flags)
1269
{
1270 1271
	struct ftrace_graph_ent_entry *field;
	struct fgraph_data *data = iter->private;
1272
	struct trace_entry *entry = iter->ent;
1273
	struct trace_seq *s = &iter->seq;
1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
	int cpu = iter->cpu;
	int ret;

	if (data && per_cpu_ptr(data->cpu_data, cpu)->ignore) {
		per_cpu_ptr(data->cpu_data, cpu)->ignore = 0;
		return TRACE_TYPE_HANDLED;
	}

	/*
	 * If the last output failed, there's a possibility we need
	 * to print out the missing entry which would never go out.
	 */
	if (data && data->failed) {
		field = &data->ent;
		iter->cpu = data->cpu;
1289
		ret = print_graph_entry(field, s, iter, flags);
1290 1291 1292 1293 1294 1295 1296
		if (ret == TRACE_TYPE_HANDLED && iter->cpu != cpu) {
			per_cpu_ptr(data->cpu_data, iter->cpu)->ignore = 1;
			ret = TRACE_TYPE_NO_CONSUME;
		}
		iter->cpu = cpu;
		return ret;
	}
1297

1298 1299
	switch (entry->type) {
	case TRACE_GRAPH_ENT: {
1300 1301 1302 1303 1304 1305
		/*
		 * print_graph_entry() may consume the current event,
		 * thus @field may become invalid, so we need to save it.
		 * sizeof(struct ftrace_graph_ent_entry) is very small,
		 * it can be safely saved at the stack.
		 */
1306
		struct ftrace_graph_ent_entry saved;
1307
		trace_assign_type(field, entry);
1308
		saved = *field;
1309
		return print_graph_entry(&saved, s, iter, flags);
1310 1311 1312 1313
	}
	case TRACE_GRAPH_RET: {
		struct ftrace_graph_ret_entry *field;
		trace_assign_type(field, entry);
1314
		return print_graph_return(&field->ret, s, entry, iter, flags);
1315
	}
1316 1317 1318 1319 1320
	case TRACE_STACK:
	case TRACE_FN:
		/* dont trace stack and functions as comments */
		return TRACE_TYPE_UNHANDLED;

1321
	default:
1322
		return print_graph_comment(s, entry, iter, flags);
1323
	}
1324 1325

	return TRACE_TYPE_HANDLED;
1326 1327
}

1328 1329 1330
static enum print_line_t
print_graph_function(struct trace_iterator *iter)
{
1331
	return print_graph_function_flags(iter, tracer_flags.val);
1332 1333
}

1334
static enum print_line_t
1335 1336
print_graph_function_event(struct trace_iterator *iter, int flags,
			   struct trace_event *event)
1337 1338 1339 1340
{
	return print_graph_function(iter);
}

1341
static void print_lat_header(struct seq_file *s, u32 flags)
1342 1343 1344 1345 1346 1347
{
	static const char spaces[] = "                "	/* 16 spaces */
		"    "					/* 4 spaces */
		"                 ";			/* 17 spaces */
	int size = 0;

1348
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
1349
		size += 16;
1350
	if (flags & TRACE_GRAPH_PRINT_CPU)
1351
		size += 4;
1352
	if (flags & TRACE_GRAPH_PRINT_PROC)
1353 1354 1355 1356 1357 1358
		size += 17;

	seq_printf(s, "#%.*s  _-----=> irqs-off        \n", size, spaces);
	seq_printf(s, "#%.*s / _----=> need-resched    \n", size, spaces);
	seq_printf(s, "#%.*s| / _---=> hardirq/softirq \n", size, spaces);
	seq_printf(s, "#%.*s|| / _--=> preempt-depth   \n", size, spaces);
1359
	seq_printf(s, "#%.*s||| /                      \n", size, spaces);
1360 1361
}

1362 1363
static void __print_graph_headers_flags(struct trace_array *tr,
					struct seq_file *s, u32 flags)
1364
{
1365
	int lat = tr->trace_flags & TRACE_ITER_LATENCY_FMT;
1366 1367

	if (lat)
1368
		print_lat_header(s, flags);
1369

1370
	/* 1st line */
1371
	seq_putc(s, '#');
1372
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
1373
		seq_puts(s, "     TIME       ");
1374
	if (flags & TRACE_GRAPH_PRINT_CPU)
1375
		seq_puts(s, " CPU");
1376
	if (flags & TRACE_GRAPH_PRINT_PROC)
1377
		seq_puts(s, "  TASK/PID       ");
1378
	if (lat)
1379
		seq_puts(s, "||||");
1380
	if (flags & TRACE_GRAPH_PRINT_DURATION)
1381 1382
		seq_puts(s, "  DURATION   ");
	seq_puts(s, "               FUNCTION CALLS\n");
1383 1384

	/* 2nd line */
1385
	seq_putc(s, '#');
1386
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
1387
		seq_puts(s, "      |         ");
1388
	if (flags & TRACE_GRAPH_PRINT_CPU)
1389
		seq_puts(s, " |  ");
1390
	if (flags & TRACE_GRAPH_PRINT_PROC)
1391
		seq_puts(s, "   |    |        ");
1392
	if (lat)
1393
		seq_puts(s, "||||");
1394
	if (flags & TRACE_GRAPH_PRINT_DURATION)
1395 1396
		seq_puts(s, "   |   |      ");
	seq_puts(s, "               |   |   |   |\n");
1397
}
1398

1399
static void print_graph_headers(struct seq_file *s)
1400 1401 1402 1403
{
	print_graph_headers_flags(s, tracer_flags.val);
}

1404 1405 1406
void print_graph_headers_flags(struct seq_file *s, u32 flags)
{
	struct trace_iterator *iter = s->private;
1407
	struct trace_array *tr = iter->tr;
1408

1409
	if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO))
1410 1411
		return;

1412
	if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) {
1413 1414 1415 1416 1417
		/* print nothing if the buffers are empty */
		if (trace_empty(iter))
			return;

		print_trace_header(s, iter);
1418
	}
1419

1420
	__print_graph_headers_flags(tr, s, flags);
1421 1422
}

1423
void graph_trace_open(struct trace_iterator *iter)
1424
{
1425
	/* pid and depth on the last trace processed */
1426
	struct fgraph_data *data;
1427
	gfp_t gfpflags;
1428 1429
	int cpu;

1430 1431
	iter->private = NULL;

1432 1433 1434 1435
	/* We can be called in atomic context via ftrace_dump() */
	gfpflags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;

	data = kzalloc(sizeof(*data), gfpflags);
1436
	if (!data)
1437 1438
		goto out_err;

1439
	data->cpu_data = alloc_percpu_gfp(struct fgraph_cpu_data, gfpflags);
1440 1441 1442 1443 1444 1445 1446
	if (!data->cpu_data)
		goto out_err_free;

	for_each_possible_cpu(cpu) {
		pid_t *pid = &(per_cpu_ptr(data->cpu_data, cpu)->last_pid);
		int *depth = &(per_cpu_ptr(data->cpu_data, cpu)->depth);
		int *ignore = &(per_cpu_ptr(data->cpu_data, cpu)->ignore);
1447 1448
		int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

1449 1450 1451
		*pid = -1;
		*depth = 0;
		*ignore = 0;
1452
		*depth_irq = -1;
1453
	}
1454

1455
	iter->private = data;
1456 1457 1458 1459 1460 1461

	return;

 out_err_free:
	kfree(data);
 out_err:
1462
	pr_warn("function graph tracer: not enough memory\n");
1463 1464
}

1465
void graph_trace_close(struct trace_iterator *iter)
1466
{
1467 1468 1469 1470 1471 1472
	struct fgraph_data *data = iter->private;

	if (data) {
		free_percpu(data->cpu_data);
		kfree(data);
	}
1473 1474
}

1475 1476
static int
func_graph_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)
1477 1478 1479 1480
{
	if (bit == TRACE_GRAPH_PRINT_IRQS)
		ftrace_graph_skip_irqs = !set;

1481 1482 1483 1484 1485 1486
	if (bit == TRACE_GRAPH_SLEEP_TIME)
		ftrace_graph_sleep_time_control(set);

	if (bit == TRACE_GRAPH_GRAPH_TIME)
		ftrace_graph_graph_time_control(set);

1487 1488 1489
	return 0;
}

1490 1491 1492 1493
static struct trace_event_functions graph_functions = {
	.trace		= print_graph_function_event,
};

1494 1495
static struct trace_event graph_trace_entry_event = {
	.type		= TRACE_GRAPH_ENT,
1496
	.funcs		= &graph_functions,
1497 1498 1499 1500
};

static struct trace_event graph_trace_ret_event = {
	.type		= TRACE_GRAPH_RET,
1501
	.funcs		= &graph_functions
1502 1503
};

1504
static struct tracer graph_trace __tracer_data = {
1505
	.name		= "function_graph",
1506
	.update_thresh	= graph_trace_update_thresh,
1507
	.open		= graph_trace_open,
1508
	.pipe_open	= graph_trace_open,
1509
	.close		= graph_trace_close,
1510
	.pipe_close	= graph_trace_close,
1511 1512
	.init		= graph_trace_init,
	.reset		= graph_trace_reset,
1513 1514
	.print_line	= print_graph_function,
	.print_header	= print_graph_headers,
1515
	.flags		= &tracer_flags,
1516
	.set_flag	= func_graph_set_flag,
1517 1518 1519
#ifdef CONFIG_FTRACE_SELFTEST
	.selftest	= trace_selftest_startup_function_graph,
#endif
1520 1521
};

1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533

static ssize_t
graph_depth_write(struct file *filp, const char __user *ubuf, size_t cnt,
		  loff_t *ppos)
{
	unsigned long val;
	int ret;

	ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
	if (ret)
		return ret;

1534
	fgraph_max_depth = val;
1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547

	*ppos += cnt;

	return cnt;
}

static ssize_t
graph_depth_read(struct file *filp, char __user *ubuf, size_t cnt,
		 loff_t *ppos)
{
	char buf[15]; /* More than enough to hold UINT_MAX + "\n"*/
	int n;

1548
	n = sprintf(buf, "%d\n", fgraph_max_depth);
1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559

	return simple_read_from_buffer(ubuf, cnt, ppos, buf, n);
}

static const struct file_operations graph_depth_fops = {
	.open		= tracing_open_generic,
	.write		= graph_depth_write,
	.read		= graph_depth_read,
	.llseek		= generic_file_llseek,
};

1560
static __init int init_graph_tracefs(void)
1561 1562 1563 1564
{
	struct dentry *d_tracer;

	d_tracer = tracing_init_dentry();
1565
	if (IS_ERR(d_tracer))
1566 1567 1568 1569 1570 1571 1572
		return 0;

	trace_create_file("max_graph_depth", 0644, d_tracer,
			  NULL, &graph_depth_fops);

	return 0;
}
1573
fs_initcall(init_graph_tracefs);
1574

1575 1576
static __init int init_graph_trace(void)
{
1577
	max_bytes_for_cpu = snprintf(NULL, 0, "%u", nr_cpu_ids - 1);
1578

1579
	if (!register_trace_event(&graph_trace_entry_event)) {
1580
		pr_warn("Warning: could not register graph trace events\n");
1581 1582 1583
		return 1;
	}

1584
	if (!register_trace_event(&graph_trace_ret_event)) {
1585
		pr_warn("Warning: could not register graph trace events\n");
1586 1587 1588
		return 1;
	}

1589 1590 1591
	return register_tracer(&graph_trace);
}

1592
core_initcall(init_graph_trace);