Blame view

include/linux/acct.h 5.75 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*
   *  BSD Process Accounting for Linux - Definitions
   *
   *  Author: Marco van Wieringen (mvw@planets.elm.net)
   *
   *  This header file contains the definitions needed to implement
   *  BSD-style process accounting. The kernel accounting code and all
   *  user-level programs that try to do something useful with the
   *  process accounting log must include this file.
   *
   *  Copyright (C) 1995 - 1997 Marco van Wieringen - ELM Consultancy B.V.
   *
   */
  
  #ifndef _LINUX_ACCT_H
  #define _LINUX_ACCT_H
  
  #include <linux/types.h>
ff6ed4063   Andrew Morton   [PATCH] acct.h ne...
19

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  #include <asm/param.h>
  #include <asm/byteorder.h>
  
  /* 
   *  comp_t is a 16-bit "floating" point number with a 3-bit base 8
   *  exponent and a 13-bit fraction.
   *  comp2_t is 24-bit with 5-bit base 2 exponent and 20 bit fraction
   *  (leading 1 not stored).
   *  See linux/kernel/acct.c for the specific encoding systems used.
   */
  
  typedef __u16	comp_t;
  typedef __u32	comp2_t;
  
  /*
   *   accounting file record
   *
   *   This structure contains all of the information written out to the
   *   process accounting file whenever a process exits.
   */
  
  #define ACCT_COMM	16
  
  struct acct
  {
  	char		ac_flag;		/* Flags */
  	char		ac_version;		/* Always set to ACCT_VERSION */
  	/* for binary compatibility back until 2.0 */
  	__u16		ac_uid16;		/* LSB of Real User ID */
  	__u16		ac_gid16;		/* LSB of Real Group ID */
  	__u16		ac_tty;			/* Control Terminal */
  	__u32		ac_btime;		/* Process Creation Time */
  	comp_t		ac_utime;		/* User Time */
  	comp_t		ac_stime;		/* System Time */
  	comp_t		ac_etime;		/* Elapsed Time */
  	comp_t		ac_mem;			/* Average Memory Usage */
  	comp_t		ac_io;			/* Chars Transferred */
  	comp_t		ac_rw;			/* Blocks Read or Written */
  	comp_t		ac_minflt;		/* Minor Pagefaults */
  	comp_t		ac_majflt;		/* Major Pagefaults */
  	comp_t		ac_swaps;		/* Number of Swaps */
  /* m68k had no padding here. */
  #if !defined(CONFIG_M68K) || !defined(__KERNEL__)
  	__u16		ac_ahz;			/* AHZ */
  #endif
  	__u32		ac_exitcode;		/* Exitcode */
  	char		ac_comm[ACCT_COMM + 1];	/* Command Name */
  	__u8		ac_etime_hi;		/* Elapsed Time MSB */
  	__u16		ac_etime_lo;		/* Elapsed Time LSB */
  	__u32		ac_uid;			/* Real User ID */
  	__u32		ac_gid;			/* Real Group ID */
  };
  
  struct acct_v3
  {
  	char		ac_flag;		/* Flags */
  	char		ac_version;		/* Always set to ACCT_VERSION */
  	__u16		ac_tty;			/* Control Terminal */
  	__u32		ac_exitcode;		/* Exitcode */
  	__u32		ac_uid;			/* Real User ID */
  	__u32		ac_gid;			/* Real Group ID */
  	__u32		ac_pid;			/* Process ID */
  	__u32		ac_ppid;		/* Parent Process ID */
  	__u32		ac_btime;		/* Process Creation Time */
  #ifdef __KERNEL__
  	__u32		ac_etime;		/* Elapsed Time */
  #else
  	float		ac_etime;		/* Elapsed Time */
  #endif
  	comp_t		ac_utime;		/* User Time */
  	comp_t		ac_stime;		/* System Time */
  	comp_t		ac_mem;			/* Average Memory Usage */
  	comp_t		ac_io;			/* Chars Transferred */
  	comp_t		ac_rw;			/* Blocks Read or Written */
  	comp_t		ac_minflt;		/* Minor Pagefaults */
  	comp_t		ac_majflt;		/* Major Pagefaults */
  	comp_t		ac_swaps;		/* Number of Swaps */
  	char		ac_comm[ACCT_COMM];	/* Command Name */
  };
  
  /*
   *  accounting flags
   */
  				/* bit set when the process ... */
  #define AFORK		0x01	/* ... executed fork, but did not exec */
  #define ASU		0x02	/* ... used super-user privileges */
  #define ACOMPAT		0x04	/* ... used compatibility mode (VAX only not used) */
  #define ACORE		0x08	/* ... dumped core */
  #define AXSIG		0x10	/* ... was killed by a signal */
  
  #ifdef __BIG_ENDIAN
  #define ACCT_BYTEORDER	0x80	/* accounting file is big endian */
  #else
  #define ACCT_BYTEORDER	0x00	/* accounting file is little endian */
  #endif
  
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
  
  #ifdef CONFIG_BSD_PROCESS_ACCT
