|
Lines 40-49
Link Here
|
| 40 |
.Nd kernel interface for keeping device statistics |
40 |
.Nd kernel interface for keeping device statistics |
| 41 |
.Sh SYNOPSIS |
41 |
.Sh SYNOPSIS |
| 42 |
.In sys/devicestat.h |
42 |
.In sys/devicestat.h |
| 43 |
.Ft void |
43 |
.Ft struct devstat * |
| 44 |
.Fo devstat_add_entry |
44 |
.Fo devstat_new_entry |
| 45 |
.Fa "struct devstat *ds" |
45 |
.Fa "const void *dev_name" |
| 46 |
.Fa "const char *dev_name" |
|
|
| 47 |
.Fa "int unit_number" |
46 |
.Fa "int unit_number" |
| 48 |
.Fa "u_int32_t block_size" |
47 |
.Fa "u_int32_t block_size" |
| 49 |
.Fa "devstat_support_flags flags" |
48 |
.Fa "devstat_support_flags flags" |
|
Lines 53-65
Link Here
|
| 53 |
.Ft void |
52 |
.Ft void |
| 54 |
.Fn devstat_remove_entry "struct devstat *ds" |
53 |
.Fn devstat_remove_entry "struct devstat *ds" |
| 55 |
.Ft void |
54 |
.Ft void |
| 56 |
.Fn devstat_start_transaction "struct devstat *ds" |
55 |
.Fo devstat_start_transaction |
|
|
56 |
.Fa "struct devstat *ds" |
| 57 |
.Fa "struct bintime *now" |
| 58 |
.Fc |
| 59 |
.Ft void |
| 60 |
.Fo devstat_start_transaction_bio |
| 61 |
.Fa "struct devstat *ds" |
| 62 |
.Fa "struct bio *bp" |
| 63 |
.Fc |
| 57 |
.Ft void |
64 |
.Ft void |
| 58 |
.Fo devstat_end_transaction |
65 |
.Fo devstat_end_transaction |
| 59 |
.Fa "struct devstat *ds" |
66 |
.Fa "struct devstat *ds" |
| 60 |
.Fa "u_int32_t bytes" |
67 |
.Fa "u_int32_t bytes" |
| 61 |
.Fa "devstat_tag_type tag_type" |
68 |
.Fa "devstat_tag_type tag_type" |
| 62 |
.Fa "devstat_trans_flags flags" |
69 |
.Fa "devstat_trans_flags flags" |
|
|
70 |
.Fa "struct bintime *now" |
| 71 |
.Fa "struct bintime *then" |
| 63 |
.Fc |
72 |
.Fc |
| 64 |
.Ft void |
73 |
.Ft void |
| 65 |
.Fo devstat_end_transaction_bio |
74 |
.Fo devstat_end_transaction_bio |
|
Lines 77-95
Link Here
|
| 77 |
code. |
86 |
code. |
| 78 |
Instead, that is left for user programs to handle. |
87 |
Instead, that is left for user programs to handle. |
| 79 |
.Pp |
88 |
.Pp |
| 80 |
.Fn devstat_add_entry |
89 |
.Fn devstat_new_entry |
| 81 |
registers a device with the |
90 |
allocates and initializes |
| 82 |
.Nm |
91 |
.Va devstat |
| 83 |
subsystem. |
92 |
structure and returns a pointer to it. |
| 84 |
The caller is expected to have already allocated \fBand zeroed\fR |
93 |
.Fn devstat_new_entry |
| 85 |
the devstat structure before calling this function. |
|
|
| 86 |
.Fn devstat_add_entry |
| 87 |
takes several arguments: |
94 |
takes several arguments: |
| 88 |
.Bl -tag -width device_type |
95 |
.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 |
96 |
.It dev_name |
| 94 |
The device name, e.g.\& da, cd, sa. |
97 |
The device name, e.g.\& da, cd, sa. |
| 95 |
.It unit_number |
98 |
.It unit_number |
|
Lines 147-153
Link Here
|
| 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 |
It takes six arguments: |
| 151 |
.Bl -tag -width tag_type |
154 |
.Bl -tag -width tag_type |
| 152 |
.It ds |
155 |
.It ds |
| 153 |
The |
156 |
The |
|
Lines 161-172
Link Here
|
| 161 |
.It flags |
164 |
.It flags |
| 162 |
Transaction flags indicating whether the transaction was a read, write, or |
165 |
Transaction flags indicating whether the transaction was a read, write, or |
| 163 |
whether no data was transferred. |
166 |
whether no data was transferred. |
|
|
167 |
.It now |
| 168 |
Time when transaction started. |
| 169 |
.It then |
| 170 |
Time when transation ended. |
| 164 |
.El |
171 |
.El |
| 165 |
.Pp |
172 |
.Pp |
|
|
173 |
.Fn devstat_start_transaction_bio |
| 174 |
and |
| 166 |
.Fn devstat_end_transaction_bio |
175 |
.Fn devstat_end_transaction_bio |
| 167 |
is a wrapper for |
176 |
are wrappers for |
|
|
177 |
.Fn devstart_start_transaction |
| 178 |
and |
| 168 |
.Fn devstat_end_transaction |
179 |
.Fn devstat_end_transaction |
| 169 |
which pulls all the information from a |
180 |
respectively, which pull all the information from a |
| 170 |
.Va "struct bio" |
181 |
.Va "struct bio" |
| 171 |
which is ready for biodone(). |
182 |
which is ready for biodone(). |
| 172 |
.Pp |
183 |
.Pp |
|
Lines 207-268
Link Here
|
| 207 |
This will hopefully |
218 |
This will hopefully |
| 208 |
eliminate the counter wrap that would come very quickly on some systems if |
219 |
eliminate the counter wrap that would come very quickly on some systems if |
| 209 |
32 bit integers were used. |
220 |
32 bit integers were used. |
| 210 |
.It bytes_read |
|
|
| 211 |
This is the number of bytes that have been read from the device. |
| 212 |
.It bytes_freed |
| 213 |
This is the number of bytes that have been freed/erased on the device. |
| 214 |
.It num_reads |
| 215 |
This is the number of reads from the device. |
| 216 |
.It num_writes |
| 217 |
This is the number of writes to the device. |
| 218 |
.It num_frees |
| 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 |
| 236 |
and |
| 237 |
.Fn devstat_end_transaction |
| 238 |
are being called in client code. |
| 239 |
There should be one and only one |
| 240 |
transaction start event and one transaction end event for each transaction. |
| 241 |
.It block_size |
221 |
.It block_size |
| 242 |
This is the block size of the device, if the device has a block size. |
222 |
This is the block size of the device, if the device has a block size. |
| 243 |
.It tag_types |
223 |
.It tag_types |
| 244 |
This is an array of counters to record the number of various tag types that |
224 |
This is an array of counters to record the number of various tag types that |
| 245 |
are sent to a device. |
225 |
are sent to a device. |
| 246 |
See below for a list of tag types. |
226 |
See below for a list of tag types. |
| 247 |
.It dev_creation_time |
227 |
.It creation_time |
| 248 |
This is the time, as reported by |
228 |
This is the time, as reported by |
| 249 |
.Fn getmicrotime |
229 |
.Fn getmicrotime |
| 250 |
that the device was registered. |
230 |
that the device was created. |
| 251 |
.It busy_time |
231 |
.It busy_time |
| 252 |
This is the amount of time that the device busy count has been greater than |
232 |
This is the amount of time that the device busy count has been greater than |
| 253 |
zero. |
233 |
zero. |
| 254 |
This is only updated when the busy count returns to zero. |
234 |
This is only updated when the busy count returns to zero. |
| 255 |
.It start_time |
|
|
| 256 |
This is the time, as reported by |
| 257 |
.Fn getmicrouptime |
| 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 |
235 |
.It flags |
| 267 |
These flags indicate which statistics measurements are supported by a |
236 |
These flags indicate which statistics measurements are supported by a |
| 268 |
particular device. |
237 |
particular device. |
|
Lines 284-289
Link Here
|
| 284 |
The second parameter is attach order. |
253 |
The second parameter is attach order. |
| 285 |
See below for a list of |
254 |
See below for a list of |
| 286 |
available priorities. |
255 |
available priorities. |
|
|
256 |
.It id |
| 257 |
Identification for GEOM nodes. |
| 287 |
.El |
258 |
.El |
| 288 |
.Pp |
259 |
.Pp |
| 289 |
Each device is given a device type. |
260 |
Each device is given a device type. |