xref: /linux/include/linux/profile.h (revision b03f6489f9f27dc519a4c60ebf39cc7b8a58eae7)
11da177e4SLinus Torvalds #ifndef _LINUX_PROFILE_H
21da177e4SLinus Torvalds #define _LINUX_PROFILE_H
31da177e4SLinus Torvalds 
41da177e4SLinus Torvalds #include <linux/kernel.h>
51da177e4SLinus Torvalds #include <linux/init.h>
61da177e4SLinus Torvalds #include <linux/cpumask.h>
7ece8a684SIngo Molnar #include <linux/cache.h>
8ece8a684SIngo Molnar 
91da177e4SLinus Torvalds #include <asm/errno.h>
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #define CPU_PROFILING	1
121da177e4SLinus Torvalds #define SCHED_PROFILING	2
13ece8a684SIngo Molnar #define SLEEP_PROFILING	3
1407031e14SIngo Molnar #define KVM_PROFILING	4
151da177e4SLinus Torvalds 
161da177e4SLinus Torvalds struct proc_dir_entry;
171da177e4SLinus Torvalds struct pt_regs;
18772a0dc5SAndrew Morton struct notifier_block;
191da177e4SLinus Torvalds 
20*b03f6489SAdrian Bunk #if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS)
21*b03f6489SAdrian Bunk void create_prof_cpu_mask(struct proc_dir_entry *);
22*b03f6489SAdrian Bunk #else
23*b03f6489SAdrian Bunk #define create_prof_cpu_mask(x)			do { (void)(x); } while (0)
24*b03f6489SAdrian Bunk #endif
25*b03f6489SAdrian Bunk 
26*b03f6489SAdrian Bunk enum profile_type {
27*b03f6489SAdrian Bunk 	PROFILE_TASK_EXIT,
28*b03f6489SAdrian Bunk 	PROFILE_MUNMAP
29*b03f6489SAdrian Bunk };
30*b03f6489SAdrian Bunk 
31*b03f6489SAdrian Bunk #ifdef CONFIG_PROFILING
32*b03f6489SAdrian Bunk 
33*b03f6489SAdrian Bunk extern int prof_on __read_mostly;
34*b03f6489SAdrian Bunk 
351da177e4SLinus Torvalds /* init basic kernel profiler */
361da177e4SLinus Torvalds void __init profile_init(void);
37*b03f6489SAdrian Bunk void profile_tick(int type);
38ece8a684SIngo Molnar 
39ece8a684SIngo Molnar /*
40ece8a684SIngo Molnar  * Add multiple profiler hits to a given address:
41ece8a684SIngo Molnar  */
42*b03f6489SAdrian Bunk void profile_hits(int type, void *ip, unsigned int nr_hits);
43ece8a684SIngo Molnar 
44ece8a684SIngo Molnar /*
45ece8a684SIngo Molnar  * Single profiler hit:
46ece8a684SIngo Molnar  */
47ece8a684SIngo Molnar static inline void profile_hit(int type, void *ip)
48ece8a684SIngo Molnar {
49ece8a684SIngo Molnar 	/*
50ece8a684SIngo Molnar 	 * Speedup for the common (no profiling enabled) case:
51ece8a684SIngo Molnar 	 */
52ece8a684SIngo Molnar 	if (unlikely(prof_on == type))
53ece8a684SIngo Molnar 		profile_hits(type, ip, 1);
54ece8a684SIngo Molnar }
55ece8a684SIngo Molnar 
561da177e4SLinus Torvalds struct task_struct;
571da177e4SLinus Torvalds struct mm_struct;
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds /* task is in do_exit() */
601da177e4SLinus Torvalds void profile_task_exit(struct task_struct * task);
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds /* task is dead, free task struct ? Returns 1 if
631da177e4SLinus Torvalds  * the task was taken, 0 if the task should be freed.
641da177e4SLinus Torvalds  */
651da177e4SLinus Torvalds int profile_handoff_task(struct task_struct * task);
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds /* sys_munmap */
681da177e4SLinus Torvalds void profile_munmap(unsigned long addr);
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds int task_handoff_register(struct notifier_block * n);
711da177e4SLinus Torvalds int task_handoff_unregister(struct notifier_block * n);
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds int profile_event_register(enum profile_type, struct notifier_block * n);
741da177e4SLinus Torvalds int profile_event_unregister(enum profile_type, struct notifier_block * n);
751da177e4SLinus Torvalds 
761da177e4SLinus Torvalds int register_timer_hook(int (*hook)(struct pt_regs *));
771da177e4SLinus Torvalds void unregister_timer_hook(int (*hook)(struct pt_regs *));
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds struct pt_regs;
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds #else
821da177e4SLinus Torvalds 
83*b03f6489SAdrian Bunk #define prof_on 0
84*b03f6489SAdrian Bunk 
85*b03f6489SAdrian Bunk static inline void profile_init(void)
86*b03f6489SAdrian Bunk {
87*b03f6489SAdrian Bunk 	return;
88*b03f6489SAdrian Bunk }
89*b03f6489SAdrian Bunk 
90*b03f6489SAdrian Bunk static inline void profile_tick(int type)
91*b03f6489SAdrian Bunk {
92*b03f6489SAdrian Bunk 	return;
93*b03f6489SAdrian Bunk }
94*b03f6489SAdrian Bunk 
95*b03f6489SAdrian Bunk static inline void profile_hits(int type, void *ip, unsigned int nr_hits)
96*b03f6489SAdrian Bunk {
97*b03f6489SAdrian Bunk 	return;
98*b03f6489SAdrian Bunk }
99*b03f6489SAdrian Bunk 
100*b03f6489SAdrian Bunk static inline void profile_hit(int type, void *ip)
101*b03f6489SAdrian Bunk {
102*b03f6489SAdrian Bunk 	return;
103*b03f6489SAdrian Bunk }
104*b03f6489SAdrian Bunk 
1051da177e4SLinus Torvalds static inline int task_handoff_register(struct notifier_block * n)
1061da177e4SLinus Torvalds {
1071da177e4SLinus Torvalds 	return -ENOSYS;
1081da177e4SLinus Torvalds }
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds static inline int task_handoff_unregister(struct notifier_block * n)
1111da177e4SLinus Torvalds {
1121da177e4SLinus Torvalds 	return -ENOSYS;
1131da177e4SLinus Torvalds }
1141da177e4SLinus Torvalds 
1151da177e4SLinus Torvalds static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
1161da177e4SLinus Torvalds {
1171da177e4SLinus Torvalds 	return -ENOSYS;
1181da177e4SLinus Torvalds }
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
1211da177e4SLinus Torvalds {
1221da177e4SLinus Torvalds 	return -ENOSYS;
1231da177e4SLinus Torvalds }
1241da177e4SLinus Torvalds 
1251da177e4SLinus Torvalds #define profile_task_exit(a) do { } while (0)
1261da177e4SLinus Torvalds #define profile_handoff_task(a) (0)
1271da177e4SLinus Torvalds #define profile_munmap(a) do { } while (0)
1281da177e4SLinus Torvalds 
1291da177e4SLinus Torvalds static inline int register_timer_hook(int (*hook)(struct pt_regs *))
1301da177e4SLinus Torvalds {
1311da177e4SLinus Torvalds 	return -ENOSYS;
1321da177e4SLinus Torvalds }
1331da177e4SLinus Torvalds 
1341da177e4SLinus Torvalds static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
1351da177e4SLinus Torvalds {
1361da177e4SLinus Torvalds 	return;
1371da177e4SLinus Torvalds }
1381da177e4SLinus Torvalds 
1391da177e4SLinus Torvalds #endif /* CONFIG_PROFILING */
1401da177e4SLinus Torvalds 
1411da177e4SLinus Torvalds #endif /* _LINUX_PROFILE_H */
142