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

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

18 19 20
/* When set, irq functions will be ignored */
static int ftrace_graph_skip_irqs;

21
struct fgraph_cpu_data {
22 23
	pid_t		last_pid;
	int		depth;
24
	int		depth_irq;
25
	int		ignore;
26
	unsigned long	enter_funcs[FTRACE_RETFUNC_DEPTH];
27 28 29
};

struct fgraph_data {
30
	struct fgraph_cpu_data __percpu *cpu_data;
31 32 33 34 35 36

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

39
#define TRACE_GRAPH_INDENT	2
40

41
/* Flag options */
42
#define TRACE_GRAPH_PRINT_OVERRUN	0x1
43 44
#define TRACE_GRAPH_PRINT_CPU		0x2
#define TRACE_GRAPH_PRINT_OVERHEAD	0x4
45
#define TRACE_GRAPH_PRINT_PROC		0x8
46
#define TRACE_GRAPH_PRINT_DURATION	0x10
47
#define TRACE_GRAPH_PRINT_ABS_TIME	0x20
48
#define TRACE_GRAPH_PRINT_IRQS		0x40
49

50 51
static unsigned int max_depth;

52
static struct tracer_opt trace_opts[] = {
53
	/* Display overruns? (for self-debug purpose) */
54 55 56 57 58
	{ 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) },
59 60
	/* Display proc name/pid */
	{ TRACER_OPT(funcgraph-proc, TRACE_GRAPH_PRINT_PROC) },
61 62 63 64
	/* 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) },
65 66
	/* Display interrupts */
	{ TRACER_OPT(funcgraph-irqs, TRACE_GRAPH_PRINT_IRQS) },
67 68 69 70
	{ } /* Empty entry */
};

static struct tracer_flags tracer_flags = {
71
	/* Don't display overruns and proc by default */
72
	.val = TRACE_GRAPH_PRINT_CPU | TRACE_GRAPH_PRINT_OVERHEAD |
73
	       TRACE_GRAPH_PRINT_DURATION | TRACE_GRAPH_PRINT_IRQS,
74 75 76
	.opts = trace_opts
};

77
static struct trace_array *graph_array;
78

79 80 81 82 83 84 85 86 87 88 89 90 91 92
/*
 * 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 {
	DURATION_FILL_FULL  = -1,
	DURATION_FILL_START = -2,
	DURATION_FILL_END   = -3,
};

static enum print_line_t
print_graph_duration(unsigned long long duration, struct trace_seq *s,
		     u32 flags);
93

94 95
/* Add a function return address to the trace stack on thread info.*/
int
96 97
ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth,
			 unsigned long frame_pointer)
98
{
99
	unsigned long long calltime;
100 101 102 103 104
	int index;

	if (!current->ret_stack)
		return -EBUSY;

105 106 107 108 109 110
	/*
	 * We must make sure the ret_stack is tested before we read
	 * anything else.
	 */
	smp_rmb();

111 112 113 114 115 116
	/* The return trace stack is full */
	if (current->curr_ret_stack == FTRACE_RETFUNC_DEPTH - 1) {
		atomic_inc(&current->trace_overrun);
		return -EBUSY;
	}

117 118
	calltime = trace_clock_local();

119 120 121 122
	index = ++current->curr_ret_stack;
	barrier();
	current->ret_stack[index].ret = ret;
	current->ret_stack[index].func = func;
123
	current->ret_stack[index].calltime = calltime;
124
	current->ret_stack[index].subtime = 0;
125
	current->ret_stack[index].fp = frame_pointer;
126 127 128 129 130 131
	*depth = index;

	return 0;
}

/* Retrieve a function return address to the trace stack on thread info.*/
132
static void
133 134
ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret,
			unsigned long frame_pointer)
135 136 137 138 139 140 141 142 143 144 145 146 147
{
	int index;

	index = current->curr_ret_stack;

	if (unlikely(index < 0)) {
		ftrace_graph_stop();
		WARN_ON(1);
		/* Might as well panic, otherwise we have no where to go */
		*ret = (unsigned long)panic;
		return;
	}

148
#if defined(CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST) && !defined(CC_USING_FENTRY)
149 150 151 152 153 154 155 156 157 158
	/*
	 * 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.
159 160 161
	 *
	 * Note, -mfentry does not use frame pointers, and this test
	 *  is not needed if CC_USING_FENTRY is set.
162 163 164 165
	 */
	if (unlikely(current->ret_stack[index].fp != frame_pointer)) {
		ftrace_graph_stop();
		WARN(1, "Bad frame pointer: expected %lx, received %lx\n"
166
		     "  from func %ps return to %lx\n",
167 168 169 170 171 172 173 174 175
		     current->ret_stack[index].fp,
		     frame_pointer,
		     (void *)current->ret_stack[index].func,
		     current->ret_stack[index].ret);
		*ret = (unsigned long)panic;
		return;
	}
#endif

176 177 178 179 180 181 182 183 184 185 186
	*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);
	trace->depth = index;
}

/*
 * Send the trace to the ring-buffer.
 * @return the original return address.
 */
