blob: ff576d1db67de07a090f40bcd93d75c71d879500 [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>
Ingo Molnarece8a682006-12-06 20:37:24 -08009#include <linux/cache.h>
10
Linus Torvalds1da177e2005-04-16 15:20:36 -070011#include <asm/errno.h>
12
Ingo Molnarece8a682006-12-06 20:37:24 -080013extern int prof_on __read_mostly;
14
Linus Torvalds1da177e2005-04-16 15:20:36 -070015#define CPU_PROFILING 1
16#define SCHED_PROFILING 2
Ingo Molnarece8a682006-12-06 20:37:24 -080017#define SLEEP_PROFILING 3
Ingo Molnar07031e12007-01-10 23:15:38 -080018#define KVM_PROFILING 4
Linus Torvalds1da177e2005-04-16 15:20:36 -070019
20struct proc_dir_entry;
21struct pt_regs;
Andrew Morton772a0dc2006-03-23 03:00:55 -080022struct notifier_block;
Linus Torvalds1da177e2005-04-16 15:20:36 -070023
24/* init basic kernel profiler */
25void __init profile_init(void);
David Howells7d12e782006-10-05 14:55:46 +010026void profile_tick(int);
Ingo Molnarece8a682006-12-06 20:37:24 -080027
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
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#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
Linus Torvalds1da177e2005-04-16 15:20:36 -070058struct 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
Linus Torvalds1da177e2005-04-16 15:20:36 -070081struct pt_regs;
82
83#else
84
85static inline int task_handoff_register(struct notifier_block * n)
86{
87 return -ENOSYS;
88}
89
90static inline int task_handoff_unregister(struct notifier_block * n)
91{
92 return -ENOSYS;
93}
94
95static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
96{
97 return -ENOSYS;
98}
99
100static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
101{
102 return -ENOSYS;
103}
104
105#define profile_task_exit(a) do { } while (0)
106#define profile_handoff_task(a) (0)
107#define profile_munmap(a) do { } while (0)
108
109static inline int register_timer_hook(int (*hook)(struct pt_regs *))
110{
111 return -ENOSYS;
112}
113
114static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
115{
116 return;
117}
118
119#endif /* CONFIG_PROFILING */
120
121#endif /* __KERNEL__ */
122
123#endif /* _LINUX_PROFILE_H */