multiple issues with devstat_*(9)

Alexander Best arundel at freebsd.org
Thu Mar 31 22:33:39 UTC 2011


hi there,

i think there are multiple issues with devstat. i found the following in
devicestat.h:

/*
 * These types are intended to aid statistics gathering/display programs.
 * The first 13 types (up to the 'target' flag) are identical numerically
 * to the SCSI device type numbers.  The next 3 types designate the device
 * interface.  Currently the choices are IDE, SCSI, and 'other'.  The last
 * flag specifies whether or not the given device is a passthrough device
 * or not.  If it is a passthrough device, the lower 4 bits specify which
 * type of physical device lies under the passthrough device, and the next
 * 4 bits specify the interface.
 */
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_MASK    = 0x0f0,
        DEVSTAT_TYPE_PASS       = 0x100
} devstat_type_flags;


also the devstat(9) man page says:

     Each device is given a device type.  Pass-through devices have the same
     underlying device type and interface as the device they provide an inter-
     face for, but they also have the pass-through flag set.  The base device
     types are identical to the SCSI device type numbers, so with SCSI periph-
     erals, the device type returned from an inquiry is usually ORed with the
     SCSI interface type and the pass-through flag if appropriate.  The device
     type flags are as follows:

...so let's get started:

otaku% iostat -n100
       tty            ada0             ada1              md0              cd0            pass0            pass1            pass2             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   1    92 21.18   0  0.01  24.37  12  0.29   0.00   0  0.00  60.27   0  0.01   0.37   0  0.00   0.37   0  0.00   0.00   0  0.00   5  0  4  0 90

..so far so good

otaku% iostat -t da
       tty            ada0             ada1              md0             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   1    92 21.18   0  0.01  24.37  12  0.29   0.00   0  0.00   5  0  4  0 90

...not good! this should include two pass devices!

otaku% iostat -t scsi
       tty             cd0             cpu
 tin  tout  KB/t tps  MB/s  us ni sy in id
   1    92 60.27   0  0.01   5  0  4  0 90

..what?

otaku% iostat -t ide
       tty            cpu
 tin  tout us ni sy in id
   1    92  5  0  4  0 90
otaku% iostat -t other
       tty            cpu
 tin  tout us ni sy in id
   1    92  5  0  4  0 90

...what about md0? ada0? ada1? md0?

otaku% iostat -t cd0
       tty             cd0             cpu
 tin  tout  KB/t tps  MB/s  us ni sy in id
   1    92 60.27   0  0.01   5  0  4  0 90

...this should also include a pass device

otaku% iostat -t pass
       tty           pass0            pass1            pass2             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   1    92  0.37   0  0.00   0.37   0  0.00   0.00   0  0.00   5  0  4  0 90

...this one's working as expected.

funny thing is i found the following in scsi_pass.c:

        softc->device_stats = devstat_new_entry("pass",
                          periph->unit_number, 0,
                          DEVSTAT_NO_BLOCKSIZE
                          | (no_tags ? DEVSTAT_NO_ORDERED_TAGS : 0),
                          softc->pd_type |
                          DEVSTAT_TYPE_IF_SCSI |
                          DEVSTAT_TYPE_PASS,
                          DEVSTAT_PRIORITY_PASS);

...so pass* *should* show up under iostat -t scsi.

this is all very weird. it seems the DEVSTAT_TYPE_IF_* stuff has some major
problems. also the pass* devices aren't beeing aasigned to DEVSTAT_TYPE_DIRECT
and DEVSTAT_TYPE_CDROM, as devstat(9) suggests.

cheers.
alex

-- 
a13x


More information about the freebsd-current mailing list