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