Merge git://git.infradead.org/~dwmw2/random-2.6
[pandora-kernel.git] / include / linux / profile.h
1 #ifndef _LINUX_PROFILE_H
2 #define _LINUX_PROFILE_H
3
4 #include <linux/kernel.h>
5 #include <linux/init.h>
6 #include <linux/cpumask.h>
7 #include <linux/cache.h>
8
9 #include <asm/errno.h>
10
11 #define CPU_PROFILING   1
12 #define SCHED_PROFILING 2
13 #define SLEEP_PROFILING 3
14 #define KVM_PROFILING   4
15
16 struct proc_dir_entry;
17 struct pt_regs;
18 struct notifier_block;
19
20 #if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS)
21 void create_prof_cpu_mask(struct proc_dir_entry *de);
22 #else
23 static inline void create_prof_cpu_mask(struct proc_dir_entry *de)
24 {
25 }
26 #endif
27
28 enum profile_type {
29         PROFILE_TASK_EXIT,
30         PROFILE_MUNMAP
31 };
32
33 #ifdef CONFIG_PROFILING
34
35 extern int prof_on __read_mostly;
36
37 /* init basic kernel profiler */
38 void __init profile_init(void);
39 void profile_tick(int type);
40
41 /*
42  * Add multiple profiler hits to a given address:
43  */
44 void profile_hits(int type, void *ip, unsigned int nr_hits);
45
46 /*
47  * Single profiler hit:
48  */
49 static inline void profile_hit(int type, void *ip)
50 {
51         /*
52          * Speedup for the common (no profiling enabled) case:
53          */
54         if (unlikely(prof_on == type))
55                 profile_hits(type, ip, 1);
56 }
57
58 struct task_struct;
59 struct mm_struct;
60
61 /* task is in do_exit() */
62 void profile_task_exit(struct task_struct * task);
63
64 /* task is dead, free task struct ? Returns 1 if
65  * the task was taken, 0 if the task should be freed.
66  */
67 int profile_handoff_task(struct task_struct * task);
68
69 /* sys_munmap */
70 void profile_munmap(unsigned long addr);
71
72 int task_handoff_register(struct notifier_block * n);
73 int task_handoff_unregister(struct notifier_block * n);
74
75 int profile_event_register(enum profile_type, struct notifier_block * n);
76 int profile_event_unregister(enum profile_type, struct notifier_block * n);
77
78 int register_timer_hook(int (*hook)(struct pt_regs *));
79 void unregister_timer_hook(int (*hook)(struct pt_regs *));
80
81 struct pt_regs;
82
83 #else
84
85 #define prof_on 0
86
87 static inline void profile_init(void)
88 {
89         return;
90 }
91
92 static inline void profile_tick(int type)
93 {
94         return;
95 }
96
97 static inline void profile_hits(int type, void *ip, unsigned int nr_hits)
98 {
99         return;
100 }
101
102 static inline void profile_hit(int type, void *ip)
103 {
104         return;
105 }
106
107 static inline int task_handoff_register(struct notifier_block * n)
108 {
109         return -ENOSYS;
110 }
111
112 static inline int task_handoff_unregister(struct notifier_block * n)
113 {
114         return -ENOSYS;
115 }
116
117 static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
118 {
119         return -ENOSYS;
120 }
121
122 static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
123 {
124         return -ENOSYS;
125 }
126
127 #define profile_task_exit(a) do { } while (0)
128 #define profile_handoff_task(a) (0)
129 #define profile_munmap(a) do { } while (0)
130
131 static inline int register_timer_hook(int (*hook)(struct pt_regs *))
132 {
133         return -ENOSYS;
134 }
135
136 static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
137 {
138         return;
139 }
140
141 #endif /* CONFIG_PROFILING */
142
143 #endif /* _LINUX_PROFILE_H */