diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 16:08:12 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 16:08:12 -0400 |
| commit | b9cde963555b6519c5dbd34a39dee3418f593437 (patch) | |
| tree | 453accad3c3286e3416d4160de4a87223aff684c /static/freebsd/man9/devstat.9 | |
| parent | 5cb84ec742fd33f78c8022863fadaa8d0d93e176 (diff) | |
feat: Added FreeBSD man pages
Diffstat (limited to 'static/freebsd/man9/devstat.9')
| -rw-r--r-- | static/freebsd/man9/devstat.9 | 548 |
1 files changed, 548 insertions, 0 deletions
diff --git a/static/freebsd/man9/devstat.9 b/static/freebsd/man9/devstat.9 new file mode 100644 index 00000000..3682ad02 --- /dev/null +++ b/static/freebsd/man9/devstat.9 @@ -0,0 +1,548 @@ +.\" +.\" Copyright (c) 1998, 1999 Kenneth D. Merry. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.Dd July 15, 2020 +.Dt DEVSTAT 9 +.Os +.Sh NAME +.Nm devstat , +.Nm devstat_end_transaction , +.Nm devstat_end_transaction_bio , +.Nm devstat_end_transaction_bio_bt , +.Nm devstat_new_entry , +.Nm devstat_remove_entry , +.Nm devstat_start_transaction , +.Nm devstat_start_transaction_bio +.Nd kernel interface for keeping device statistics +.Sh SYNOPSIS +.In sys/devicestat.h +.Ft struct devstat * +.Fo devstat_new_entry +.Fa "const void *dev_name" +.Fa "int unit_number" +.Fa "uint32_t block_size" +.Fa "devstat_support_flags flags" +.Fa "devstat_type_flags device_type" +.Fa "devstat_priority priority" +.Fc +.Ft void +.Fn devstat_remove_entry "struct devstat *ds" +.Ft void +.Fo devstat_start_transaction +.Fa "struct devstat *ds" +.Fa "const struct bintime *now" +.Fc +.Ft void +.Fo devstat_start_transaction_bio +.Fa "struct devstat *ds" +.Fa "struct bio *bp" +.Fc +.Ft void +.Fo devstat_end_transaction +.Fa "struct devstat *ds" +.Fa "uint32_t bytes" +.Fa "devstat_tag_type tag_type" +.Fa "devstat_trans_flags flags" +.Fa "const struct bintime *now" +.Fa "const struct bintime *then" +.Fc +.Ft void +.Fo devstat_end_transaction_bio +.Fa "struct devstat *ds" +.Fa "const struct bio *bp" +.Fc +.Ft void +.Fo devstat_end_transaction_bio_bt +.Fa "struct devstat *ds" +.Fa "const struct bio *bp" +.Fa "const struct bintime *now" +.Fc +.Sh DESCRIPTION +The devstat subsystem is an interface for recording device +statistics, as its name implies. +The idea is to keep reasonably detailed +statistics while utilizing a minimum amount of CPU time to record them. +Thus, no statistical calculations are actually performed in the kernel +portion of the +.Nm +code. +Instead, that is left for user programs to handle. +.Pp +The historical and antiquated +.Nm +model assumed a single active IO operation per device, which is not accurate +for most disk-like drivers in the 2000s and beyond. +New consumers of the interface should almost certainly use only the "bio" +variants of the start and end transacation routines. +.Pp +.Fn devstat_new_entry +allocates and initializes +.Va devstat +structure and returns a pointer to it. +.Fn devstat_new_entry +takes several arguments: +.Bl -tag -width device_type +.It dev_name +The device name, e.g., da, cd, sa. +.It unit_number +Device unit number. +.It block_size +Block size of the device, if supported. +If the device does not support a +block size, or if the blocksize is unknown at the time the device is added +to the +.Nm +list, it should be set to 0. +.It flags +Flags indicating operations supported or not supported by the device. +See below for details. +.It device_type +The device type. +This is broken into three sections: base device type +(e.g., direct access, CDROM, sequential access), interface type (IDE, SCSI +or other) and a pass-through flag to indicate pas-through devices. +See below for a complete list of types. +.It priority +The device priority. +The priority is used to determine how devices are +sorted within +.Nm devstat Ns 's +list of devices. +Devices are sorted first by priority (highest to lowest), +and then by attach order. +See below for a complete list of available +priorities. +.El +.Pp +.Fn devstat_remove_entry +removes a device from the +.Nm +subsystem. +It takes the devstat structure for the device in question as +an argument. +The +.Nm +generation number is incremented and the number of devices is decremented. +.Pp +.Fn devstat_start_transaction +registers the start of a transaction with the +.Nm +subsystem. +Optionally, if the caller already has a +.Fn binuptime +value available, it may be passed in +.Fa *now . +Usually the caller can just pass +.Dv NULL +for +.Fa now , +and the routine will gather the current +.Fn binuptime +itself. +The busy count is incremented with each transaction start. +When a device goes from idle to busy, the system uptime is recorded in the +.Va busy_from +field of the +.Va devstat +structure. +.Pp +.Fn devstat_start_transaction_bio +records the +.Fn binuptime +in the provided bio's +.Fa bio_t0 +and then invokes +.Fn devstat_start_transaction . +.Pp +.Fn devstat_end_transaction +registers the end of a transaction with the +.Nm +subsystem. +It takes six arguments: +.Bl -tag -width tag_type +.It ds +The +.Va devstat +structure for the device in question. +.It bytes +The number of bytes transferred in this transaction. +.It tag_type +Transaction tag type. +See below for tag types. +.It flags +Transaction flags indicating whether the transaction was a read, write, or +whether no data was transferred. +.It now +The +.Fn binuptime +at the end of the transaction, or +.Dv NULL . +.It then +The +.Fn binuptime +at the beginning of the transaction, or +.Dv NULL . +.El +.Pp +If +.Fa now +is +.Dv NULL , +it collects the current time from +.Fn binuptime . +If +.Fa then +is +.Dv NULL , +the operation is not tracked in the +.Va devstat +.Fa duration +table. +.Pp +.Fn devstat_end_transaction_bio +is a thin wrapper for +.Fn devstat_end_transaction_bio_bt +with a +.Dv NULL +.Fa now +parameter. +.Pp +.Fn devstat_end_transaction_bio_bt +is a wrapper for +.Fn devstat_end_transaction +which pulls all needed information from a +.Va "struct bio" +prepared by +.Fn devstat_start_transaction_bio . +The bio must be ready for +.Fn biodone +(i.e., +.Fa bio_bcount +and +.Fa bio_resid +must be correctly initialized). +.Pp +The +.Va devstat +structure is composed of the following fields: +.Bl -tag -width dev_creation_time +.It sequence0 , +.It sequence1 +An implementation detail used to gather consistent snapshots of device +statistics. +.It start_count +Number of operations started. +.It end_count +Number of operations completed. +The +.Dq busy_count +can be calculated by subtracting +.Fa end_count +from +.Fa start_count . +.Fa ( sequence0 +and +.Fa sequence1 +are used to get a consistent snapshot.) +This is the current number of outstanding transactions for the device. +This should never go below zero, and on an idle device it should be zero. +If either one of these conditions is not true, it indicates a problem. +.Pp +There should be one and only one +transaction start event and one transaction end event for each transaction. +.It dev_links +Each +.Va devstat +structure is placed in a linked list when it is registered. +The +.Va dev_links +field contains a pointer to the next entry in the list of +.Va devstat +structures. +.It device_number +The device number is a unique identifier for each device. +The device +number is incremented for each new device that is registered. +The device +number is currently only a 32-bit integer, but it could be enlarged if +someone has a system with more than four billion device arrival events. +.It device_name +The device name is a text string given by the registering driver to +identify itself. +(e.g., +.Dq da , +.Dq cd , +.Dq sa , +etc.) +.It unit_number +The unit number identifies the particular instance of the peripheral driver +in question. +.It bytes[4] +This array contains the number of bytes that have been read (index +.Dv DEVSTAT_READ ) , +written (index +.Dv DEVSTAT_WRITE ) , +freed or erased (index +.Dv DEVSTAT_FREE ) , +or other (index +.Dv DEVSTAT_NO_DATA ) . +All values are unsigned 64-bit integers. +.It operations[4] +This array contains the number of operations of a given type that have been +performed. +The indices are identical to those for +.Fa bytes +above. +.Dv DEVSTAT_NO_DATA +or "other" represents the number of transactions to the device which are +neither reads, writes, nor frees. +For instance, +.Tn SCSI +drivers often send a test unit ready command to +.Tn SCSI +devices. +The test unit ready command does not read or write any data. +It merely causes the device to return its status. +.It duration[4] +This array contains the total bintime corresponding to completed operations of +a given type. +The indices are identical to those for +.Fa bytes +above. +(Operations that complete using the historical +.Fn devstat_end_transaction +API and do not provide a non-NULL +.Fa then +are not accounted for.) +.It busy_time +This is the amount of time that the device busy count has been greater than +zero. +This is only updated when the busy count returns to zero. +.It creation_time +This is the time, as reported by +.Fn getmicrotime +that the device was registered. +.It block_size +This is the block size of the device, if the device has a block size. +.It tag_types +This is an array of counters to record the number of various tag types that +are sent to a device. +See below for a list of tag types. +.It busy_from +If the device is not busy, this was the time that a transaction last completed. +If the device is busy, this the most recent of either the time that the device +became busy, or the time that the last transaction completed. +.It flags +These flags indicate which statistics measurements are supported by a +particular device. +These flags are primarily intended to serve as an aid +to userland programs that decipher the statistics. +.It device_type +This is the device type. +It consists of three parts: the device type +(e.g., direct access, CDROM, sequential access, etc.), the interface (IDE, +SCSI or other) and whether or not the device in question is a pass-through +driver. +See below for a complete list of device types. +.It priority +This is the priority. +This is the first parameter used to determine where +to insert a device in the +.Nm +list. +The second parameter is attach order. +See below for a list of available priorities. +.It id +Identification for GEOM nodes. +.El +.Pp +Each device is given a device type. +Pass-through devices have the same underlying device type and interface as the +device they provide an interface for, but they also have the pass-through flag +set. +The base device types are identical to the +.Tn SCSI +device type numbers, so with +.Tn SCSI +peripherals, the device type returned from an inquiry is usually ORed with the +.Tn SCSI +interface type and the pass-through flag if appropriate. +The device type +flags are as follows: +.Bd -literal -offset indent +typedef enum { + DEVSTAT_TYPE_DIRECT = 0x000, + DEVSTAT_TYPE_SEQUENTIAL = 0x001, + DEVSTAT_TYPE_PRINTER = 0x002, + DEVSTAT_TYPE_PROCESSOR = 0x003, + DEVSTAT_TYPE_WORM = 0x004, + DEVSTAT_TYPE_CDROM = 0x005, + DEVSTAT_TYPE_SCANNER = 0x006, + DEVSTAT_TYPE_OPTICAL = 0x007, + DEVSTAT_TYPE_CHANGER = 0x008, + DEVSTAT_TYPE_COMM = 0x009, + DEVSTAT_TYPE_ASC0 = 0x00a, + DEVSTAT_TYPE_ASC1 = 0x00b, + DEVSTAT_TYPE_STORARRAY = 0x00c, + DEVSTAT_TYPE_ENCLOSURE = 0x00d, + DEVSTAT_TYPE_FLOPPY = 0x00e, + DEVSTAT_TYPE_MASK = 0x00f, + DEVSTAT_TYPE_IF_SCSI = 0x010, + DEVSTAT_TYPE_IF_IDE = 0x020, + DEVSTAT_TYPE_IF_OTHER = 0x030, + DEVSTAT_TYPE_IF_NVME = 0x040, + DEVSTAT_TYPE_IF_MASK = 0x0f0, + DEVSTAT_TYPE_PASS = 0x100 +} devstat_type_flags; +.Ed +.Pp +Devices have a priority associated with them, which controls roughly where +they are placed in the +.Nm +list. +The priorities are as follows: +.Bd -literal -offset indent +typedef enum { + DEVSTAT_PRIORITY_MIN = 0x000, + DEVSTAT_PRIORITY_OTHER = 0x020, + DEVSTAT_PRIORITY_PASS = 0x030, + DEVSTAT_PRIORITY_FD = 0x040, + DEVSTAT_PRIORITY_WFD = 0x050, + DEVSTAT_PRIORITY_TAPE = 0x060, + DEVSTAT_PRIORITY_CD = 0x090, + DEVSTAT_PRIORITY_DISK = 0x110, + DEVSTAT_PRIORITY_ARRAY = 0x120, + DEVSTAT_PRIORITY_MAX = 0xfff +} devstat_priority; +.Ed +.Pp +Each device has associated with it flags to indicate what operations are +supported or not supported. +The +.Va devstat_support_flags +values are as follows: +.Bl -tag -width DEVSTAT_NO_ORDERED_TAGS +.It DEVSTAT_ALL_SUPPORTED +Every statistic type is supported by the device. +.It DEVSTAT_NO_BLOCKSIZE +This device does not have a blocksize. +.It DEVSTAT_NO_ORDERED_TAGS +This device does not support ordered tags. +.It DEVSTAT_BS_UNAVAILABLE +This device supports a blocksize, but it is currently unavailable. +This +flag is most often used with removable media drives. +.El +.Pp +Transactions to a device fall into one of three categories, which are +represented in the +.Va flags +passed into +.Fn devstat_end_transaction . +The transaction types are as follows: +.Bd -literal -offset indent +typedef enum { + DEVSTAT_NO_DATA = 0x00, + DEVSTAT_READ = 0x01, + DEVSTAT_WRITE = 0x02, + DEVSTAT_FREE = 0x03 +} devstat_trans_flags; +#define DEVSTAT_N_TRANS_FLAGS 4 +.Ed +.Pp +DEVSTAT_NO_DATA is a type of transactions to the device which are neither +reads or writes. +For instance, +.Tn SCSI +drivers often send a test unit ready command to +.Tn SCSI +devices. +The test unit ready command does not read or write any data. +It merely causes the device to return its status. +.Pp +There are four possible values for the +.Va tag_type +argument to +.Fn devstat_end_transaction : +.Bl -tag -width DEVSTAT_TAG_ORDERED +.It DEVSTAT_TAG_SIMPLE +The transaction had a simple tag. +.It DEVSTAT_TAG_HEAD +The transaction had a head of queue tag. +.It DEVSTAT_TAG_ORDERED +The transaction had an ordered tag. +.It DEVSTAT_TAG_NONE +The device does not support tags. +.El +.Pp +The tag type values correspond to the lower four bits of the +.Tn SCSI +tag definitions. +In CAM, for instance, the +.Va tag_action +from the CCB is ORed with 0xf to determine the tag type to pass in to +.Fn devstat_end_transaction . +.Pp +There is a macro, +.Dv DEVSTAT_VERSION +that is defined in +.In sys/devicestat.h . +This is the current version of the +.Nm +subsystem, and it should be incremented each time a change is made that +would require recompilation of userland programs that access +.Nm +statistics. +Userland programs use this version, via the +.Va kern.devstat.version +.Nm sysctl +variable to determine whether they are in sync with the kernel +.Nm +structures. +.Sh SEE ALSO +.Xr systat 1 , +.Xr devstat 3 , +.Xr iostat 8 , +.Xr rpc.rstatd 8 , +.Xr vmstat 8 +.Sh HISTORY +The +.Nm +statistics system appeared in +.Fx 3.0 . +.Sh AUTHORS +.An Kenneth Merry Aq Mt ken@FreeBSD.org +.Sh BUGS +There may be a need for +.Fn spl +protection around some of the +.Nm +list manipulation code to ensure, for example, that the list of devices +is not changed while someone is fetching the +.Va kern.devstat.all +.Nm sysctl +variable. |
