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