1c61d88e0SJustin T. Gibbs.\" 2c61d88e0SJustin T. Gibbs.\" Copyright (c) 1998 Kenneth D. Merry. 3c61d88e0SJustin T. Gibbs.\" All rights reserved. 4c61d88e0SJustin T. Gibbs.\" 5c61d88e0SJustin T. Gibbs.\" Redistribution and use in source and binary forms, with or without 6c61d88e0SJustin T. Gibbs.\" modification, are permitted provided that the following conditions 7c61d88e0SJustin T. Gibbs.\" are met: 8c61d88e0SJustin T. Gibbs.\" 1. Redistributions of source code must retain the above copyright 9c61d88e0SJustin T. Gibbs.\" notice, this list of conditions and the following disclaimer. 10c61d88e0SJustin T. Gibbs.\" 2. Redistributions in binary form must reproduce the above copyright 11c61d88e0SJustin T. Gibbs.\" notice, this list of conditions and the following disclaimer in the 12c61d88e0SJustin T. Gibbs.\" documentation and/or other materials provided with the distribution. 13c61d88e0SJustin T. Gibbs.\" 3. The name of the author may not be used to endorse or promote products 14c61d88e0SJustin T. Gibbs.\" derived from this software without specific prior written permission. 15c61d88e0SJustin T. Gibbs.\" 16c61d88e0SJustin T. Gibbs.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17c61d88e0SJustin T. Gibbs.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18c61d88e0SJustin T. Gibbs.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19c61d88e0SJustin T. Gibbs.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20c61d88e0SJustin T. Gibbs.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21c61d88e0SJustin T. Gibbs.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22c61d88e0SJustin T. Gibbs.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23c61d88e0SJustin T. Gibbs.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24c61d88e0SJustin T. Gibbs.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25c61d88e0SJustin T. Gibbs.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26c61d88e0SJustin T. Gibbs.\" SUCH DAMAGE. 27c61d88e0SJustin T. Gibbs.\" 28c61d88e0SJustin T. Gibbs.\" $Id$ 29c61d88e0SJustin T. Gibbs.\" 30c61d88e0SJustin T. Gibbs.Dd May 22, 1998 31c61d88e0SJustin T. Gibbs.Dt DEVSTAT 9 32c61d88e0SJustin T. Gibbs.Os FreeBSD 3.0 33c61d88e0SJustin T. Gibbs.Sh NAME 34c61d88e0SJustin T. Gibbs.Nm devstat 35c61d88e0SJustin T. Gibbs.Nd kernel interface for keeping device statistics 36c61d88e0SJustin T. Gibbs.Sh SYNOPSIS 37c61d88e0SJustin T. Gibbs.Fd #include <sys/devicestat.h> 38c61d88e0SJustin T. Gibbs.Ft void 39c61d88e0SJustin T. Gibbs.Fo devstat_add_entry 40c61d88e0SJustin T. Gibbs.Fa "struct devstat *ds" 41c61d88e0SJustin T. Gibbs.Fa "char *dev_name" 42c61d88e0SJustin T. Gibbs.Fa "int unit_number" 43c61d88e0SJustin T. Gibbs.Fa "u_int32_t block_size" 44c61d88e0SJustin T. Gibbs.Fa "devstat_support_flags flags" 45c61d88e0SJustin T. Gibbs.Fa "devstat_type_flags device_type" 46c61d88e0SJustin T. Gibbs.Fc 47c61d88e0SJustin T. Gibbs.Ft void 48c61d88e0SJustin T. Gibbs.Fn devstat_remove_entry "struct devstat *ds" 49c61d88e0SJustin T. Gibbs.Ft void 50c61d88e0SJustin T. Gibbs.Fn devstat_start_transaction "struct devstat *ds" 51c61d88e0SJustin T. Gibbs.Ft void 52c61d88e0SJustin T. Gibbs.Fo devstat_end_transaction 53c61d88e0SJustin T. Gibbs.Fa "struct devstat *ds" 54c61d88e0SJustin T. Gibbs.Fa "u_int32_t bytes" 55c61d88e0SJustin T. Gibbs.Fa "devstat_tag_type tag_type" 56c61d88e0SJustin T. Gibbs.Fa "devstat_trans_flags flags" 57c61d88e0SJustin T. Gibbs.Fc 58c61d88e0SJustin T. Gibbs.Sh DESCRIPTION 59c61d88e0SJustin T. GibbsThe devstat subsystem is basically an interface for recording device 60c61d88e0SJustin T. Gibbsstatistics, as its name implies. The idea is to keep reasonably detailed 61c61d88e0SJustin T. Gibbsstatistics while utilizing a minimum amount of CPU time to record them. 62c61d88e0SJustin T. GibbsThus, no statistical calculations are actually performed in the kernel 63c61d88e0SJustin T. Gibbsportion of the 64c61d88e0SJustin T. Gibbs.Nm 65c61d88e0SJustin T. Gibbscode. Instead, that is left for user programs to handle. 66c61d88e0SJustin T. Gibbs.Pp 67c61d88e0SJustin T. Gibbs.Fn devstat_add_entry 68c61d88e0SJustin T. Gibbsregisters a device with the 69c61d88e0SJustin T. Gibbs.Nm 70c61d88e0SJustin T. Gibbssubsystem. The caller is expected to have already allocated \fBand zeroed\fR 71c61d88e0SJustin T. Gibbsthe devstat structure before calling this function. 72c61d88e0SJustin T. Gibbs.Fn devstat_add_entry 73c61d88e0SJustin T. Gibbstakes several arguments: 74c61d88e0SJustin T. Gibbs.Bl -tag -width device_type 75c61d88e0SJustin T. Gibbs.It ds 76c61d88e0SJustin T. GibbsThe 77c61d88e0SJustin T. Gibbs.Va devstat 78c61d88e0SJustin T. Gibbsstructure, allocated and zeroed by the client. 79c61d88e0SJustin T. Gibbs.It dev_name 80c61d88e0SJustin T. GibbsThe device name. e.g. da, cd, sa. 81c61d88e0SJustin T. Gibbs.It unit_number 82c61d88e0SJustin T. GibbsDevice unit number. 83c61d88e0SJustin T. Gibbs.It block_size 84c61d88e0SJustin T. GibbsBlock size of the device, if supported. If the device does not support a 85c61d88e0SJustin T. Gibbsblock size, or if the blocksize is unknown at the time the device is added 86c61d88e0SJustin T. Gibbsto the 87c61d88e0SJustin T. Gibbs.Nm 88c61d88e0SJustin T. Gibbslist, it should be set to 0. 89c61d88e0SJustin T. Gibbs.It flags 90c61d88e0SJustin T. GibbsFlags indicating operations supported or not supported by the device. See 91c61d88e0SJustin T. Gibbsbelow for details. 92c61d88e0SJustin T. Gibbs.It device_type 93c61d88e0SJustin T. GibbsThe device type. This is broken into three sections: base device type 94c61d88e0SJustin T. Gibbs(e.g. direct access, CDROM, sequential access), interface type (IDE, SCSI 95c61d88e0SJustin T. Gibbsor other) and a passthrough flag to indicate pasthrough devices. See below 96c61d88e0SJustin T. Gibbsfor a complete list of types. 97c61d88e0SJustin T. Gibbs.El 98c61d88e0SJustin T. Gibbs.Pp 99c61d88e0SJustin T. Gibbs.Fn devstat_remove_entry 100c61d88e0SJustin T. Gibbsremoves a device from the 101c61d88e0SJustin T. Gibbs.Nm 102c61d88e0SJustin T. Gibbssubsystem. It takes the devstat structure for the device in question as 103c61d88e0SJustin T. Gibbsan argument. The 104c61d88e0SJustin T. Gibbs.Nm 105c61d88e0SJustin T. Gibbsgeneration number is incremented and the number of devices is decremented. 106c61d88e0SJustin T. Gibbs.Pp 107c61d88e0SJustin T. Gibbs.Fn devstat_start_transaction 108c61d88e0SJustin T. Gibbsregisters the start of a transaction with the 109c61d88e0SJustin T. Gibbs.Nm 110c61d88e0SJustin T. Gibbssubsystem. The busy count is incremented with each transaction start. 111c61d88e0SJustin T. GibbsWhen a device goes from idle to busy, the system uptime is recorded in the 112c61d88e0SJustin T. Gibbs.Va start_time 113c61d88e0SJustin T. Gibbsfield of the 114c61d88e0SJustin T. Gibbs.Va devstat 115c61d88e0SJustin T. Gibbsstructure. 116c61d88e0SJustin T. Gibbs.Pp 117c61d88e0SJustin T. Gibbs.Fn devstat_end_transaction 118c61d88e0SJustin T. Gibbsregisters the end of a transaction with the 119c61d88e0SJustin T. Gibbs.Nm 120c61d88e0SJustin T. Gibbssubsystem. It takes four arguments: 121c61d88e0SJustin T. Gibbs.Bl -tag -width tag_type 122c61d88e0SJustin T. Gibbs.It ds 123c61d88e0SJustin T. GibbsThe 124c61d88e0SJustin T. Gibbs.Va devstat 125c61d88e0SJustin T. Gibbsstructure for the device in question. 126c61d88e0SJustin T. Gibbs.It bytes 127c61d88e0SJustin T. GibbsThe number of bytes transferred in this transaction. 128c61d88e0SJustin T. Gibbs.It tag_type 129c61d88e0SJustin T. GibbsTransaction tag type. See below for tag types. 130c61d88e0SJustin T. Gibbs.It flags 131c61d88e0SJustin T. GibbsTransaction flags indicating whether the transaction was a read, write, or 132c61d88e0SJustin T. Gibbswhether no data was transferred. 133c61d88e0SJustin T. Gibbs.El 134c61d88e0SJustin T. Gibbs.Pp 135c61d88e0SJustin T. GibbsThe 136c61d88e0SJustin T. Gibbs.Va devstat 137c61d88e0SJustin T. Gibbsstructure is composed of the following fields: 138c61d88e0SJustin T. Gibbs.Bl -tag -width dev_creation_time 139c61d88e0SJustin T. Gibbs.It dev_links 140c61d88e0SJustin T. GibbsEach 141c61d88e0SJustin T. Gibbs.Va devstat 142c61d88e0SJustin T. Gibbsstructure is placed in a linked list when it is registered. The 143c61d88e0SJustin T. Gibbs.Va dev_links 144c61d88e0SJustin T. Gibbsfield contains a pointer to the next entry in the list of 145c61d88e0SJustin T. Gibbs.Va devstat 146c61d88e0SJustin T. Gibbsstructures. 147c61d88e0SJustin T. Gibbs.It device_number 148c61d88e0SJustin T. GibbsThe device number is a unique identifier for each device. The device 149c61d88e0SJustin T. Gibbsnumber is incremented for each new device that is registered. The device 150c61d88e0SJustin T. Gibbsnumber is currently only a 32-bit integer, but it could be enlarged if 151c61d88e0SJustin T. Gibbssomeone has a system with more than four billion device arrival events. 152c61d88e0SJustin T. Gibbs.It device_name 153c61d88e0SJustin T. GibbsThe device name is a text string given by the registering driver to 154c61d88e0SJustin T. Gibbsidentify itself. (e.g. 155c61d88e0SJustin T. Gibbs.Dq da , 156c61d88e0SJustin T. Gibbs.Dq cd , 157c61d88e0SJustin T. Gibbs.Dq sa , 158c61d88e0SJustin T. Gibbsetc.) 159c61d88e0SJustin T. Gibbs.It unit_number 160c61d88e0SJustin T. GibbsThe unit number identifies the particular instance of the peripheral driver 161c61d88e0SJustin T. Gibbsin question. 162c61d88e0SJustin T. Gibbs.It bytes_written 163c61d88e0SJustin T. GibbsThis is the number of bytes that have been written to the device. This 164c61d88e0SJustin T. Gibbsnumber is currently an unsigned 64 bit integer. This will hopefully 165c61d88e0SJustin T. Gibbseliminate the counter wrap that would come very quickly on some systems if 166c61d88e0SJustin T. Gibbs32 bit integers were used. 167c61d88e0SJustin T. Gibbs.It bytes_read 168c61d88e0SJustin T. GibbsThis is the number of bytes that have been read from the device. 169c61d88e0SJustin T. Gibbs.It num_reads 170c61d88e0SJustin T. GibbsThis is the number of reads from the device. 171c61d88e0SJustin T. Gibbs.It num_writes 172c61d88e0SJustin T. GibbsThis is the number of writes to the device. 173c61d88e0SJustin T. Gibbs.It num_other 174c61d88e0SJustin T. GibbsThis is the number of transactions to the device which are neither reads or 175c61d88e0SJustin T. Gibbswrites. For instance, 176c61d88e0SJustin T. Gibbs.Tn SCSI 177c61d88e0SJustin T. Gibbsdrivers often send a test unit ready command to 178c61d88e0SJustin T. Gibbs.Tn SCSI 179c61d88e0SJustin T. Gibbsdevices. The test unit ready command does not read or write any data. It 180c61d88e0SJustin T. Gibbsmerely causes the device to return its status. 181c61d88e0SJustin T. Gibbs.It busy_count 182c61d88e0SJustin T. GibbsThis is the current number of outstanding transactions for the device. 183c61d88e0SJustin T. GibbsThis should never go below zero, and on an idle device it should be zero. 184c61d88e0SJustin T. GibbsIf either one of these conditions is not true, it indicates a problem in 185c61d88e0SJustin T. Gibbsthe way 186c61d88e0SJustin T. Gibbs.Fn devstat_start_transaction 187c61d88e0SJustin T. Gibbsand 188c61d88e0SJustin T. Gibbs.Fn devstat_end_transaction 189c61d88e0SJustin T. Gibbsare being called in client code. There should be one and only one 190c61d88e0SJustin T. Gibbstransaction start event and one transaction end event for each transaction. 191c61d88e0SJustin T. Gibbs.It block_size 192c61d88e0SJustin T. GibbsThis is the block size of the device, if the device has a block size. 193c61d88e0SJustin T. Gibbs.It tag_types 194c61d88e0SJustin T. GibbsThis is an array of counters to record the number of various tag types that 195c61d88e0SJustin T. Gibbsare sent to a device. See below for a list of tag types. 196c61d88e0SJustin T. Gibbs.It dev_creation_time 197c61d88e0SJustin T. GibbsThis is the time, as reported by 198c61d88e0SJustin T. Gibbs.Fn getmicrotime 199c61d88e0SJustin T. Gibbsthat the device was registered. 200c61d88e0SJustin T. Gibbs.It busy_time 201c61d88e0SJustin T. GibbsThis is the amount of time that the device busy count has been greater than 202c61d88e0SJustin T. Gibbszero. This is only updated when the busy count returns to zero. 203c61d88e0SJustin T. Gibbs.It start_time 204c61d88e0SJustin T. GibbsThis is the time, as reported by 205c61d88e0SJustin T. Gibbs.Fn getmicrouptime 206c61d88e0SJustin T. Gibbsthat the device busy count went from zero to one. 207c61d88e0SJustin T. Gibbs.It last_comp_time 208c61d88e0SJustin T. GibbsThis is the time as reported by 209c61d88e0SJustin T. Gibbs.Fn getmicrouptime 210c61d88e0SJustin T. Gibbsthat a transaction last completed. It is used along with 211c61d88e0SJustin T. Gibbs.Va start_time 212c61d88e0SJustin T. Gibbsto calculate the device busy time. 213c61d88e0SJustin T. Gibbs.It flags 214c61d88e0SJustin T. GibbsThese flags indicate which statistics measurements are supported by a 215c61d88e0SJustin T. Gibbsparticular device. These flags are primarily intended to serve as an aid 216c61d88e0SJustin T. Gibbsto userland programs that decipher the statistics. 217c61d88e0SJustin T. Gibbs.It device_type 218c61d88e0SJustin T. GibbsThis is the device type. It consists of three parts: the device type 219c61d88e0SJustin T. Gibbs(e.g. direct access, CDROM, sequential access, etc.), the interface (IDE, 220c61d88e0SJustin T. GibbsSCSI or other) and whether or not the device in question is a passthrough 221c61d88e0SJustin T. Gibbsdriver. See below for a complete list of device types. 222c61d88e0SJustin T. Gibbs.El 223c61d88e0SJustin T. Gibbs.Pp 224c61d88e0SJustin T. GibbsEach device is given a device type. Passthrough devices have the same 225c61d88e0SJustin T. Gibbsunderlying device type and interface as the device they provide an 226c61d88e0SJustin T. Gibbsinterface for, but they also have the passthrough flag set. The base 227c61d88e0SJustin T. Gibbsdevice types are identical to the 228c61d88e0SJustin T. Gibbs.Tn SCSI 229c61d88e0SJustin T. Gibbsdevice type numbers, so with 230c61d88e0SJustin T. Gibbs.Tn SCSI 231c61d88e0SJustin T. Gibbsperipherals, the device type returned from an inquiry is usually ORed with 232c61d88e0SJustin T. Gibbsthe 233c61d88e0SJustin T. Gibbs.Tn SCSI 234c61d88e0SJustin T. Gibbsinterface type and the passthrough flag if appropriate. The device type 235c61d88e0SJustin T. Gibbsflags are as follows: 236c61d88e0SJustin T. Gibbs.Bd -literal -offset indent 237c61d88e0SJustin T. Gibbstypedef enum { 238c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_DIRECT = 0x000, 239c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_SEQUENTIAL = 0x001, 240c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_PRINTER = 0x002, 241c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_PROCESSOR = 0x003, 242c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_WORM = 0x004, 243c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_CDROM = 0x005, 244c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_SCANNER = 0x006, 245c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_OPTICAL = 0x007, 246c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_CHANGER = 0x008, 247c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_COMM = 0x009, 248c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_ASC0 = 0x00a, 249c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_ASC1 = 0x00b, 250c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_STORARRAY = 0x00c, 251c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_ENCLOSURE = 0x00d, 252c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_FLOPPY = 0x00e, 253c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_MASK = 0x00f, 254c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_IF_SCSI = 0x010, 255c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_IF_IDE = 0x020, 256c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_IF_OTHER = 0x030, 257c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_IF_MASK = 0x0f0, 258c61d88e0SJustin T. Gibbs DEVSTAT_TYPE_PASS = 0x100 259c61d88e0SJustin T. Gibbs} devstat_type_flags; 260c61d88e0SJustin T. Gibbs.Ed 261c61d88e0SJustin T. Gibbs.Pp 262c61d88e0SJustin T. GibbsEach device has associated with it flags to indicate what operations are 263c61d88e0SJustin T. Gibbssupported or not supported. The 264c61d88e0SJustin T. Gibbs.Va devstat_support_flags 265c61d88e0SJustin T. Gibbsvalues are as follows: 266c61d88e0SJustin T. Gibbs.Bl -tag -width DEVSTAT_NO_ORDERED_TAGS 267c61d88e0SJustin T. Gibbs.It DEVSTAT_ALL_SUPPORTED 268c61d88e0SJustin T. GibbsEvery statistic type is supported by the device. 269c61d88e0SJustin T. Gibbs.It DEVSTAT_NO_BLOCKSIZE 270c61d88e0SJustin T. GibbsThis device does not have a blocksize. 271c61d88e0SJustin T. Gibbs.It DEVSTAT_NO_ORDERED_TAGS 272c61d88e0SJustin T. GibbsThis device does not support ordered tags. 273c61d88e0SJustin T. Gibbs.It DEVSTAT_BS_UNAVAILABLE 274c61d88e0SJustin T. GibbsThis device supports a blocksize, but it is currently unavailable. This 275c61d88e0SJustin T. Gibbsflag is most often used with removable media drives. 276c61d88e0SJustin T. Gibbs.El 277c61d88e0SJustin T. Gibbs.Pp 278c61d88e0SJustin T. GibbsTransactions to a device fall into one of three categories, which are 279c61d88e0SJustin T. Gibbsrepresented in the 280c61d88e0SJustin T. Gibbs.Va flags 281c61d88e0SJustin T. Gibbspassed into 282c61d88e0SJustin T. Gibbs.Fn devstat_end_transaction . 283c61d88e0SJustin T. GibbsThe transaction types are as follows: 284c61d88e0SJustin T. Gibbs.Bd -literal -offset indent 285c61d88e0SJustin T. Gibbstypedef enum { 286c61d88e0SJustin T. Gibbs DEVSTAT_NO_DATA = 0x00, 287c61d88e0SJustin T. Gibbs DEVSTAT_READ = 0x01, 288c61d88e0SJustin T. Gibbs DEVSTAT_WRITE = 0x02 289c61d88e0SJustin T. Gibbs} devstat_trans_flags; 290c61d88e0SJustin T. Gibbs.Ed 291c61d88e0SJustin T. Gibbs.Pp 292c61d88e0SJustin T. GibbsThere are four possible values for the 293c61d88e0SJustin T. Gibbs.Va tag_type 294c61d88e0SJustin T. Gibbsargument to 295c61d88e0SJustin T. Gibbs.Fn devstat_end_transaction : 296c61d88e0SJustin T. Gibbs.Bl -tag -width DEVSTAT_TAG_ORDERED 297c61d88e0SJustin T. Gibbs.It DEVSTAT_TAG_SIMPLE 298c61d88e0SJustin T. GibbsThe transaction had a simple tag. 299c61d88e0SJustin T. Gibbs.It DEVSTAT_TAG_HEAD 300c61d88e0SJustin T. GibbsThe transaction had a head of queue tag. 301c61d88e0SJustin T. Gibbs.It DEVSTAT_TAG_ORDERED 302c61d88e0SJustin T. GibbsThe transaction had an ordered tag. 303c61d88e0SJustin T. Gibbs.It DEVSTAT_TAG_NONE 304c61d88e0SJustin T. GibbsThe device doesn't support tags. 305c61d88e0SJustin T. Gibbs.El 306c61d88e0SJustin T. Gibbs.Pp 307c61d88e0SJustin T. GibbsThe tag type values correspond to the lower four bits of the 308c61d88e0SJustin T. Gibbs.Tn SCSI 309c61d88e0SJustin T. Gibbstag definitions. In CAM, for instance, the 310c61d88e0SJustin T. Gibbs.Va tag_action 311c61d88e0SJustin T. Gibbsfrom the CCB is ORed with 0xf to determine the tag type to pass in to 312c61d88e0SJustin T. Gibbs.Fn devstat_end_transaction . 313c61d88e0SJustin T. Gibbs.Pp 314c61d88e0SJustin T. GibbsThere is a macro, 315c61d88e0SJustin T. Gibbs.Dv DEVSTAT_VERSION 316c61d88e0SJustin T. Gibbsthat is defined in 317c61d88e0SJustin T. Gibbs.Aq sys/devicestat.h . 318c61d88e0SJustin T. GibbsThis is the current version of the 319c61d88e0SJustin T. Gibbs.Nm 320c61d88e0SJustin T. Gibbssubsystem, and it should be incremented each time a change is made that 321c61d88e0SJustin T. Gibbswould require recompilation of userland programs that access 322c61d88e0SJustin T. Gibbs.Nm 323c61d88e0SJustin T. Gibbsstatistics. Userland programs use this version, via the 324c61d88e0SJustin T. Gibbs.Va kern.devstat.version 325c61d88e0SJustin T. Gibbs.Nm sysctl 326c61d88e0SJustin T. Gibbsvariable to determine whether they are in sync with the kernel 327c61d88e0SJustin T. Gibbs.Nm 328c61d88e0SJustin T. Gibbsstructures. 329c61d88e0SJustin T. Gibbs.Sh SEE ALSO 330c61d88e0SJustin T. Gibbs.Xr systat 1 , 331c61d88e0SJustin T. Gibbs.Xr devstat 3 , 332c61d88e0SJustin T. Gibbs.Xr iostat 8 , 333c61d88e0SJustin T. Gibbs.Xr rpc.rstatd 8 , 334c61d88e0SJustin T. Gibbs.Xr vmstat 8 335c61d88e0SJustin T. Gibbs.Sh HISTORY 336c61d88e0SJustin T. GibbsThe 337c61d88e0SJustin T. Gibbs.Nm 338c61d88e0SJustin T. Gibbsstatistics system appeared in 339c61d88e0SJustin T. Gibbs.Fx 3.0 . 340c61d88e0SJustin T. Gibbs.Sh AUTHORS 341c61d88e0SJustin T. GibbsKenneth Merry 342c61d88e0SJustin T. Gibbs.Aq ken@FreeBSD.ORG 343c61d88e0SJustin T. Gibbs.Sh BUGS 344c61d88e0SJustin T. GibbsThere may be a need for 345c61d88e0SJustin T. Gibbs.Fn spl 346c61d88e0SJustin T. Gibbsprotection around some of the 347c61d88e0SJustin T. Gibbs.Nm 348c61d88e0SJustin T. Gibbslist manipulation code to insure, for example, that the list of devices 349c61d88e0SJustin T. Gibbsis not changed while someone is fetching the 350c61d88e0SJustin T. Gibbs.Va kern.devstat.all 351c61d88e0SJustin T. Gibbs.Nm sysctl 352c61d88e0SJustin T. Gibbsvariable. 353c61d88e0SJustin T. Gibbs.Pp 354c61d88e0SJustin T. GibbsIt is impossible with the current 355c61d88e0SJustin T. Gibbs.Nm 356c61d88e0SJustin T. Gibbsarchitecture to accurately measure time per transaction. The only feasible 357c61d88e0SJustin T. Gibbsway to accurately measure time per transaction would be to record a 358c61d88e0SJustin T. Gibbstimestamp for every transaction. This measurement is probably not 359c61d88e0SJustin T. Gibbsworthwhile for most people as it would adversely affect the performance of 360c61d88e0SJustin T. Gibbsthe system and cost space to store the timestamps for individual 361c61d88e0SJustin T. Gibbstransactions. 362