187
unsigned long ftrace_return_to_handler(unsigned long frame_pointer)
188 189 190 191
{
	struct ftrace_graph_ret trace;
	unsigned long ret;

192
	ftrace_pop_return_trace(&trace, &ret, frame_pointer);
193
	trace.rettime = trace_clock_local();
194
	ftrace_graph_return(&trace);
195 196
	barrier();
	current->curr_ret_stack--;
197 198 199 200 201 202 203 204 205 206 207

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

	return ret;
}

208
int __trace_graph_entry(struct trace_array *tr,
209 210 211 212 213 214
				struct ftrace_graph_ent *trace,
				unsigned long flags,
				int pc)
{
	struct ftrace_event_call *call = &event_funcgraph_entry;
	struct ring_buffer_event *event;
215
	struct ring_buffer *buffer = tr->buffer;
216 217
	struct ftrace_graph_ent_entry *entry;

R
Rusty Russell 已提交
218
	if (unlikely(__this_cpu_read(ftrace_cpu_disabled)))
219 220
		return 0;

221
	event = trace_buffer_lock_reserve(buffer, TRACE_GRAPH_ENT,
222 223 224 225 226
					  sizeof(*entry), flags, pc);
	if (!event)
		return 0;
	entry	= ring_buffer_event_data(event);
	entry->graph_ent			= *trace;
227
	if (!filter_current_check_discard(buffer, call, entry, event))
228
		__buffer_unlock_commit(buffer, event);
229 230 231 232

	return 1;
}

233 234
static inline int ftrace_graph_ignore_irqs(void)
{
235
	if (!ftrace_graph_skip_irqs || trace_recursion_test(TRACE_IRQ_BIT))
236 237 238 239 240
		return 0;

	return in_irq();
}

241 242 243 244 245 246 247 248 249 250 251 252 253
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;

	if (!ftrace_trace_task(current))
		return 0;

254
	/* trace it when it is-nested-in or is a function enabled. */
255 256 257
	if ((!(trace->depth || ftrace_graph_addr(trace->func)) ||
	     ftrace_graph_ignore_irqs()) ||
	    (max_depth && trace->depth >= max_depth))
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
		return 0;

	local_irq_save(flags);
	cpu = raw_smp_processor_id();
	data = tr->data[cpu];
	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;
}

277 278 279 280 281 282 283 284
int trace_graph_thresh_entry(struct ftrace_graph_ent *trace)
{
	if (tracing_thresh)
		return 1;
	else
		return trace_graph_entry(trace);
}

285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
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);
}

313
void __trace_graph_return(struct trace_array *tr,
314 315 316 317 318 319
				struct ftrace_graph_ret *trace,
				unsigned long flags,
				int pc)
{
	struct ftrace_event_call *call = &event_funcgraph_exit;
	struct ring_buffer_event *event;
320
	struct ring_buffer *buffer = tr->buffer;
321 322
	struct ftrace_graph_ret_entry *entry;

R
Rusty Russell 已提交
323
	if (unlikely(__this_cpu_read(ftrace_cpu_disabled)))
324 325
		return;

326
	event = trace_buffer_lock_reserve(buffer, TRACE_GRAPH_RET,
327 328 329 330 331
					  sizeof(*entry), flags, pc);
	if (!event)
		return;
	entry	= ring_buffer_event_data(event);
	entry->ret				= *trace;
332
	if (!filter_current_check_discard(buffer, call, entry, event))
333
		__buffer_unlock_commit(buffer, event);
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356
}

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();
	data = tr->data[cpu];
	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);
}

357 358 359 360 361 362 363 364 365
void set_graph_array(struct trace_array *tr)
{
	graph_array = tr;

	/* Make graph_array visible before we start tracing */

	smp_mb();
}

366 367 368 369 370 371 372 373 374
void trace_graph_thresh_return(struct ftrace_graph_ret *trace)
{
	if (tracing_thresh &&
	    (trace->rettime - trace->calltime < tracing_thresh))
		return;
	else
		trace_graph_return(trace);
}

375 376
static int graph_trace_init(struct trace_array *tr)
{
377 378
	int ret;

379
	set_graph_array(tr);
380 381 382 383 384 385
	if (tracing_thresh)
		ret = register_ftrace_graph(&trace_graph_thresh_return,
					    &trace_graph_thresh_entry);
	else
		ret = register_ftrace_graph(&trace_graph_return,
					    &trace_graph_entry);
386 387 388 389 390
	if (ret)
		return ret;
	tracing_start_cmdline_record();

	return 0;
391 392 393 394
}

static void graph_trace_reset(struct trace_array *tr)
{
395 396
	tracing_stop_cmdline_record();
	unregister_ftrace_graph();
397 398
}

399
static int max_bytes_for_cpu;
400 401 402 403 404 405

static enum print_line_t
print_graph_cpu(struct trace_seq *s, int cpu)
{
	int ret;

406 407 408 409 410
	/*
	 * Start with a space character - to make it stand out
	 * to the right a bit when trace output is pasted into
	 * email:
	 */
411
	ret = trace_seq_printf(s, " %*d) ", max_bytes_for_cpu, cpu);
412
	if (!ret)
413 414
		return TRACE_TYPE_PARTIAL_LINE;

415 416 417
	return TRACE_TYPE_HANDLED;
}

