xref: /linux/include/linux/profile.h (revision d3091298570006fa538ec9beacbfb1098964962e)
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 
20b03f6489SAdrian Bunk #if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS)
21fbd387aeSAl Viro void create_prof_cpu_mask(void);
2266f50ee3SPaul Mundt int create_proc_profile(void);
23b03f6489SAdrian Bunk #else
24fbd387aeSAl Viro static inline void create_prof_cpu_mask(void)
25cebbd3fbSAndrew Morton {
26cebbd3fbSAndrew Morton }
2766f50ee3SPaul Mundt 
2866f50ee3SPaul Mundt static inline int create_proc_profile(void)
2966f50ee3SPaul Mundt {
3066f50ee3SPaul Mundt 	return 0;
3166f50ee3SPaul Mundt }
32b03f6489SAdrian Bunk #endif
33b03f6489SAdrian Bunk 
34b03f6489SAdrian Bunk enum profile_type {
35b03f6489SAdrian Bunk 	PROFILE_TASK_EXIT,
36b03f6489SAdrian Bunk 	PROFILE_MUNMAP
37b03f6489SAdrian Bunk };
38b03f6489SAdrian Bunk 
39b03f6489SAdrian Bunk #ifdef CONFIG_PROFILING
40b03f6489SAdrian Bunk 
41b03f6489SAdrian Bunk extern int prof_on __read_mostly;
42b03f6489SAdrian Bunk 
431da177e4SLinus Torvalds /* init basic kernel profiler */
4422b8ce94SDave Hansen int profile_init(void);
4522b8ce94SDave Hansen int profile_setup(char *str);
46b03f6489SAdrian Bunk void profile_tick(int type);
47*d3091298SSam Ravnborg int setup_profiling_timer(unsigned int multiplier);
48ece8a684SIngo Molnar 
49ece8a684SIngo Molnar /*
50ece8a684SIngo Molnar  * Add multiple profiler hits to a given address:
51ece8a684SIngo Molnar  */
52b03f6489SAdrian Bunk void profile_hits(int type, void *ip, unsigned int nr_hits);
53ece8a684SIngo Molnar 
54ece8a684SIngo Molnar /*
55ece8a684SIngo Molnar  * Single profiler hit:
56ece8a684SIngo Molnar  */
57ece8a684SIngo Molnar static inline void profile_hit(int type, void *ip)
58ece8a684SIngo Molnar {
59ece8a684SIngo Molnar 	/*
60ece8a684SIngo Molnar 	 * Speedup for the common (no profiling enabled) case:
61ece8a684SIngo Molnar 	 */
62ece8a684SIngo Molnar 	if (unlikely(prof_on == type))
63ece8a684SIngo Molnar 		profile_hits(type, ip, 1);
64ece8a684SIngo Molnar }
65ece8a684SIngo Molnar 
661da177e4SLinus Torvalds struct task_struct;
671da177e4SLinus Torvalds struct mm_struct;
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds /* task is in do_exit() */
701da177e4SLinus Torvalds void profile_task_exit(struct task_struct * task);
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds /* task is dead, free task struct ? Returns 1 if
731da177e4SLinus Torvalds  * the task was taken, 0 if the task should be freed.
741da177e4SLinus Torvalds  */
751da177e4SLinus Torvalds int profile_handoff_task(struct task_struct * task);
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds /* sys_munmap */
781da177e4SLinus Torvalds void profile_munmap(unsigned long addr);
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds int task_handoff_register(struct notifier_block * n);
811da177e4SLinus Torvalds int task_handoff_unregister(struct notifier_block * n);
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds int profile_event_register(enum profile_type, struct notifier_block * n);
841da177e4SLinus Torvalds int profile_event_unregister(enum profile_type, struct notifier_block * n);
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds struct pt_regs;
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds #else
891da177e4SLinus Torvalds 
90b03f6489SAdrian Bunk #define prof_on 0
91b03f6489SAdrian Bunk 
9222b8ce94SDave Hansen static inline int profile_init(void)
93b03f6489SAdrian Bunk {
9422b8ce94SDave Hansen 	return 0;
95b03f6489SAdrian Bunk }
96b03f6489SAdrian Bunk 
97b03f6489SAdrian Bunk static inline void profile_tick(int type)
98b03f6489SAdrian Bunk {
99b03f6489SAdrian Bunk 	return;
100b03f6489SAdrian Bunk }
101b03f6489SAdrian Bunk 
102b03f6489SAdrian Bunk static inline void profile_hits(int type, void *ip, unsigned int nr_hits)
103b03f6489SAdrian Bunk {
104b03f6489SAdrian Bunk 	return;
105b03f6489SAdrian Bunk }
106b03f6489SAdrian Bunk 
107b03f6489SAdrian Bunk static inline void profile_hit(int type, void *ip)
108b03f6489SAdrian Bunk {
109b03f6489SAdrian Bunk 	return;
110b03f6489SAdrian Bunk }
111b03f6489SAdrian Bunk 
1121da177e4SLinus Torvalds static inline int task_handoff_register(struct notifier_block * n)
1131da177e4SLinus Torvalds {
1141da177e4SLinus Torvalds 	return -ENOSYS;
1151da177e4SLinus Torvalds }
1161da177e4SLinus Torvalds 
1171da177e4SLinus Torvalds static inline int task_handoff_unregister(struct notifier_block * n)
1181da177e4SLinus Torvalds {
1191da177e4SLinus Torvalds 	return -ENOSYS;
1201da177e4SLinus Torvalds }
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
1231da177e4SLinus Torvalds {
1241da177e4SLinus Torvalds 	return -ENOSYS;
1251da177e4SLinus Torvalds }
1261da177e4SLinus Torvalds 
1271da177e4SLinus Torvalds static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
1281da177e4SLinus Torvalds {
1291da177e4SLinus Torvalds 	return -ENOSYS;
1301da177e4SLinus Torvalds }
1311da177e4SLinus Torvalds 
1321da177e4SLinus Torvalds #define profile_task_exit(a) do { } while (0)
1331da177e4SLinus Torvalds #define profile_handoff_task(a) (0)
1341da177e4SLinus Torvalds #define profile_munmap(a) do { } while (0)
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds #endif /* CONFIG_PROFILING */
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds #endif /* _LINUX_PROFILE_H */
139