1 #ifndef _LINUX_PROFILE_H 2 #define _LINUX_PROFILE_H 3 4 #include <linux/kernel.h> 5 #include <linux/init.h> 6 #include <linux/cpumask.h> 7 #include <linux/cache.h> 8 9 #include <asm/errno.h> 10 11 #define CPU_PROFILING 1 12 #define SCHED_PROFILING 2 13 #define SLEEP_PROFILING 3 14 #define KVM_PROFILING 4 15 16 struct proc_dir_entry; 17 struct pt_regs; 18 struct notifier_block; 19 20 #if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS) 21 void create_prof_cpu_mask(struct proc_dir_entry *de); 22 #else 23 static inline void create_prof_cpu_mask(struct proc_dir_entry *de) 24 { 25 } 26 #endif 27 28 enum profile_type { 29 PROFILE_TASK_EXIT, 30 PROFILE_MUNMAP 31 }; 32 33 #ifdef CONFIG_PROFILING 34 35 extern int prof_on __read_mostly; 36 37 /* init basic kernel profiler */ 38 void __init profile_init(void); 39 void profile_tick(int type); 40 41 /* 42 * Add multiple profiler hits to a given address: 43 */ 44 void profile_hits(int type, void *ip, unsigned int nr_hits); 45 46 /* 47 * Single profiler hit: 48 */ 49 static inline void profile_hit(int type, void *ip) 50 { 51 /* 52 * Speedup for the common (no profiling enabled) case: 53 */ 54 if (unlikely(prof_on == type)) 55 profile_hits(type, ip, 1); 56 } 57 58 struct task_struct; 59 struct mm_struct; 60 61 /* task is in do_exit() */ 62 void 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 */ 67 int profile_handoff_task(struct task_struct * task); 68 69 /* sys_munmap */ 70 void profile_munmap(unsigned long addr); 71 72 int task_handoff_register(struct notifier_block * n); 73 int task_handoff_unregister(struct notifier_block * n); 74 75 int profile_event_register(enum profile_type, struct notifier_block * n); 76 int profile_event_unregister(enum profile_type, struct notifier_block * n); 77 78 int register_timer_hook(int (*hook)(struct pt_regs *)); 79 void unregister_timer_hook(int (*hook)(struct pt_regs *)); 80 81 struct pt_regs; 82 83 #else 84 85 #define prof_on 0 86 87 static inline void profile_init(void) 88 { 89 return; 90 } 91 92 static inline void profile_tick(int type) 93 { 94 return; 95 } 96 97 static inline void profile_hits(int type, void *ip, unsigned int nr_hits) 98 { 99 return; 100 } 101 102 static inline void profile_hit(int type, void *ip) 103 { 104 return; 105 } 106 107 static inline int task_handoff_register(struct notifier_block * n) 108 { 109 return -ENOSYS; 110 } 111 112 static inline int task_handoff_unregister(struct notifier_block * n) 113 { 114 return -ENOSYS; 115 } 116 117 static inline int profile_event_register(enum profile_type t, struct notifier_block * n) 118 { 119 return -ENOSYS; 120 } 121 122 static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n) 123 { 124 return -ENOSYS; 125 } 126 127 #define profile_task_exit(a) do { } while (0) 128 #define profile_handoff_task(a) (0) 129 #define profile_munmap(a) do { } while (0) 130 131 static inline int register_timer_hook(int (*hook)(struct pt_regs *)) 132 { 133 return -ENOSYS; 134 } 135 136 static inline void unregister_timer_hook(int (*hook)(struct pt_regs *)) 137 { 138 return; 139 } 140 141 #endif /* CONFIG_PROFILING */ 142 143 #endif /* _LINUX_PROFILE_H */ 144