blob: 8140a46026620bdfeacb15d8ad2e952bdcd8ce53 [file] [log] [blame]
Mike Dodd8cfa7022010-11-17 11:12:26 -08001/**
2 * @file opd_proc.h
3 * Management of processes
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#ifndef OPD_PROC_H
13#define OPD_PROC_H
14
15#include "op_types.h"
16#include "op_list.h"
17
18struct opd_map;
19struct opd_image;
20struct op_note;
21struct op_sample;
22
23/**
24 * track process, created either by a fork or an exec notification.
25 */
26struct opd_proc {
27 /** maps are always added to the end of head, so search will be done
28 * from the newest map to the oldest which mean we don't care about
29 * munmap. First added map must be the primary image */
30 struct list_head maps;
31 /** process name */
32 char const * name;
33 /** thread id for this process, always equal to tgid for 2.2 kernel */
34 pid_t tid;
35 /** thread group id for this process */
36 pid_t tgid;
37 /** non-zero if this process receive any samples, this field
38 * is used with dead field to defer opd_proc deletion */
39 int accessed;
40 /** Set to non-zero when an exit notification occur for this process */
41 int dead;
42 /** used by container of opd_proc */
43 struct list_head next;
44};
45
46/**
47 * initialize opd_proc container
48 */
49void opd_init_procs(void);
50
51/**
52 * opd_put_sample - process a sample
53 * @param sample sample to process
54 *
55 * Write out the sample to the appropriate sample file. This
56 * routine handles kernel and module samples as well as ordinary ones.
57 */
58void opd_put_sample(struct op_sample const * sample);
59
60/**
61 * opd_put_image_sample - write sample to file
62 * @param image image for sample
63 * @param offset (file) offset to write to
64 * @param counter counter number
65 *
66 * Add to the count stored at position offset in the
67 * image file. Overflow pins the count at the maximum
68 * value.
69 */
70void opd_put_image_sample(struct opd_image * image, unsigned long offset, u32 counter);
71
72/**
73 * opd_handle_fork - deal with fork notification
74 * @param note note to handle
75 *
76 * Deal with a fork() notification by creating a new process
77 * structure, and copying mapping information from the old process.
78 *
79 * sample->pid contains the process id of the old process.
80 * sample->eip contains the process id of the new process.
81 */
82void opd_handle_fork(struct op_note const * note);
83
84/**
85 * opd_handle_exec - deal with notification of execve()
86 * @param tid tid for this process
87 * @param tgid tgid for this process
88 *
89 * Drop all mapping information for the process.
90 */
91void opd_handle_exec(pid_t tid, pid_t tgid);
92
93/**
94 * opd_handle_exit - deal with exit notification
95 * @param note note to handle
96 *
97 * Deal with an exit() notification by setting the flag "dead"
98 * on a process. These will be later cleaned up by the %SIGALRM
99 * handler.
100 *
101 * sample->pid contains the process id of the exited process.
102 */
103void opd_handle_exit(struct op_note const * note);
104
105/**
106 * opd_get_proc - get process from process list
107 * @param tid tid for this process
108 * @param tgid tgid for this process
109 *
110 * A process with pid tid is searched on the process list,
111 * maintaining LRU order. If it is not found, %NULL is returned,
112 * otherwise the process structure is returned.
113 */
114struct opd_proc * opd_get_proc(pid_t tid, pid_t tgid);
115
116/**
117 * opd_new_proc - create a new process structure
118 * @param tid tid for this process
119 * @param tgid tgid for this process
120 *
121 * Allocate and initialise a process structure and insert
122 * it into the procs hash table.
123 */
124struct opd_proc * opd_new_proc(pid_t tid, pid_t tgid);
125
126/**
127 * opd_get_nr_procs - return number of processes tracked
128 */
129int opd_get_nr_procs(void);
130
131/**
132 * opd_age_procs - age all dead process preparing them for a deletion
133 */
134void opd_age_procs(void);
135
136/**
137 * freeze all resource used by opd_procs managment
138 */
139void opd_proc_cleanup(void);
140
141/**
142 * opd_clear_kernel_mapping - remove all kernel mapping for all opd_proc
143 *
144 * invalidate (by removing them) all kernel mapping. This function do nothing
145 * when separate_kernel == 0 because we don't add mapping for kernel
146 * sample in proc struct. As side effect decrease reference count of
147 * associated with these mapping which eventually close this image
148 */
149void opd_clear_kernel_mapping(void);
150
151#endif /* OPD_PROC_H */