418 419 420 421 422
#define TRACE_GRAPH_PROCINFO_LENGTH	14

static enum print_line_t
print_graph_proc(struct trace_seq *s, pid_t pid)
{
423
	char comm[TASK_COMM_LEN];
424 425
	/* sign + log10(MAX_INT) + '\0' */
	char pid_str[11];
426 427 428 429
	int spaces = 0;
	int ret;
	int len;
	int i;
430

431
	trace_find_cmdline(pid, comm);
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
	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 */
	for (i = 0; i < spaces / 2; i++) {
		ret = trace_seq_printf(s, " ");
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	}

	ret = trace_seq_printf(s, "%s-%s", comm, pid_str);
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

	/* Last spaces to align center */
	for (i = 0; i < spaces - (spaces / 2); i++) {
		ret = trace_seq_printf(s, " ");
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	}
	return TRACE_TYPE_HANDLED;
}

461

462 463 464
static enum print_line_t
print_graph_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
{
465
	if (!trace_seq_putc(s, ' '))
466 467
		return 0;

468
	return trace_print_lat_fmt(s, entry);
469 470
}

471
/* If the pid changed since the last trace, output this event */
472
static enum print_line_t
473
verif_pid(struct trace_seq *s, pid_t pid, int cpu, struct fgraph_data *data)
474
{
475
	pid_t prev_pid;
476
	pid_t *last_pid;
477
	int ret;
478

479
	if (!data)
480 481
		return TRACE_TYPE_HANDLED;

482
	last_pid = &(per_cpu_ptr(data->cpu_data, cpu)->last_pid);
483 484

	if (*last_pid == pid)
485
		return TRACE_TYPE_HANDLED;
486

487 488
	prev_pid = *last_pid;
	*last_pid = pid;
489

490 491
	if (prev_pid == -1)
		return TRACE_TYPE_HANDLED;
492 493 494 495 496 497 498 499 500
/*
 * Context-switch trace line:

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

 */
	ret = trace_seq_printf(s,
501
		" ------------------------------------------\n");
502
	if (!ret)
503
		return TRACE_TYPE_PARTIAL_LINE;
504 505 506

	ret = print_graph_cpu(s, cpu);
	if (ret == TRACE_TYPE_PARTIAL_LINE)
507
		return TRACE_TYPE_PARTIAL_LINE;
508 509 510

	ret = print_graph_proc(s, prev_pid);
	if (ret == TRACE_TYPE_PARTIAL_LINE)
511
		return TRACE_TYPE_PARTIAL_LINE;
512 513 514

	ret = trace_seq_printf(s, " => ");
	if (!ret)
515
		return TRACE_TYPE_PARTIAL_LINE;
516 517 518

	ret = print_graph_proc(s, pid);
	if (ret == TRACE_TYPE_PARTIAL_LINE)
519
		return TRACE_TYPE_PARTIAL_LINE;
520 521 522 523

	ret = trace_seq_printf(s,
		"\n ------------------------------------------\n\n");
	if (!ret)
524
		return TRACE_TYPE_PARTIAL_LINE;
525

526
	return TRACE_TYPE_HANDLED;
527 528
}

529 530
static struct ftrace_graph_ret_entry *
get_return_for_leaf(struct trace_iterator *iter,
531 532
		struct ftrace_graph_ent_entry *curr)
{
533 534
	struct fgraph_data *data = iter->private;
	struct ring_buffer_iter *ring_iter = NULL;
535 536 537
	struct ring_buffer_event *event;
	struct ftrace_graph_ret_entry *next;

538 539 540 541 542 543 544 545
	/*
	 * 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 {
546

547
		ring_iter = trace_buffer_iter(iter, iter->cpu);
548 549 550 551 552 553 554 555 556

		/* 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.
			 */
557 558
			ring_buffer_consume(iter->tr->buffer, iter->cpu,
					    NULL, NULL);
559
			event = ring_buffer_peek(iter->tr->buffer, iter->cpu,
560
						 NULL, NULL);
561
		}
562

563 564 565 566
		if (!event)
			return NULL;

		next = ring_buffer_event_data(event);
567

568 569 570 571 572 573
		if (data) {
			/*
			 * Save current and next entries for later reference
			 * if the output fails.
			 */
			data->ent = *curr;
574 575 576 577 578 579 580 581 582
			/*
			 * 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;
583 584
		}
	}
585 586

	if (next->ent.type != TRACE_GRAPH_RET)
587
		return NULL;
588 589 590

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

593 594 595 596 597
	/* this is a leaf, now advance the iterator */
	if (ring_iter)
		ring_buffer_read(ring_iter, NULL);

	return next;
598 599
}

600 601 602 603 604 605 606 607 608 609 610
static int print_graph_abs_time(u64 t, struct trace_seq *s)
{
	unsigned long usecs_rem;

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

	return trace_seq_printf(s, "%5lu.%06lu |  ",
			(unsigned long)t, usecs_rem);
}

611
static enum print_line_t
612
print_graph_irq(struct trace_iterator *iter, unsigned long addr,
613
		enum trace_type type, int cpu, pid_t pid, u32 flags)
