blob: eec48f5f9348efd17ba2fd47d6a4d38cc31be100 [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
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 */