xref: /linux/include/linux/profile.h (revision 772a0dc5d2103baff2f15c2668930bcd37add777)
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/config.h>
81da177e4SLinus Torvalds #include <linux/init.h>
91da177e4SLinus Torvalds #include <linux/cpumask.h>
101da177e4SLinus Torvalds #include <asm/errno.h>
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds #define CPU_PROFILING	1
131da177e4SLinus Torvalds #define SCHED_PROFILING	2
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds struct proc_dir_entry;
161da177e4SLinus Torvalds struct pt_regs;
17*772a0dc5SAndrew Morton struct notifier_block;
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds /* init basic kernel profiler */
201da177e4SLinus Torvalds void __init profile_init(void);
211da177e4SLinus Torvalds void profile_tick(int, struct pt_regs *);
221da177e4SLinus Torvalds void profile_hit(int, void *);
231da177e4SLinus Torvalds #ifdef CONFIG_PROC_FS
241da177e4SLinus Torvalds void create_prof_cpu_mask(struct proc_dir_entry *);
251da177e4SLinus Torvalds #else
261da177e4SLinus Torvalds #define create_prof_cpu_mask(x)			do { (void)(x); } while (0)
271da177e4SLinus Torvalds #endif
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds enum profile_type {
301da177e4SLinus Torvalds 	PROFILE_TASK_EXIT,
311da177e4SLinus Torvalds 	PROFILE_MUNMAP
321da177e4SLinus Torvalds };
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds #ifdef CONFIG_PROFILING
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds struct task_struct;
371da177e4SLinus Torvalds struct mm_struct;
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds /* task is in do_exit() */
401da177e4SLinus Torvalds void profile_task_exit(struct task_struct * task);
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds /* task is dead, free task struct ? Returns 1 if
431da177e4SLinus Torvalds  * the task was taken, 0 if the task should be freed.
441da177e4SLinus Torvalds  */
451da177e4SLinus Torvalds int profile_handoff_task(struct task_struct * task);
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds /* sys_munmap */
481da177e4SLinus Torvalds void profile_munmap(unsigned long addr);
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds int task_handoff_register(struct notifier_block * n);
511da177e4SLinus Torvalds int task_handoff_unregister(struct notifier_block * n);
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds int profile_event_register(enum profile_type, struct notifier_block * n);
541da177e4SLinus Torvalds int profile_event_unregister(enum profile_type, struct notifier_block * n);
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds int register_timer_hook(int (*hook)(struct pt_regs *));
571da177e4SLinus Torvalds void unregister_timer_hook(int (*hook)(struct pt_regs *));
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds /* Timer based profiling hook */
601da177e4SLinus Torvalds extern int (*timer_hook)(struct pt_regs *);
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds struct pt_regs;
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds #else
651da177e4SLinus Torvalds 
661da177e4SLinus Torvalds static inline int task_handoff_register(struct notifier_block * n)
671da177e4SLinus Torvalds {
681da177e4SLinus Torvalds 	return -ENOSYS;
691da177e4SLinus Torvalds }
701da177e4SLinus Torvalds 
711da177e4SLinus Torvalds static inline int task_handoff_unregister(struct notifier_block * n)
721da177e4SLinus Torvalds {
731da177e4SLinus Torvalds 	return -ENOSYS;
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds 
761da177e4SLinus Torvalds static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
771da177e4SLinus Torvalds {
781da177e4SLinus Torvalds 	return -ENOSYS;
791da177e4SLinus Torvalds }
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
821da177e4SLinus Torvalds {
831da177e4SLinus Torvalds 	return -ENOSYS;
841da177e4SLinus Torvalds }
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds #define profile_task_exit(a) do { } while (0)
871da177e4SLinus Torvalds #define profile_handoff_task(a) (0)
881da177e4SLinus Torvalds #define profile_munmap(a) do { } while (0)
891da177e4SLinus Torvalds 
901da177e4SLinus Torvalds static inline int register_timer_hook(int (*hook)(struct pt_regs *))
911da177e4SLinus Torvalds {
921da177e4SLinus Torvalds 	return -ENOSYS;
931da177e4SLinus Torvalds }
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
961da177e4SLinus Torvalds {
971da177e4SLinus Torvalds 	return;
981da177e4SLinus Torvalds }
991da177e4SLinus Torvalds 
1001da177e4SLinus Torvalds #endif /* CONFIG_PROFILING */
1011da177e4SLinus Torvalds 
1021da177e4SLinus Torvalds #endif /* __KERNEL__ */
1031da177e4SLinus Torvalds 
1041da177e4SLinus Torvalds #endif /* _LINUX_PROFILE_H */
105