blob: 4081fa31081fe6d436a931520b6d7d29d9d506df [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _LINUX_PROFILE_H
2#define _LINUX_PROFILE_H
3
Linus Torvalds1da177e2005-04-16 15:20:36 -07004#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#include <linux/init.h>
6#include <linux/cpumask.h>
Ingo Molnarece8a682006-12-06 20:37:24 -08007#include <linux/cache.h>
8
Linus Torvalds1da177e2005-04-16 15:20:36 -07009#include <asm/errno.h>
10
11#define CPU_PROFILING 1
12#define SCHED_PROFILING 2
Ingo Molnarece8a682006-12-06 20:37:24 -080013#define SLEEP_PROFILING 3
Ingo Molnar07031e12007-01-10 23:15:38 -080014#define KVM_PROFILING 4
Linus Torvalds1da177e2005-04-16 15:20:36 -070015
16struct proc_dir_entry;
17struct pt_regs;
Andrew Morton772a0dc2006-03-23 03:00:55 -080018struct notifier_block;
Linus Torvalds1da177e2005-04-16 15:20:36 -070019
Adrian Bunkb03f6482008-07-25 01:45:35 -070020#if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS)
21void create_prof_cpu_mask(struct proc_dir_entry *);
22#else
23#define create_prof_cpu_mask(x) do { (void)(x); } while (0)
24#endif
25
26enum profile_type {
27 PROFILE_TASK_EXIT,
28 PROFILE_MUNMAP
29};
30
31#ifdef CONFIG_PROFILING
32
33extern int prof_on __read_mostly;
34
Linus Torvalds1da177e2005-04-16 15:20:36 -070035/* init basic kernel profiler */
36void __init profile_init(void);
Adrian Bunkb03f6482008-07-25 01:45:35 -070037void profile_tick(int type);
Ingo Molnarece8a682006-12-06 20:37:24 -080038
39/*
40 * Add multiple profiler hits to a given address:
41 */
Adrian Bunkb03f6482008-07-25 01:45:35 -070042void profile_hits(int type, void *ip, unsigned int nr_hits);
Ingo Molnarece8a682006-12-06 20:37:24 -080043
44/*
45 * Single profiler hit:
46 */
47static inline void profile_hit(int type, void *ip)
48{
49 /*
50 * Speedup for the common (no profiling enabled) case:
51 */
52 if (unlikely(prof_on == type))
53 profile_hits(type, ip, 1);
54}
55
Linus Torvalds1da177e2005-04-16 15:20:36 -070056struct task_struct;
57struct mm_struct;
58
59/* task is in do_exit() */
60void profile_task_exit(struct task_struct * task);
61
62/* task is dead, free task struct ? Returns 1 if
63 * the task was taken, 0 if the task should be freed.
64 */
65int profile_handoff_task(struct task_struct * task);
66
67/* sys_munmap */
68void profile_munmap(unsigned long addr);
69
70int task_handoff_register(struct notifier_block * n);
71int task_handoff_unregister(struct notifier_block * n);
72
73int profile_event_register(enum profile_type, struct notifier_block * n);
74int profile_event_unregister(enum profile_type, struct notifier_block * n);
75
76int register_timer_hook(int (*hook)(struct pt_regs *));
77void unregister_timer_hook(int (*hook)(struct pt_regs *));
78
Linus Torvalds1da177e2005-04-16 15:20:36 -070079struct pt_regs;
80
81#else
82
Adrian Bunkb03f6482008-07-25 01:45:35 -070083#define prof_on 0
84
85static inline void profile_init(void)
86{
87 return;
88}
89
90static inline void profile_tick(int type)
91{
92 return;
93}
94
95static inline void profile_hits(int type, void *ip, unsigned int nr_hits)
96{
97 return;
98}
99
100static inline void profile_hit(int type, void *ip)
101{
102 return;
103}
104
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105static inline int task_handoff_register(struct notifier_block * n)
106{
107 return -ENOSYS;
108}
109
110static inline int task_handoff_unregister(struct notifier_block * n)
111{
112 return -ENOSYS;
113}
114
115static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
116{
117 return -ENOSYS;
118}
119
120static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
121{
122 return -ENOSYS;
123}
124
125#define profile_task_exit(a) do { } while (0)
126#define profile_handoff_task(a) (0)
127#define profile_munmap(a) do { } while (0)
128
129static inline int register_timer_hook(int (*hook)(struct pt_regs *))
130{
131 return -ENOSYS;
132}
133
134static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
135{
136 return;
137}
138
139#endif /* CONFIG_PROFILING */
140
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141#endif /* _LINUX_PROFILE_H */