4 * Copyright (C) 2008 Steven Rostedt <srostedt@redhat.com>
6 #include <linux/kallsyms.h>
7 #include <linux/seq_file.h>
8 #include <linux/spinlock.h>
9 #include <linux/debugfs.h>
10 #include <linux/uaccess.h>
11 #include <linux/module.h>
12 #include <linux/ftrace.h>
13 #include <linux/hash.h>
15 #include <asm/local.h>
18 void ftrace_likely_update(struct ftrace_likely_data
*f
, int val
, int expect
)
20 /* FIXME: Make this atomic! */
26 EXPORT_SYMBOL(ftrace_likely_update
);
28 struct ftrace_pointer
{
34 t_next(struct seq_file
*m
, void *v
, loff_t
*pos
)
36 struct ftrace_pointer
*f
= m
->private;
37 struct ftrace_likely_data
*p
= v
;
46 if ((void *)p
>= (void *)f
->stop
)
52 static void *t_start(struct seq_file
*m
, loff_t
*pos
)
57 for (; t
&& l
< *pos
; t
= t_next(m
, t
, &l
))
63 static void t_stop(struct seq_file
*m
, void *p
)
67 static int t_show(struct seq_file
*m
, void *v
)
69 struct ftrace_likely_data
*p
= v
;
71 unsigned long percent
;
74 seq_printf(m
, " correct incorrect %% "
77 " ------- --------- - "
83 /* Only print the file, not the path */
84 f
= p
->file
+ strlen(p
->file
);
85 while (f
>= p
->file
&& *f
!= '/')
90 percent
= p
->incorrect
* 100;
91 percent
/= p
->correct
+ p
->incorrect
;
93 percent
= p
->incorrect
? 100 : 0;
95 seq_printf(m
, "%8lu %8lu %3lu ", p
->correct
, p
->incorrect
, percent
);
96 seq_printf(m
, "%-30.30s %-20.20s %d\n", p
->func
, f
, p
->line
);
100 static struct seq_operations tracing_likely_seq_ops
= {
107 static int tracing_likely_open(struct inode
*inode
, struct file
*file
)
111 ret
= seq_open(file
, &tracing_likely_seq_ops
);
113 struct seq_file
*m
= file
->private_data
;
114 m
->private = (void *)inode
->i_private
;
120 static struct file_operations tracing_likely_fops
= {
121 .open
= tracing_likely_open
,
126 extern unsigned long __start_likely_profile
[];
127 extern unsigned long __stop_likely_profile
[];
128 extern unsigned long __start_unlikely_profile
[];
129 extern unsigned long __stop_unlikely_profile
[];
131 static struct ftrace_pointer ftrace_likely_pos
= {
132 .start
= __start_likely_profile
,
133 .stop
= __stop_likely_profile
,
136 static struct ftrace_pointer ftrace_unlikely_pos
= {
137 .start
= __start_unlikely_profile
,
138 .stop
= __stop_unlikely_profile
,
141 static __init
int ftrace_unlikely_init(void)
143 struct dentry
*d_tracer
;
144 struct dentry
*entry
;
146 d_tracer
= tracing_init_dentry();
148 entry
= debugfs_create_file("profile_likely", 0444, d_tracer
,
150 &tracing_likely_fops
);
152 pr_warning("Could not create debugfs 'profile_likely' entry\n");
154 entry
= debugfs_create_file("profile_unlikely", 0444, d_tracer
,
155 &ftrace_unlikely_pos
,
156 &tracing_likely_fops
);
158 pr_warning("Could not create debugfs"
159 " 'profile_unlikely' entry\n");
164 device_initcall(ftrace_unlikely_init
);