xref: /linux/include/linux/profile.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds #ifndef _LINUX_PROFILE_H
2*1da177e4SLinus Torvalds #define _LINUX_PROFILE_H
3*1da177e4SLinus Torvalds 
4*1da177e4SLinus Torvalds #ifdef __KERNEL__
5*1da177e4SLinus Torvalds 
6*1da177e4SLinus Torvalds #include <linux/kernel.h>
7*1da177e4SLinus Torvalds #include <linux/config.h>
8*1da177e4SLinus Torvalds #include <linux/init.h>
9*1da177e4SLinus Torvalds #include <linux/cpumask.h>
10*1da177e4SLinus Torvalds #include <asm/errno.h>
11*1da177e4SLinus Torvalds 
12*1da177e4SLinus Torvalds #define CPU_PROFILING	1
13*1da177e4SLinus Torvalds #define SCHED_PROFILING	2
14*1da177e4SLinus Torvalds 
15*1da177e4SLinus Torvalds struct proc_dir_entry;
16*1da177e4SLinus Torvalds struct pt_regs;
17*1da177e4SLinus Torvalds 
18*1da177e4SLinus Torvalds /* init basic kernel profiler */
19*1da177e4SLinus Torvalds void __init profile_init(void);
20*1da177e4SLinus Torvalds void profile_tick(int, struct pt_regs *);
21*1da177e4SLinus Torvalds void profile_hit(int, void *);
22*1da177e4SLinus Torvalds #ifdef CONFIG_PROC_FS
23*1da177e4SLinus Torvalds void create_prof_cpu_mask(struct proc_dir_entry *);
24*1da177e4SLinus Torvalds #else
25*1da177e4SLinus Torvalds #define create_prof_cpu_mask(x)			do { (void)(x); } while (0)
26*1da177e4SLinus Torvalds #endif
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds enum profile_type {
29*1da177e4SLinus Torvalds 	PROFILE_TASK_EXIT,
30*1da177e4SLinus Torvalds 	PROFILE_MUNMAP
31*1da177e4SLinus Torvalds };
32*1da177e4SLinus Torvalds 
33*1da177e4SLinus Torvalds #ifdef CONFIG_PROFILING
34*1da177e4SLinus Torvalds 
35*1da177e4SLinus Torvalds struct notifier_block;
36*1da177e4SLinus Torvalds struct task_struct;
37*1da177e4SLinus Torvalds struct mm_struct;
38*1da177e4SLinus Torvalds 
39*1da177e4SLinus Torvalds /* task is in do_exit() */
40*1da177e4SLinus Torvalds void profile_task_exit(struct task_struct * task);
41*1da177e4SLinus Torvalds 
42*1da177e4SLinus Torvalds /* task is dead, free task struct ? Returns 1 if
43*1da177e4SLinus Torvalds  * the task was taken, 0 if the task should be freed.
44*1da177e4SLinus Torvalds  */
45*1da177e4SLinus Torvalds int profile_handoff_task(struct task_struct * task);
46*1da177e4SLinus Torvalds 
47*1da177e4SLinus Torvalds /* sys_munmap */
48*1da177e4SLinus Torvalds void profile_munmap(unsigned long addr);
49*1da177e4SLinus Torvalds 
50*1da177e4SLinus Torvalds int task_handoff_register(struct notifier_block * n);
51*1da177e4SLinus Torvalds int task_handoff_unregister(struct notifier_block * n);
52*1da177e4SLinus Torvalds 
53*1da177e4SLinus Torvalds int profile_event_register(enum profile_type, struct notifier_block * n);
54*1da177e4SLinus Torvalds int profile_event_unregister(enum profile_type, struct notifier_block * n);
55*1da177e4SLinus Torvalds 
56*1da177e4SLinus Torvalds int register_timer_hook(int (*hook)(struct pt_regs *));
57*1da177e4SLinus Torvalds void unregister_timer_hook(int (*hook)(struct pt_regs *));
58*1da177e4SLinus Torvalds 
59*1da177e4SLinus Torvalds /* Timer based profiling hook */
60*1da177e4SLinus Torvalds extern int (*timer_hook)(struct pt_regs *);
61*1da177e4SLinus Torvalds 
62*1da177e4SLinus Torvalds struct pt_regs;
63*1da177e4SLinus Torvalds 
64*1da177e4SLinus Torvalds #else
65*1da177e4SLinus Torvalds 
66*1da177e4SLinus Torvalds static inline int task_handoff_register(struct notifier_block * n)
67*1da177e4SLinus Torvalds {
68*1da177e4SLinus Torvalds 	return -ENOSYS;
69*1da177e4SLinus Torvalds }
70*1da177e4SLinus Torvalds 
71*1da177e4SLinus Torvalds static inline int task_handoff_unregister(struct notifier_block * n)
72*1da177e4SLinus Torvalds {
73*1da177e4SLinus Torvalds 	return -ENOSYS;
74*1da177e4SLinus Torvalds }
75*1da177e4SLinus Torvalds 
76*1da177e4SLinus Torvalds static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
77*1da177e4SLinus Torvalds {
78*1da177e4SLinus Torvalds 	return -ENOSYS;
79*1da177e4SLinus Torvalds }
80*1da177e4SLinus Torvalds 
81*1da177e4SLinus Torvalds static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
82*1da177e4SLinus Torvalds {
83*1da177e4SLinus Torvalds 	return -ENOSYS;
84*1da177e4SLinus Torvalds }
85*1da177e4SLinus Torvalds 
86*1da177e4SLinus Torvalds #define profile_task_exit(a) do { } while (0)
87*1da177e4SLinus Torvalds #define profile_handoff_task(a) (0)
88*1da177e4SLinus Torvalds #define profile_munmap(a) do { } while (0)
89*1da177e4SLinus Torvalds 
90*1da177e4SLinus Torvalds static inline int register_timer_hook(int (*hook)(struct pt_regs *))
91*1da177e4SLinus Torvalds {
92*1da177e4SLinus Torvalds 	return -ENOSYS;
93*1da177e4SLinus Torvalds }
94*1da177e4SLinus Torvalds 
95*1da177e4SLinus Torvalds static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
96*1da177e4SLinus Torvalds {
97*1da177e4SLinus Torvalds 	return;
98*1da177e4SLinus Torvalds }
99*1da177e4SLinus Torvalds 
100*1da177e4SLinus Torvalds #endif /* CONFIG_PROFILING */
101*1da177e4SLinus Torvalds 
102*1da177e4SLinus Torvalds #endif /* __KERNEL__ */
103*1da177e4SLinus Torvalds 
104*1da177e4SLinus Torvalds #endif /* _LINUX_PROFILE_H */
105