diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/ftrace.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index a8929e4c77c1..ad568c742bfc 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -768,6 +768,7 @@ enum { | |||
768 | FTRACE_ITER_FILTER = (1 << 0), | 768 | FTRACE_ITER_FILTER = (1 << 0), |
769 | FTRACE_ITER_CONT = (1 << 1), | 769 | FTRACE_ITER_CONT = (1 << 1), |
770 | FTRACE_ITER_NOTRACE = (1 << 2), | 770 | FTRACE_ITER_NOTRACE = (1 << 2), |
771 | FTRACE_ITER_FAILURES = (1 << 3), | ||
771 | }; | 772 | }; |
772 | 773 | ||
773 | #define FTRACE_BUFF_MAX (KSYM_SYMBOL_LEN+4) /* room for wildcards */ | 774 | #define FTRACE_BUFF_MAX (KSYM_SYMBOL_LEN+4) /* room for wildcards */ |
@@ -799,9 +800,16 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
799 | } | 800 | } |
800 | } else { | 801 | } else { |
801 | rec = &iter->pg->records[iter->idx++]; | 802 | rec = &iter->pg->records[iter->idx++]; |
802 | if ((rec->flags & FTRACE_FL_FAILED) || | 803 | if ((!(iter->flags & FTRACE_ITER_FAILURES) && |
804 | (rec->flags & FTRACE_FL_FAILED)) || | ||
805 | |||
806 | ((iter->flags & FTRACE_ITER_FAILURES) && | ||
807 | (!(rec->flags & FTRACE_FL_FAILED) || | ||
808 | (rec->flags & FTRACE_FL_FREE))) || | ||
809 | |||
803 | ((iter->flags & FTRACE_ITER_FILTER) && | 810 | ((iter->flags & FTRACE_ITER_FILTER) && |
804 | !(rec->flags & FTRACE_FL_FILTER)) || | 811 | !(rec->flags & FTRACE_FL_FILTER)) || |
812 | |||
805 | ((iter->flags & FTRACE_ITER_NOTRACE) && | 813 | ((iter->flags & FTRACE_ITER_NOTRACE) && |
806 | !(rec->flags & FTRACE_FL_NOTRACE))) { | 814 | !(rec->flags & FTRACE_FL_NOTRACE))) { |
807 | rec = NULL; | 815 | rec = NULL; |
@@ -896,6 +904,24 @@ int ftrace_avail_release(struct inode *inode, struct file *file) | |||
896 | return 0; | 904 | return 0; |
897 | } | 905 | } |
898 | 906 | ||
907 | static int | ||
908 | ftrace_failures_open(struct inode *inode, struct file *file) | ||
909 | { | ||
910 | int ret; | ||
911 | struct seq_file *m; | ||
912 | struct ftrace_iterator *iter; | ||
913 | |||
914 | ret = ftrace_avail_open(inode, file); | ||
915 | if (!ret) { | ||
916 | m = (struct seq_file *)file->private_data; | ||
917 | iter = (struct ftrace_iterator *)m->private; | ||
918 | iter->flags = FTRACE_ITER_FAILURES; | ||
919 | } | ||
920 | |||
921 | return ret; | ||
922 | } | ||
923 | |||
924 | |||
899 | static void ftrace_filter_reset(int enable) | 925 | static void ftrace_filter_reset(int enable) |
900 | { | 926 | { |
901 | struct ftrace_page *pg; | 927 | struct ftrace_page *pg; |
@@ -1309,6 +1335,13 @@ static struct file_operations ftrace_avail_fops = { | |||
1309 | .release = ftrace_avail_release, | 1335 | .release = ftrace_avail_release, |
1310 | }; | 1336 | }; |
1311 | 1337 | ||
1338 | static struct file_operations ftrace_failures_fops = { | ||
1339 | .open = ftrace_failures_open, | ||
1340 | .read = seq_read, | ||
1341 | .llseek = seq_lseek, | ||
1342 | .release = ftrace_avail_release, | ||
1343 | }; | ||
1344 | |||
1312 | static struct file_operations ftrace_filter_fops = { | 1345 | static struct file_operations ftrace_filter_fops = { |
1313 | .open = ftrace_filter_open, | 1346 | .open = ftrace_filter_open, |
1314 | .read = ftrace_regex_read, | 1347 | .read = ftrace_regex_read, |
@@ -1386,6 +1419,11 @@ static __init int ftrace_init_debugfs(void) | |||
1386 | pr_warning("Could not create debugfs " | 1419 | pr_warning("Could not create debugfs " |
1387 | "'available_filter_functions' entry\n"); | 1420 | "'available_filter_functions' entry\n"); |
1388 | 1421 | ||
1422 | entry = debugfs_create_file("failures", 0444, | ||
1423 | d_tracer, NULL, &ftrace_failures_fops); | ||
1424 | if (!entry) | ||
1425 | pr_warning("Could not create debugfs 'failures' entry\n"); | ||
1426 | |||
1389 | entry = debugfs_create_file("set_ftrace_filter", 0644, d_tracer, | 1427 | entry = debugfs_create_file("set_ftrace_filter", 0644, d_tracer, |
1390 | NULL, &ftrace_filter_fops); | 1428 | NULL, &ftrace_filter_fops); |
1391 | if (!entry) | 1429 | if (!entry) |