aboutsummaryrefslogtreecommitdiff
path: root/include/linux/acct.h
blob: 25ee95de0c97ffcfefa713ea5ee8faa6c4a81468 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
 *  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>

#include <asm/param.h>
#include <asm/byteorder.h>


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;		
	char		ac_version;		
	
	__u16		ac_uid16;		
	__u16		ac_gid16;		
	__u16		ac_tty;			
	__u32		ac_btime;		
	comp_t		ac_utime;		
	comp_t		ac_stime;		
	comp_t		ac_etime;		
	comp_t		ac_mem;			
	comp_t		ac_io;			
	comp_t		ac_rw;			/* Blocks Read or Written */
	comp_t		ac_minflt;		
	comp_t		ac_majflt;		
	comp_t		ac_swaps;		
#if !defined(CONFIG_M68K) || !defined(__KERNEL__)
	__u16		ac_ahz;			
#endif
	__u32		ac_exitcode;		
	char		ac_comm[ACCT_COMM + 1];	
	__u8		ac_etime_hi;		
	__u16		ac_etime_lo;		
	__u32		ac_uid;			
	__u32		ac_gid;			
};

struct acct_v3
{
	char		ac_flag;		
	char		ac_version;		
	__u16		ac_tty;			
	__u32		ac_exitcode;		
	__u32		ac_uid;			
	__u32		ac_gid;			
	__u32		ac_pid;			
	__u32		ac_ppid;		
	__u32		ac_btime;		
#ifdef __KERNEL__
	__u32		ac_etime;		
#else
	float		ac_etime;		
#endif
	comp_t		ac_utime;		
	comp_t		ac_stime;		
	comp_t		ac_mem;			
	comp_t		ac_io;			
	comp_t		ac_rw;			/* Blocks Read or Written */
	comp_t		ac_minflt;		
	comp_t		ac_majflt;		
	comp_t		ac_swaps;		
	char		ac_comm[ACCT_COMM];	
};

				
#define AFORK		0x01	
#define ASU		0x02	
#define ACOMPAT		0x04	
#define ACORE		0x08	
#define AXSIG		0x10	

#ifdef __BIG_ENDIAN
#define ACCT_BYTEORDER	0x80	
#else
#define ACCT_BYTEORDER	0x00	
#endif

#ifdef __KERNEL__


#ifdef CONFIG_BSD_PROCESS_ACCT
struct vfsmount;
struct super_block;
struct pacct_struct;
struct pid_namespace;
extern int acct_parm[]; 
extern void acct_auto_close_mnt(struct vfsmount *m);
extern void acct_auto_close(struct super_block *sb);
extern void acct_collect(long exitcode, int group_dead);
extern void acct_process(void);
extern void acct_exit_ns(struct pid_namespace *);
#else
#define acct_auto_close_mnt(x)	do { } while (0)
#define acct_auto_close(x)	do { } while (0)
#define acct_collect(x,y)	do { } while (0)
#define acct_process()		do { } while (0)
#define acct_exit_ns(ns)	do { } while (0)
#endif


#undef ACCT_VERSION
#undef AHZ

#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	

#ifdef __KERNEL__
#include <linux/jiffies.h>

static inline u32 jiffies_to_AHZ(unsigned long x)
{
#if (TICK_NSEC % (NSEC_PER_SEC / AHZ)) == 0
# if HZ < AHZ
	return x * (AHZ / HZ);
# else
	return x / (HZ / AHZ);
# endif
#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
	x *= 9;
	do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (AHZ/2))
	                          / AHZ));
#endif
	return x;
}

#endif  

#endif