614 615
{
	int ret;
616
	struct trace_seq *s = &iter->seq;
617 618 619 620 621

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

622 623 624 625 626 627 628
	if (trace_flags & TRACE_ITER_CONTEXT_INFO) {
		/* Absolute time */
		if (flags & TRACE_GRAPH_PRINT_ABS_TIME) {
			ret = print_graph_abs_time(iter->ts, s);
			if (!ret)
				return TRACE_TYPE_PARTIAL_LINE;
		}
629

630 631 632 633 634 635
		/* Cpu */
		if (flags & TRACE_GRAPH_PRINT_CPU) {
			ret = print_graph_cpu(s, cpu);
			if (ret == TRACE_TYPE_PARTIAL_LINE)
				return TRACE_TYPE_PARTIAL_LINE;
		}
636

637 638 639 640 641 642 643 644 645
		/* Proc */
		if (flags & TRACE_GRAPH_PRINT_PROC) {
			ret = print_graph_proc(s, pid);
			if (ret == TRACE_TYPE_PARTIAL_LINE)
				return TRACE_TYPE_PARTIAL_LINE;
			ret = trace_seq_printf(s, " | ");
			if (!ret)
				return TRACE_TYPE_PARTIAL_LINE;
		}
646
	}
647

648
	/* No overhead */
649 650 651
	ret = print_graph_duration(DURATION_FILL_START, s, flags);
	if (ret != TRACE_TYPE_HANDLED)
		return ret;
652

653 654 655 656 657 658 659 660
	if (type == TRACE_GRAPH_ENT)
		ret = trace_seq_printf(s, "==========>");
	else
		ret = trace_seq_printf(s, "<==========");

	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

661 662 663 664
	ret = print_graph_duration(DURATION_FILL_END, s, flags);
	if (ret != TRACE_TYPE_HANDLED)
		return ret;

665
	ret = trace_seq_printf(s, "\n");
666 667 668 669 670

	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;
	return TRACE_TYPE_HANDLED;
}
671

672 673
enum print_line_t
trace_print_graph_duration(unsigned long long duration, struct trace_seq *s)
674 675
{
	unsigned long nsecs_rem = do_div(duration, 1000);
676 677 678 679 680 681 682 683 684
	/* log10(ULONG_MAX) + '\0' */
	char msecs_str[21];
	char nsecs_str[5];
	int ret, len;
	int i;

	sprintf(msecs_str, "%lu", (unsigned long) duration);

	/* Print msecs */
685
	ret = trace_seq_printf(s, "%s", msecs_str);
686 687 688 689 690 691 692
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

	len = strlen(msecs_str);

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

		snprintf(nsecs_str, slen, "%03lu", nsecs_rem);
696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711
		ret = trace_seq_printf(s, ".%s", nsecs_str);
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
		len += strlen(nsecs_str);
	}

	ret = trace_seq_printf(s, " us ");
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

	/* Print remaining spaces to fit the row's width */
	for (i = len; i < 7; i++) {
		ret = trace_seq_printf(s, " ");
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	}
712 713 714 715
	return TRACE_TYPE_HANDLED;
}

static enum print_line_t
716 717
print_graph_duration(unsigned long long duration, struct trace_seq *s,
		     u32 flags)
718
{
719 720
	int ret = -1;

721 722 723
	if (!(flags & TRACE_GRAPH_PRINT_DURATION) ||
	    !(trace_flags & TRACE_ITER_CONTEXT_INFO))
			return TRACE_TYPE_HANDLED;
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758

	/* No real adata, just filling the column with spaces */
	switch (duration) {
	case DURATION_FILL_FULL:
		ret = trace_seq_printf(s, "              |  ");
		return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
	case DURATION_FILL_START:
		ret = trace_seq_printf(s, "  ");
		return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
	case DURATION_FILL_END:
		ret = trace_seq_printf(s, " |");
		return ret ? TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE;
	}

	/* Signal a overhead of time execution to the output */
	if (flags & TRACE_GRAPH_PRINT_OVERHEAD) {
		/* Duration exceeded 100 msecs */
		if (duration > 100000ULL)
			ret = trace_seq_printf(s, "! ");
		/* Duration exceeded 10 msecs */
		else if (duration > 10000ULL)
			ret = trace_seq_printf(s, "+ ");
	}

	/*
	 * The -1 means we either did not exceed the duration tresholds
	 * or we dont want to print out the overhead. Either way we need
	 * to fill out the space.
	 */
	if (ret == -1)
		ret = trace_seq_printf(s, "  ");

	/* Catching here any failure happenned above */
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;
759 760 761 762

	ret = trace_print_graph_duration(duration, s);
	if (ret != TRACE_TYPE_HANDLED)
		return ret;
763 764 765 766 767

	ret = trace_seq_printf(s, "|  ");
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

768
	return TRACE_TYPE_HANDLED;
769 770 771
}

/* Case of a leaf function on its call entry */
772
static enum print_line_t
773
print_graph_entry_leaf(struct trace_iterator *iter,
774
		struct ftrace_graph_ent_entry *entry,
775 776
		struct ftrace_graph_ret_entry *ret_entry,
		struct trace_seq *s, u32 flags)
