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