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