777
{
778
	struct fgraph_data *data = iter->private;
779 780 781
	struct ftrace_graph_ret *graph_ret;
	struct ftrace_graph_ent *call;
	unsigned long long duration;
782
	int ret;
783
	int i;
784

785 786 787 788
	graph_ret = &ret_entry->ret;
	call = &entry->graph_ent;
	duration = graph_ret->rettime - graph_ret->calltime;

789
	if (data) {
790
		struct fgraph_cpu_data *cpu_data;
791
		int cpu = iter->cpu;
792 793

		cpu_data = per_cpu_ptr(data->cpu_data, cpu);
794 795 796 797 798 799

		/*
		 * Comments display at + 1 to depth. Since
		 * this is a leaf function, keep the comments
		 * equal to this depth.
		 */
800 801 802 803 804
		cpu_data->depth = call->depth - 1;

		/* No need to keep this function around for this depth */
		if (call->depth < FTRACE_RETFUNC_DEPTH)
			cpu_data->enter_funcs[call->depth] = 0;
805 806
	}

807 808 809
	/* Overhead and duration */
	ret = print_graph_duration(duration, s, flags);
	if (ret == TRACE_TYPE_PARTIAL_LINE)
810
		return TRACE_TYPE_PARTIAL_LINE;
811

812 813 814 815 816 817 818
	/* Function */
	for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) {
		ret = trace_seq_printf(s, " ");
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	}

819
	ret = trace_seq_printf(s, "%ps();\n", (void *)call->func);
820 821 822 823 824 825 826
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

	return TRACE_TYPE_HANDLED;
}

static enum print_line_t
827 828
print_graph_entry_nested(struct trace_iterator *iter,
			 struct ftrace_graph_ent_entry *entry,
829
			 struct trace_seq *s, int cpu, u32 flags)
830 831
{
	struct ftrace_graph_ent *call = &entry->graph_ent;
832 833 834 835 836
	struct fgraph_data *data = iter->private;
	int ret;
	int i;

	if (data) {
837
		struct fgraph_cpu_data *cpu_data;
838 839
		int cpu = iter->cpu;

840 841 842 843 844 845
		cpu_data = per_cpu_ptr(data->cpu_data, cpu);
		cpu_data->depth = call->depth;

		/* Save this function pointer to see if the exit matches */
		if (call->depth < FTRACE_RETFUNC_DEPTH)
			cpu_data->enter_funcs[call->depth] = call->func;
846
	}
847

848
	/* No time */
849 850 851
	ret = print_graph_duration(DURATION_FILL_FULL, s, flags);
	if (ret != TRACE_TYPE_HANDLED)
		return ret;
852

853
	/* Function */
854 855
	for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) {
		ret = trace_seq_printf(s, " ");
856 857
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
858 859
	}

860
	ret = trace_seq_printf(s, "%ps() {\n", (void *)call->func);
861 862 863
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

864 865 866 867 868
	/*
	 * we already consumed the current entry to check the next one
	 * and see if this is a leaf.
	 */
	return TRACE_TYPE_NO_CONSUME;
869 870
}

871
static enum print_line_t
872
print_graph_prologue(struct trace_iterator *iter, struct trace_seq *s,
873
		     int type, unsigned long addr, u32 flags)
874
{
875
	struct fgraph_data *data = iter->private;
876
	struct trace_entry *ent = iter->ent;
877 878
	int cpu = iter->cpu;
	int ret;
879

880
	/* Pid */
881
	if (verif_pid(s, ent->pid, cpu, data) == TRACE_TYPE_PARTIAL_LINE)
882 883
		return TRACE_TYPE_PARTIAL_LINE;

884 885
	if (type) {
		/* Interrupt */
886
		ret = print_graph_irq(iter, addr, type, cpu, ent->pid, flags);
887 888 889
		if (ret == TRACE_TYPE_PARTIAL_LINE)
			return TRACE_TYPE_PARTIAL_LINE;
	}
890

891 892 893
	if (!(trace_flags & TRACE_ITER_CONTEXT_INFO))
		return 0;

894
	/* Absolute time */
895
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME) {
896 897 898 899 900
		ret = print_graph_abs_time(iter->ts, s);
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	}

901
	/* Cpu */
902
	if (flags & TRACE_GRAPH_PRINT_CPU) {
903
		ret = print_graph_cpu(s, cpu);
904 905 906 907 908
		if (ret == TRACE_TYPE_PARTIAL_LINE)
			return TRACE_TYPE_PARTIAL_LINE;
	}

	/* Proc */
909
	if (flags & TRACE_GRAPH_PRINT_PROC) {
910
		ret = print_graph_proc(s, ent->pid);
911 912 913 914
		if (ret == TRACE_TYPE_PARTIAL_LINE)
			return TRACE_TYPE_PARTIAL_LINE;

		ret = trace_seq_printf(s, " | ");
915 916 917
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	}
918

919 920 921 922 923 924 925
	/* Latency format */
	if (trace_flags & TRACE_ITER_LATENCY_FMT) {
		ret = print_graph_lat_fmt(s, ent);
		if (ret == TRACE_TYPE_PARTIAL_LINE)
			return TRACE_TYPE_PARTIAL_LINE;
	}

