blob: 05c1cc736937fcc48d5df8781a6ad1b391f73807 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _LINUX_PROFILE_H
2#define _LINUX_PROFILE_H
3
Linus Torvalds1da177e2005-04-16 15:20:36 -07004#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#include <linux/init.h>
6#include <linux/cpumask.h>
Ingo Molnarece8a682006-12-06 20:37:24 -08007#include <linux/cache.h>
8
Linus Torvalds1da177e2005-04-16 15:20:36 -07009#include <asm/errno.h>
10
Ingo Molnarece8a682006-12-06 20:37:24 -080011extern int prof_on __read_mostly;
12
Linus Torvalds1da177e2005-04-16 15:20:36 -070013#define CPU_PROFILING 1
14#define SCHED_PROFILING 2
Ingo Molnarece8a682006-12-06 20:37:24 -080015#define SLEEP_PROFILING 3
Ingo Molnar07031e12007-01-10 23:15:38 -080016#define KVM_PROFILING 4
Linus Torvalds1da177e2005-04-16 15:20:36 -070017
18struct proc_dir_entry;
19struct pt_regs;
Andrew Morton772a0dc2006-03-23 03:00:55 -080020struct notifier_block;
Linus Torvalds1da177e2005-04-16 15:20:36 -070021
22/* init basic kernel profiler */
23void __init profile_init(void);
David Howells7d12e782006-10-05 14:55:46 +010024void profile_tick(int);
Ingo Molnarece8a682006-12-06 20:37:24 -080025
26/*
27 * Add multiple profiler hits to a given address:
28 */
29void profile_hits(int, void *ip, unsigned int nr_hits);
30
31/*
32 * Single profiler hit:
33 */
34static inline void profile_hit(int type, void *ip)
35{
36 /*
37 * Speedup for the common (no profiling enabled) case:
38 */
39 if (unlikely(prof_on == type))
40 profile_hits(type, ip, 1);
41}
42
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#ifdef CONFIG_PROC_FS
44void create_prof_cpu_mask(struct proc_dir_entry *);
45#else
46#define create_prof_cpu_mask(x) do { (void)(x); } while (0)
47#endif
48
49enum profile_type {
50 PROFILE_TASK_EXIT,
51 PROFILE_MUNMAP
52};
53
54#ifdef CONFIG_PROFILING
55
Linus Torvalds1da177e2005-04-16 15:20:36 -070056struct task_struct;
57struct mm_struct;
58
59/* task is in do_exit() */
60void profile_task_exit(struct task_struct * task);
61
62/* task is dead, free task struct ? Returns 1 if
63 * the task was taken, 0 if the task should be freed.
64 */
65int profile_handoff_task(struct task_struct * task);
66
67/* sys_munmap */
68void profile_munmap(unsigned long addr);
69
70int task_handoff_register(struct notifier_block * n);
71int task_handoff_unregister(struct notifier_block * n);
72
73int profile_event_register(enum profile_type, struct notifier_block * n);
74int profile_event_unregister(enum profile_type, struct notifier_block * n);
75
76int register_timer_hook(int (*hook)(struct pt_regs *));
77void unregister_timer_hook(int (*hook)(struct pt_regs *));
78
Linus Torvalds1da177e2005-04-16 15:20:36 -070079struct pt_regs;
80
81#else
82
83static inline int task_handoff_register(struct notifier_block * n)
84{
85 return -ENOSYS;
86}
87
88static inline int task_handoff_unregister(struct notifier_block * n)
89{
90 return -ENOSYS;
91}
92
93static inline int profile_event_register(enum profile_type t, struct notifier_block * n)
94{
95 return -ENOSYS;
96}
97
98static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
99{
100 return -ENOSYS;
101}
102
103#define profile_task_exit(a) do { } while (0)
104#define profile_handoff_task(a) (0)
105#define profile_munmap(a) do { } while (0)
106
107static inline int register_timer_hook(int (*hook)(struct pt_regs *))
108{
109 return -ENOSYS;
110}
111
112static inline void unregister_timer_hook(int (*hook)(struct pt_regs *))
113{
114 return;
115}
116
117#endif /* CONFIG_PROFILING */
118
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119#endif /* _LINUX_PROFILE_H */