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