926 927 928
	return 0;
}

929 930 931 932 933
/*
 * Entry check for irq code
 *
 * returns 1 if
 *  - we are inside irq code
L
Lucas De Marchi 已提交
934
 *  - we just entered irq code
935 936 937 938 939 940 941 942 943 944
 *
 * 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;
945
	int *depth_irq;
946 947
	struct fgraph_data *data = iter->private;

948 949 950 951 952 953 954
	/*
	 * 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))
955 956
		return 0;

957 958
	depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990
	/*
	 * 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;
991
	int *depth_irq;
992 993
	struct fgraph_data *data = iter->private;

994 995 996 997 998 999 1000
	/*
	 * 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))
1001 1002
		return 0;

1003 1004
	depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
	/*
	 * 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;
}

1031 1032
static enum print_line_t
print_graph_entry(struct ftrace_graph_ent_entry *field, struct trace_seq *s,
1033
			struct trace_iterator *iter, u32 flags)
1034
{
1035
	struct fgraph_data *data = iter->private;
1036 1037
	struct ftrace_graph_ent *call = &field->graph_ent;
	struct ftrace_graph_ret_entry *leaf_ret;
1038 1039
	static enum print_line_t ret;
	int cpu = iter->cpu;
1040

1041 1042 1043
	if (check_irq_entry(iter, flags, call->func, call->depth))
		return TRACE_TYPE_HANDLED;

1044
	if (print_graph_prologue(iter, s, TRACE_GRAPH_ENT, call->func, flags))
1045 1046
		return TRACE_TYPE_PARTIAL_LINE;

1047 1048
	leaf_ret = get_return_for_leaf(iter, field);
	if (leaf_ret)
1049
		ret = print_graph_entry_leaf(iter, field, leaf_ret, s, flags);
1050
	else
1051
		ret = print_graph_entry_nested(iter, field, s, cpu, flags);
1052

1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
	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;
1066 1067
}

1068 1069
static enum print_line_t
print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
1070 1071
		   struct trace_entry *ent, struct trace_iterator *iter,
		   u32 flags)
1072
{
1073
	unsigned long long duration = trace->rettime - trace->calltime;
1074 1075 1076
	struct fgraph_data *data = iter->private;
	pid_t pid = ent->pid;
	int cpu = iter->cpu;
1077
	int func_match = 1;
1078 1079 1080
	int ret;
	int i;

1081 1082 1083
	if (check_irq_return(iter, flags, trace->depth))
		return TRACE_TYPE_HANDLED;

1084
	if (data) {
1085 1086 1087 1088
		struct fgraph_cpu_data *cpu_data;
		int cpu = iter->cpu;

		cpu_data = per_cpu_ptr(data->cpu_data, cpu);
1089 1090 1091 1092 1093 1094

		/*
		 * 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.
		 */
1095 1096 1097 1098 1099 1100 1101
		cpu_data->depth = trace->depth - 1;

		if (trace->depth < FTRACE_RETFUNC_DEPTH) {
			if (cpu_data->enter_funcs[trace->depth] != trace->func)
				func_match = 0;
			cpu_data->enter_funcs[trace->depth] = 0;
		}
1102
	}
1103

1104
	if (print_graph_prologue(iter, s, 0, 0, flags))
1105 1106
		return TRACE_TYPE_PARTIAL_LINE;

1107 1108 1109
	/* Overhead and duration */
	ret = print_graph_duration(duration, s, flags);
	if (ret == TRACE_TYPE_PARTIAL_LINE)
1110
		return TRACE_TYPE_PARTIAL_LINE;
1111

1112
	/* Closing brace */
1113 1114
	for (i = 0; i < trace->depth * TRACE_GRAPH_INDENT; i++) {
		ret = trace_seq_printf(s, " ");
1115 1116
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
1117 1118
	}

1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
	/*
	 * 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
	 * belongs to, write out the function name.
	 */
	if (func_match) {
		ret = trace_seq_printf(s, "}\n");
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	} else {
1130
		ret = trace_seq_printf(s, "} /* %ps */\n", (void *)trace->func);
1131 1132 1133
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
	}
1134

1135
	/* Overrun */
1136
	if (flags & TRACE_GRAPH_PRINT_OVERRUN) {
1137 1138
		ret = trace_seq_printf(s, " (Overruns: %lu)\n",
					trace->overrun);
1139 1140
		if (!ret)
			return TRACE_TYPE_PARTIAL_LINE;
1141
	}
1142

1143 1144
	ret = print_graph_irq(iter, trace->func, TRACE_GRAPH_RET,
			      cpu, pid, flags);
1145 1146 1147
	if (ret == TRACE_TYPE_PARTIAL_LINE)
		return TRACE_TYPE_PARTIAL_LINE;

1148 1149 1150
	return TRACE_TYPE_HANDLED;
}

1151
static enum print_line_t
1152 1153
print_graph_comment(struct trace_seq *s, struct trace_entry *ent,
		    struct trace_iterator *iter, u32 flags)
