opd_proc.h revision 8cfa702f803c5ef6a2b062a489a1b2cf66b45b5e
1/**
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 */
152