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