1154
{
1155
	unsigned long sym_flags = (trace_flags & TRACE_ITER_SYM_MASK);
1156
	struct fgraph_data *data = iter->private;
1157
	struct trace_event *event;
1158
	int depth = 0;
1159
	int ret;
1160 1161 1162
	int i;

	if (data)
1163
		depth = per_cpu_ptr(data->cpu_data, iter->cpu)->depth;
1164

1165
	if (print_graph_prologue(iter, s, 0, 0, flags))
1166 1167
		return TRACE_TYPE_PARTIAL_LINE;

1168
	/* No time */
1169 1170 1171
	ret = print_graph_duration(DURATION_FILL_FULL, s, flags);
	if (ret != TRACE_TYPE_HANDLED)
		return ret;
1172 1173

	/* Indentation */
1174 1175
	if (depth > 0)
		for (i = 0; i < (depth + 1) * TRACE_GRAPH_INDENT; i++) {
1176 1177 1178 1179 1180 1181
			ret = trace_seq_printf(s, " ");
			if (!ret)
				return TRACE_TYPE_PARTIAL_LINE;
		}

	/* The comment */
1182 1183 1184 1185
	ret = trace_seq_printf(s, "/* ");
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
	switch (iter->ent->type) {
	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;

1202
		ret = event->funcs->trace(iter, sym_flags, event);
1203 1204 1205
		if (ret != TRACE_TYPE_HANDLED)
			return ret;
	}
1206

1207 1208 1209 1210 1211 1212
	/* Strip ending newline */
	if (s->buffer[s->len - 1] == '\n') {
		s->buffer[s->len - 1] = '\0';
		s->len--;
	}

1213 1214 1215 1216 1217 1218 1219 1220
	ret = trace_seq_printf(s, " */\n");
	if (!ret)
		return TRACE_TYPE_PARTIAL_LINE;

	return TRACE_TYPE_HANDLED;
}


1221
enum print_line_t
1222
print_graph_function_flags(struct trace_iterator *iter, u32 flags)
1223
{
1224 1225
	struct ftrace_graph_ent_entry *field;
	struct fgraph_data *data = iter->private;
1226
	struct trace_entry *entry = iter->ent;
1227
	struct trace_seq *s = &iter->seq;
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
	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;
1243
		ret = print_graph_entry(field, s, iter, flags);
1244 1245 1246 1247 1248 1249 1250
		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;
	}
1251

1252 1253
	switch (entry->type) {
	case TRACE_GRAPH_ENT: {
1254 1255 1256 1257 1258 1259
		/*
		 * 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.
		 */
1260
		struct ftrace_graph_ent_entry saved;
1261
		trace_assign_type(field, entry);
1262
		saved = *field;
1263
		return print_graph_entry(&saved, s, iter, flags);
1264 1265 1266 1267
	}
	case TRACE_GRAPH_RET: {
		struct ftrace_graph_ret_entry *field;
		trace_assign_type(field, entry);
1268
		return print_graph_return(&field->ret, s, entry, iter, flags);
1269
	}
1270 1271 1272 1273 1274
	case TRACE_STACK:
	case TRACE_FN:
		/* dont trace stack and functions as comments */
		return TRACE_TYPE_UNHANDLED;

1275
	default:
1276
		return print_graph_comment(s, entry, iter, flags);
1277
	}
1278 1279

	return TRACE_TYPE_HANDLED;
1280 1281
}

1282 1283 1284
static enum print_line_t
print_graph_function(struct trace_iterator *iter)
{
1285
	return print_graph_function_flags(iter, tracer_flags.val);
1286 1287
}

1288
static enum print_line_t
1289 1290
print_graph_function_event(struct trace_iterator *iter, int flags,
			   struct trace_event *event)
1291 1292 1293 1294
{
	return print_graph_function(iter);
}

1295
static void print_lat_header(struct seq_file *s, u32 flags)
1296 1297 1298 1299 1300 1301
{
	static const char spaces[] = "                "	/* 16 spaces */
		"    "					/* 4 spaces */
		"                 ";			/* 17 spaces */
	int size = 0;

1302
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
1303
		size += 16;
1304
	if (flags & TRACE_GRAPH_PRINT_CPU)
1305
		size += 4;
1306
	if (flags & TRACE_GRAPH_PRINT_PROC)
1307 1308 1309 1310 1311 1312
		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);
1313
	seq_printf(s, "#%.*s||| /                      \n", size, spaces);
1314 1315
}

1316
static void __print_graph_headers_flags(struct seq_file *s, u32 flags)
1317
{
1318 1319 1320
	int lat = trace_flags & TRACE_ITER_LATENCY_FMT;

	if (lat)
1321
		print_lat_header(s, flags);
1322

1323
	/* 1st line */
1324
	seq_printf(s, "#");
1325
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
1326
		seq_printf(s, "     TIME       ");
1327
	if (flags & TRACE_GRAPH_PRINT_CPU)
1328
		seq_printf(s, " CPU");
1329
	if (flags & TRACE_GRAPH_PRINT_PROC)
1330 1331
		seq_printf(s, "  TASK/PID       ");
	if (lat)
1332
		seq_printf(s, "||||");
1333
	if (flags & TRACE_GRAPH_PRINT_DURATION)
1334 1335
		seq_printf(s, "  DURATION   ");
	seq_printf(s, "               FUNCTION CALLS\n");
1336 1337

	/* 2nd line */
1338
	seq_printf(s, "#");
1339
	if (flags & TRACE_GRAPH_PRINT_ABS_TIME)
1340
		seq_printf(s, "      |         ");
1341
	if (flags & TRACE_GRAPH_PRINT_CPU)
1342
		seq_printf(s, " |  ");
1343
	if (flags & TRACE_GRAPH_PRINT_PROC)
1344 1345
		seq_printf(s, "   |    |        ");
	if (lat)
1346
		seq_printf(s, "||||");
1347
	if (flags & TRACE_GRAPH_PRINT_DURATION)
1348 1349
		seq_printf(s, "   |   |      ");
	seq_printf(s, "               |   |   |   |\n");
1350
}
1351

