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 18 struct opd_map; 19 struct opd_image; 20 struct op_note; 21 struct op_sample; 22 23 /** 24 * track process, created either by a fork or an exec notification. 25 */ 26 struct 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 */ 49 void 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 */ 58 void 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 */ 70 void 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 */ 82 void 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 */ 91 void 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 */ 103 void 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 */ 114 struct 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 */ 124 struct opd_proc * opd_new_proc(pid_t tid, pid_t tgid); 125 126 /** 127 * opd_get_nr_procs - return number of processes tracked 128 */ 129 int opd_get_nr_procs(void); 130 131 /** 132 * opd_age_procs - age all dead process preparing them for a deletion 133 */ 134 void opd_age_procs(void); 135 136 /** 137 * freeze all resource used by opd_procs managment 138 */ 139 void 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 */ 149 void opd_clear_kernel_mapping(void); 150 151 #endif /* OPD_PROC_H */ 152