7b7b1ace2   Al Viro   [PATCH] saner han...
119
  struct vfsmount;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
  struct super_block;
f6a570333   Al Viro   [PATCH] severing ...
121
  struct pacct_struct;
0b6b030fc   Pavel Emelyanov   bsdacct: switch f...
122
  struct pid_namespace;
c55b7c3e8   Dave Young   sysctl extern cle...
123
  extern int acct_parm[]; /* for sysctl */
7b7b1ace2   Al Viro   [PATCH] saner han...
124
  extern void acct_auto_close_mnt(struct vfsmount *m);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
  extern void acct_auto_close(struct super_block *sb);
f6ec29a42   KaiGai Kohei   [PATCH] pacct: av...
126
127
  extern void acct_collect(long exitcode, int group_dead);
  extern void acct_process(void);
0b6b030fc   Pavel Emelyanov   bsdacct: switch f...
128
  extern void acct_exit_ns(struct pid_namespace *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  #else
7b7b1ace2   Al Viro   [PATCH] saner han...
130
  #define acct_auto_close_mnt(x)	do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
  #define acct_auto_close(x)	do { } while (0)
f6ec29a42   KaiGai Kohei   [PATCH] pacct: av...
132
133
  #define acct_collect(x,y)	do { } while (0)
  #define acct_process()		do { } while (0)
0b6b030fc   Pavel Emelyanov   bsdacct: switch f...
134
  #define acct_exit_ns(ns)	do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
  #endif
  
  /*
   * ACCT_VERSION numbers as yet defined:
   * 0: old format (until 2.6.7) with 16 bit uid/gid
   * 1: extended variant (binary compatible on M68K)
   * 2: extended variant (binary compatible on everything except M68K)
   * 3: new binary incompatible format (64 bytes)
   * 4: new binary incompatible format (128 bytes)
   * 5: new binary incompatible format (128 bytes, second half)
   *
   */
  
  #ifdef CONFIG_BSD_PROCESS_ACCT_V3
  #define ACCT_VERSION	3
  #define AHZ		100
  typedef struct acct_v3 acct_t;
  #else
  #ifdef CONFIG_M68K
  #define ACCT_VERSION	1
  #else
  #define ACCT_VERSION	2
  #endif
  #define AHZ		(USER_HZ)
  typedef struct acct acct_t;
  #endif
  
  #else
  #define ACCT_VERSION	2
  #define AHZ		(HZ)
  #endif	/* __KERNEL */
  
  #ifdef __KERNEL__
a1ff0eafc   David Woodhouse   Include <linux/ji...
168
  #include <linux/jiffies.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
170
  /*
   * Yet another set of HZ to *HZ helper functions.
e26148d93   Tim Schmielau   [PATCH] Fix copy-...
171
   * See <linux/jiffies.h> for the original.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
173
174
175
176
   */
  
  static inline u32 jiffies_to_AHZ(unsigned long x)
  {
  #if (TICK_NSEC % (NSEC_PER_SEC / AHZ)) == 0
6ffc787a4   David Fries   system timer: fix...
177
178
179
  # if HZ < AHZ
  	return x * (AHZ / HZ);
  # else
e26148d93   Tim Schmielau   [PATCH] Fix copy-...
180
  	return x / (HZ / AHZ);
6ffc787a4   David Fries   system timer: fix...
181
  # endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  #else
          u64 tmp = (u64)x * TICK_NSEC;
          do_div(tmp, (NSEC_PER_SEC / AHZ));
          return (long)tmp;
  #endif
  }
  
  static inline u64 nsec_to_AHZ(u64 x)
  {
  #if (NSEC_PER_SEC % AHZ) == 0
  	do_div(x, (NSEC_PER_SEC / AHZ));
  #elif (AHZ % 512) == 0
  	x *= AHZ/512;
  	do_div(x, (NSEC_PER_SEC / 512));
  #else
  	/*
           * max relative error 5.7e-8 (1.8s per year) for AHZ <= 1024,
           * overflow after 64.99 years.
           * exact for AHZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
           */
  	x *= 9;
  	do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (AHZ/2))
  	                          / AHZ));
  #endif
  	return x;
  }
  
  #endif  /* __KERNEL */
  
  #endif	/* _LINUX_ACCT_H */