1352
void print_graph_headers(struct seq_file *s)
1353 1354 1355 1356
{
	print_graph_headers_flags(s, tracer_flags.val);
}

1357 1358 1359 1360
void print_graph_headers_flags(struct seq_file *s, u32 flags)
{
	struct trace_iterator *iter = s->private;

1361 1362 1363
	if (!(trace_flags & TRACE_ITER_CONTEXT_INFO))
		return;

1364 1365 1366 1367 1368 1369
	if (trace_flags & TRACE_ITER_LATENCY_FMT) {
		/* print nothing if the buffers are empty */
		if (trace_empty(iter))
			return;

		print_trace_header(s, iter);
1370
	}
1371 1372 1373 1374

	__print_graph_headers_flags(s, flags);
}

1375
void graph_trace_open(struct trace_iterator *iter)
1376
{
1377
	/* pid and depth on the last trace processed */
1378
	struct fgraph_data *data;
1379 1380
	int cpu;

1381 1382 1383
	iter->private = NULL;

	data = kzalloc(sizeof(*data), GFP_KERNEL);
1384
	if (!data)
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394
		goto out_err;

	data->cpu_data = alloc_percpu(struct fgraph_cpu_data);
	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);
1395 1396
		int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);

1397 1398 1399
		*pid = -1;
		*depth = 0;
		*ignore = 0;
1400
		*depth_irq = -1;
1401
	}
1402

1403
	iter->private = data;
1404 1405 1406 1407 1408 1409 1410

	return;

 out_err_free:
	kfree(data);
 out_err:
	pr_warning("function graph tracer: not enough memory\n");
1411 1412
}

1413
void graph_trace_close(struct trace_iterator *iter)
1414
{
1415 1416 1417 1418 1419 1420
	struct fgraph_data *data = iter->private;

	if (data) {
		free_percpu(data->cpu_data);
		kfree(data);
	}
1421 1422
}

1423 1424 1425 1426 1427 1428 1429 1430
static int func_graph_set_flag(u32 old_flags, u32 bit, int set)
{
	if (bit == TRACE_GRAPH_PRINT_IRQS)
		ftrace_graph_skip_irqs = !set;

	return 0;
}

1431 1432 1433 1434
static struct trace_event_functions graph_functions = {
	.trace		= print_graph_function_event,
};

1435 1436
static struct trace_event graph_trace_entry_event = {
	.type		= TRACE_GRAPH_ENT,
1437
	.funcs		= &graph_functions,
1438 1439 1440 1441
};

static struct trace_event graph_trace_ret_event = {
	.type		= TRACE_GRAPH_RET,
1442
	.funcs		= &graph_functions
1443 1444
};

1445
static struct tracer graph_trace __read_mostly = {
1446
	.name		= "function_graph",
1447
	.open		= graph_trace_open,
1448
	.pipe_open	= graph_trace_open,
1449
	.close		= graph_trace_close,
1450
	.pipe_close	= graph_trace_close,
1451
	.wait_pipe	= poll_wait_pipe,
1452 1453
	.init		= graph_trace_init,
	.reset		= graph_trace_reset,
1454 1455
	.print_line	= print_graph_function,
	.print_header	= print_graph_headers,
1456
	.flags		= &tracer_flags,
1457
	.set_flag	= func_graph_set_flag,
1458 1459 1460
#ifdef CONFIG_FTRACE_SELFTEST
	.selftest	= trace_selftest_startup_function_graph,
#endif
1461 1462
};

1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515

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;

	max_depth = val;

	*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;

	n = sprintf(buf, "%d\n", max_depth);

	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,
};

static __init int init_graph_debugfs(void)
{
	struct dentry *d_tracer;

	d_tracer = tracing_init_dentry();
	if (!d_tracer)
		return 0;

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

	return 0;
}
fs_initcall(init_graph_debugfs);

1516 1517
static __init int init_graph_trace(void)
{
1518 1519
	max_bytes_for_cpu = snprintf(NULL, 0, "%d", nr_cpu_ids - 1);

1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
	if (!register_ftrace_event(&graph_trace_entry_event)) {
		pr_warning("Warning: could not register graph trace events\n");
		return 1;
	}

	if (!register_ftrace_event(&graph_trace_ret_event)) {
		pr_warning("Warning: could not register graph trace events\n");
		return 1;
	}

1530 1531 1532
	return register_tracer(&graph_trace);
}

1533
core_initcall(init_graph_trace);