View | Details | Raw Unified | Return to bug 157316 | Differences between
and this patch

Collapse All | Expand All

(-)devstat.9 (-70 / +71 lines)
Lines 27-49 Link Here
27
.\"
27
.\"
28
.\" $FreeBSD$
28
.\" $FreeBSD$
29
.\"
29
.\"
30
.Dd May 22, 1998
30
.Dd May 22, 2011
31
.Dt DEVSTAT 9
31
.Dt DEVSTAT 9
32
.Os
32
.Os
33
.Sh NAME
33
.Sh NAME
34
.Nm devstat ,
34
.Nm devstat ,
35
.Nm devstat_add_entry ,
36
.Nm devstat_end_transaction ,
35
.Nm devstat_end_transaction ,
37
.Nm devstat_end_transaction_bio ,
36
.Nm devstat_end_transaction_bio ,
37
.Nm devstat_new_entry ,
38
.Nm devstat_remove_entry ,
38
.Nm devstat_remove_entry ,
39
.Nm devstat_start_transaction
39
.Nm devstat_start_transaction ,
40
.Nm devstat_start_transaction_bio
40
.Nd kernel interface for keeping device statistics
41
.Nd kernel interface for keeping device statistics
41
.Sh SYNOPSIS
42
.Sh SYNOPSIS
42
.In sys/devicestat.h
43
.In sys/devicestat.h
43
.Ft void
44
.Ft "struct devstat *"
44
.Fo devstat_add_entry
45
.Fo devstat_new_entry
45
.Fa "struct devstat *ds"
46
.Fa "const void *dev_name"
46
.Fa "const char *dev_name"
47
.Fa "int unit_number"
47
.Fa "int unit_number"
48
.Fa "u_int32_t block_size"
48
.Fa "u_int32_t block_size"
49
.Fa "devstat_support_flags flags"
49
.Fa "devstat_support_flags flags"
Lines 53-65 Link Here
53
.Ft void
53
.Ft void
54
.Fn devstat_remove_entry "struct devstat *ds"
54
.Fn devstat_remove_entry "struct devstat *ds"
55
.Ft void
55
.Ft void
56
.Fn devstat_start_transaction "struct devstat *ds"
56
.Fn devstat_start_transaction "struct devstat *ds" "struct bintime *now"
57
.Ft void
57
.Ft void
58
.Fn devstat_start_transaction_bio "struct devstat *ds" "struct bio *bp"
59
.Ft void
58
.Fo devstat_end_transaction
60
.Fo devstat_end_transaction
59
.Fa "struct devstat *ds"
61
.Fa "struct devstat *ds"
60
.Fa "u_int32_t bytes"
62
.Fa "u_int32_t bytes"
61
.Fa "devstat_tag_type tag_type"
63
.Fa "devstat_tag_type tag_type"
62
.Fa "devstat_trans_flags flags"
64
.Fa "devstat_trans_flags flags"
65
.Fa "struct bintime *now"
66
.Fa "struct bintime *then"
63
.Fc
67
.Fc
64
.Ft void
68
.Ft void
65
.Fo devstat_end_transaction_bio
69
.Fo devstat_end_transaction_bio
Lines 77-95 Link Here
77
code.
81
code.
78
Instead, that is left for user programs to handle.
82
Instead, that is left for user programs to handle.
79
.Pp
83
.Pp
80
.Fn devstat_add_entry
84
.Fn devstat_new_entry
81
registers a device with the
85
registers a device with the
82
.Nm
86
.Nm
83
subsystem.
87
subsystem and returns a pointer to the allocated and initialized
84
The caller is expected to have already allocated \fBand zeroed\fR
88
.Va devstat
85
the devstat structure before calling this function.
89
structure.
86
.Fn devstat_add_entry
90
It takes several arguments:
87
takes several arguments:
88
.Bl -tag -width device_type
91
.Bl -tag -width device_type
89
.It ds
90
The
91
.Va devstat
92
structure, allocated and zeroed by the client.
93
.It dev_name
92
.It dev_name
94
The device name, e.g.\& da, cd, sa.
93
The device name, e.g.\& da, cd, sa.
95
.It unit_number
94
.It unit_number
Lines 127-133 Link Here
127
.Nm
126
.Nm
128
subsystem.
127
subsystem.
129
It takes the devstat structure for the device in question as
128
It takes the devstat structure for the device in question as
130
an argument.
129
an argument and frees used memory back to the system.
131
The
130
The
132
.Nm
131
.Nm
133
generation number is incremented and the number of devices is decremented.
132
generation number is incremented and the number of devices is decremented.
Lines 136-153 Link Here
136
registers the start of a transaction with the
135
registers the start of a transaction with the
137
.Nm
136
.Nm
138
subsystem.
137
subsystem.
139
The busy count is incremented with each transaction start.
138
The start count is incremented with each transaction start.
140
When a device goes from idle to busy, the system uptime is recorded in the
139
When a device goes from idle to busy, the system uptime is recorded in the
141
.Va start_time
140
.Va busy_from
142
field of the
141
field of the
143
.Va devstat
142
.Va devstat
144
structure.
143
structure.
144
The caller can override the time value by specifying a non-NULL
145
timestamp argument
146
.Va now
147
to the function.
145
.Pp
148
.Pp
146
.Fn devstat_end_transaction
149
.Fn devstat_end_transaction
147
registers the end of a transaction with the
150
registers the end of a transaction with the
148
.Nm
151
.Nm
149
subsystem.
152
subsystem.
150
It takes four arguments:
153
The end count is incremented with each transaction end.
154
It takes several arguments:
151
.Bl -tag -width tag_type
155
.Bl -tag -width tag_type
152
.It ds
156
.It ds
153
The
157
The
Lines 161-172 Link Here
161
.It flags
165
.It flags
162
Transaction flags indicating whether the transaction was a read, write, or
166
Transaction flags indicating whether the transaction was a read, write, or
163
whether no data was transferred.
167
whether no data was transferred.
168
.It now
169
The current timestamp.
170
.It then
171
The timestamp of when this transaction started.
164
.El
172
.El
165
.Pp
173
.Pp
174
.Fn devstat_start_transaction_bio
175
and
166
.Fn devstat_end_transaction_bio
176
.Fn devstat_end_transaction_bio
167
is a wrapper for
177
are wrappers for
178
.Fn devstat_start_transaction
179
and
168
.Fn devstat_end_transaction
180
.Fn devstat_end_transaction
169
which pulls all the information from a
181
respectively
182
which pull all the information from a
170
.Va "struct bio"
183
.Va "struct bio"
171
which is ready for biodone().
184
which is ready for biodone().
172
.Pp
185
.Pp
Lines 201-268 Link Here
201
.It unit_number
214
.It unit_number
202
The unit number identifies the particular instance of the peripheral driver
215
The unit number identifies the particular instance of the peripheral driver
203
in question.
216
in question.
204
.It bytes_written
217
.It bytes[flags]
205
This is the number of bytes that have been written to the device.
218
This is the number of bytes that have been written, read or freed/erased on
219
the device according to a transaction type specified in flags index.
220
See below for transaction types.
206
This number is currently an unsigned 64 bit integer.
221
This number is currently an unsigned 64 bit integer.
207
This will hopefully
222
This will hopefully
208
eliminate the counter wrap that would come very quickly on some systems if
223
eliminate the counter wrap that would come very quickly on some systems if
209
32 bit integers were used.
224
32 bit integers were used.
210
.It bytes_read
225
.It operations[flags]
211
This is the number of bytes that have been read from the device.
226
This is the number of read, write or free/erase operations on the device
212
.It bytes_freed
227
according to a transaction type specified in flags index.
213
This is the number of bytes that have been freed/erased on the device.
228
.It duration[[flags]
214
.It num_reads
229
The duration of read, write or free/erase operations on the device
215
This is the number of reads from the device.
230
according to a transaction type specified in flags index.
216
.It num_writes
231
.It start_count , end_count
217
This is the number of writes to the device.
232
This are numbers of started and completed transactions for the device,
218
.It num_frees
233
which are updated in the
219
This is the number of free/erase operations on the device.
220
.It num_other
221
This is the number of transactions to the device which are neither reads or
222
writes.
223
For instance,
224
.Tn SCSI
225
drivers often send a test unit ready command to
226
.Tn SCSI
227
devices.
228
The test unit ready command does not read or write any data.
229
It merely causes the device to return its status.
230
.It busy_count
231
This is the current number of outstanding transactions for the device.
232
This should never go below zero, and on an idle device it should be zero.
233
If either one of these conditions is not true, it indicates a problem in
234
the way
235
.Fn devstat_start_transaction
234
.Fn devstat_start_transaction
236
and
235
and
237
.Fn devstat_end_transaction
236
.Fn devstat_end_transaction
238
are being called in client code.
237
paths respectively.
239
There should be one and only one
238
On an idle device their values should be equal.
240
transaction start event and one transaction end event for each transaction.
241
.It block_size
239
.It block_size
242
This is the block size of the device, if the device has a block size.
240
This is the block size of the device, if the device has a block size.
243
.It tag_types
241
.It tag_types
244
This is an array of counters to record the number of various tag types that
242
This is an array of counters to record the number of various tag types that
245
are sent to a device.
243
are sent to a device.
246
See below for a list of tag types.
244
See below for a list of tag types.
247
.It dev_creation_time
245
.It creation_time
248
This is the time, as reported by
246
This is the time, as reported by
249
.Fn getmicrotime
247
.Fn binuptime
250
that the device was registered.
248
that the device was registered.
251
.It busy_time
249
.It busy_time
252
This is the amount of time that the device busy count has been greater than
250
This is the amount of time that the device was busy.
253
zero.
251
This is only updated during the ending of a transaction.
254
This is only updated when the busy count returns to zero.
252
.It busy_from
255
.It start_time
253
This is the system time, as reported by
256
This is the time, as reported by
254
.Xr binuptime
257
.Fn getmicrouptime
255
when starting a transaction of a device that goes from idle to busy.
258
that the device busy count went from zero to one.
259
.It last_comp_time
260
This is the time as reported by
261
.Fn getmicrouptime
262
that a transaction last completed.
263
It is used along with
264
.Va start_time
265
to calculate the device busy time.
266
.It flags
256
.It flags
267
These flags indicate which statistics measurements are supported by a
257
These flags indicate which statistics measurements are supported by a
268
particular device.
258
particular device.
Lines 378-385 Link Here
378
	DEVSTAT_WRITE	= 0x02,
368
	DEVSTAT_WRITE	= 0x02,
379
	DEVSTAT_FREE	= 0x03
369
	DEVSTAT_FREE	= 0x03
380
} devstat_trans_flags;
370
} devstat_trans_flags;
371
#define	DEVSTAT_N_TRANS_FLAGS	4
381
.Ed
372
.Ed
382
.Pp
373
.Pp
374
DEVSTAT_NO_DATA is a type of transactions to the device which are neither
375
reads or writes.
376
For instance,
377
.Tn SCSI
378
drivers often send a test unit ready command to
379
.Tn SCSI
380
devices.
381
The test unit ready command does not read or write any data.
382
It merely causes the device to return its status.
383
.Pp
383
There are four possible values for the
384
There are four possible values for the
384
.Va tag_type
385
.Va tag_type
385
argument to
386
argument to

Return to bug 157316