xref: /linux/include/linux/profile.h (revision 07031e14c1127fc7e1a5b98dfcc59f434e025104)
11da177e4SLinus Torvalds #ifndef _LINUX_PROFILE_H
21da177e4SLinus Torvalds #define _LINUX_PROFILE_H
31da177e4SLinus Torvalds 
41da177e4SLinus Torvalds #ifdef __KERNEL__
51da177e4SLinus Torvalds 
61da177e4SLinus Torvalds #include <linux/kernel.h>
71da177e4SLinus Torvalds #include <linux/init.h>
81da177e4SLinus Torvalds #include <linux/cpumask.h>
9ece8a684SIngo Molnar #include <linux/cache.h>
10ece8a684SIngo Molnar 
111da177e4SLinus Torvalds #include <asm/errno.h>
121da177e4SLinus Torvalds 
13ece8a684SIngo Molnar extern int prof_on __read_mostly;
14ece8a684SIngo Molnar 
151da177e4SLinus Torvalds #define CPU_PROFILING	1
161da177e4SLinus Torvalds #define SCHED_PROFILING	2
17ece8a684SIngo Molnar #define SLEEP_PROFILING	3
18*07031e14SIngo Molnar #define KVM_PROFILING	4
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds struct proc_dir_entry;
211da177e4SLinus Torvalds struct pt_regs;
22772a0dc5SAndrew Morton struct notifier_block;
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds /* init basic kernel profiler */
251da177e4SLinus Torvalds void __init profile_init(void);
267d12e780SDavid Howells void profile_tick(int);
27ece8a684SIngo Molnar 
28ece8a684SIngo Molnar /*
29ece8a684SIngo Molnar  * Add multiple profiler hits to a given address:
30ece8a684SIngo Molnar  */
31ece8a684SIngo Molnar void profile_hits(int, void *ip, unsigned int nr_hits);
32ece8a684SIngo Molnar 
33ece8a684SIngo Molnar /*
34ece8a684SIngo Molnar  * Single profiler hit:
35ece8a684SIngo Molnar  */
36ece8a684SIngo Molnar static inline void profile_hit(int type, void *ip)
37ece8a684SIngo Molnar {
38ece8a684SIngo Molnar 	/*
39ece8a684SIngo Molnar 	 * Speedup for the common (no profiling enabled) case:
40ece8a684SIngo Molnar 	 */
41ece8a684SIngo Molnar 	if (unlikely(prof_on == type))
42ece8a684SIngo Molnar 		profile_hits(type, ip, 1);
43ece8a684SIngo Molnar }
44ece8a684SIngo Molnar 
451da177e4SLinus Torvalds #ifdef CONFIG_PROC_FS
461da177e4SLinus Torvalds void create_prof_cpu_mask(struct proc_dir_entry *);
471da177e4SLinus Torvalds #else
481da177e4SLinus Torvalds #define create_prof_cpu_mask(x)			do { (void)(x); } while (0)
491da177e4SLinus Torvalds #endif
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds enum profile_type {
521da177e4SLinus Torvalds 	PROFILE_TASK_EXIT,
531da177e4SLinus Torvalds 	PROFILE_MUNMAP
541da177e4SLinus Torvalds };
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds #ifdef CONFIG_PROFILING
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds struct task_struct;
591da177e4SLinus Torvalds struct mm_struct;
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds /* task is in do_exit() */
621da177e4SLinus Torvalds void profile_task_exit(struct task_struct * task);
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds /* task is dead, free task struct ? Returns 1 if
651da177e4SLinus Torvalds  * the task was taken, 0 if the task should be freed.
661da177e4SLinus Torvalds  */
671da177e4SLinus Torvalds int profile_handoff_task(struct task_struct * task);
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds /* sys_munmap */
701da177e4SLinus Torvalds void profile_munmap(unsigned long addr);
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds int task_handoff_register(struct notifier_block * n);
731da177e4SLinus Torvalds int task_handoff_unregister(struct notifier_block * n);
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds int profile_event_register(enum profile_type, struct notifier_block * n);
761da177e4SLinus Torvalds int profile_event_unregister(enum profile_type, struct notifier_block * n);
771da177e4SLinus Torvalds 
781da177e4SLinus Torvalds int register_timer_hook(int (*hook)(struct pt_regs *));
791da177e4SLinus Torvalds void unregister_timer_hook(int (*hook)(struct pt_regs *));
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds /* Timer based profiling hook */
821da177e4SLinus Torvalds extern int (*timer_hook)(struct pt_regs *);
831da177e4SLinus Torvalds 
841da177e4SLinus Torvalds struct pt_regs;
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds #else
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds static inline int task_handoff_register(struct notifier_block * n)
891da177e4SLinus Torvalds {
901da177e4SLinus Torvalds 	return -ENOSYS;
911da177e4SLinus Torvalds }
921da177e4SLinus Torvalds 
931da177e4SLinus Torvalds static inline int task_handoff_unregister(struct notifier_block * n)
941da177e4SLinus Torvalds {
951da177e4SLinus Torvalds 	return -ENOSYS;
961da177e4SLinus Torvalds }
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
991da177e4SLinus Torvalds {
1001da177e4SLinus Torvalds 	return -ENOSYS;
1011da177e4SLinus Torvalds }
1021da177e4SLinus Torvalds 
1031da177e4SLinus Torvalds static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
1041da177e4SLinus Torvalds {
1051da177e4SLinus Torvalds 	return -ENOSYS;
1061da177e4SLinus Torvalds }
1071da177e4SLinus Torvalds 
1081da177e4SLinus Torvalds #define profile_task_exit(a) do { } while (0)
1091da177e4SLinus Torvalds #define profile_handoff_task(a) (0)
1101da177e4SLinus Torvalds #define profile_munmap(a) do { } while (0)
1111da177e4SLinus Torvalds 
1121da177e4SLinus Torvalds static inline int register_timer_hook(int (*hook)(struct pt_regs *))
1131da177e4SLinus Torvalds {
1141da177e4SLinus Torvalds 	return -ENOSYS;
1151da177e4SLinus Torvalds }
1161da177e4SLinus Torvalds 
1171da177e4SLinus Torvalds static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
1181da177e4SLinus Torvalds {
1191da177e4SLinus Torvalds 	return;
1201da177e4SLinus Torvalds }
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds #endif /* CONFIG_PROFILING */
1231da177e4SLinus Torvalds 
1241da177e4SLinus Torvalds #endif /* __KERNEL__ */
1251da177e4SLinus Torvalds 
1261da177e4SLinus Torvalds #endif /* _LINUX_PROFILE_H */
127