128fb27baSJustin T. Gibbs /* 228fb27baSJustin T. Gibbs * Copyright (c) 1997, 1998 Kenneth D. Merry. 328fb27baSJustin T. Gibbs * All rights reserved. 428fb27baSJustin T. Gibbs * 528fb27baSJustin T. Gibbs * Redistribution and use in source and binary forms, with or without 628fb27baSJustin T. Gibbs * modification, are permitted provided that the following conditions 728fb27baSJustin T. Gibbs * are met: 828fb27baSJustin T. Gibbs * 1. Redistributions of source code must retain the above copyright 928fb27baSJustin T. Gibbs * notice, this list of conditions and the following disclaimer. 1028fb27baSJustin T. Gibbs * 2. Redistributions in binary form must reproduce the above copyright 1128fb27baSJustin T. Gibbs * notice, this list of conditions and the following disclaimer in the 1228fb27baSJustin T. Gibbs * documentation and/or other materials provided with the distribution. 1328fb27baSJustin T. Gibbs * 3. The name of the author may not be used to endorse or promote products 1428fb27baSJustin T. Gibbs * derived from this software without specific prior written permission. 1528fb27baSJustin T. Gibbs * 1628fb27baSJustin T. Gibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1728fb27baSJustin T. Gibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1828fb27baSJustin T. Gibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1928fb27baSJustin T. Gibbs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2028fb27baSJustin T. Gibbs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2128fb27baSJustin T. Gibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2228fb27baSJustin T. Gibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2328fb27baSJustin T. Gibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2428fb27baSJustin T. Gibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2528fb27baSJustin T. Gibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2628fb27baSJustin T. Gibbs * SUCH DAMAGE. 2728fb27baSJustin T. Gibbs * 287f3dea24SPeter Wemm * $FreeBSD$ 2928fb27baSJustin T. Gibbs */ 3028fb27baSJustin T. Gibbs 3128fb27baSJustin T. Gibbs #ifndef _DEVSTAT_H 3228fb27baSJustin T. Gibbs #define _DEVSTAT_H 3328fb27baSJustin T. Gibbs #include <sys/cdefs.h> 3428fb27baSJustin T. Gibbs #include <sys/devicestat.h> 3528fb27baSJustin T. Gibbs 36c4a5ef6eSThomas Moestl #include <kvm.h> 37c4a5ef6eSThomas Moestl 3828fb27baSJustin T. Gibbs #define DEVSTAT_ERRBUF_SIZE 2048 /* size of the devstat library error string */ 3928fb27baSJustin T. Gibbs 4028fb27baSJustin T. Gibbs extern char devstat_errbuf[]; 4128fb27baSJustin T. Gibbs 4228fb27baSJustin T. Gibbs typedef enum { 4328fb27baSJustin T. Gibbs DEVSTAT_MATCH_NONE = 0x00, 4428fb27baSJustin T. Gibbs DEVSTAT_MATCH_TYPE = 0x01, 4528fb27baSJustin T. Gibbs DEVSTAT_MATCH_IF = 0x02, 4628fb27baSJustin T. Gibbs DEVSTAT_MATCH_PASS = 0x04 4728fb27baSJustin T. Gibbs } devstat_match_flags; 4828fb27baSJustin T. Gibbs 49c4a5ef6eSThomas Moestl typedef enum { 50c4a5ef6eSThomas Moestl DSM_NONE, 51c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES, 52c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES_READ, 53c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES_WRITE, 54c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS, 55c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_READ, 56c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_WRITE, 57c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_OTHER, 58c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS, 59c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_READ, 60c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_WRITE, 61c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER, 62c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER_READ, 63c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER_WRITE, 64c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND, 65c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_READ, 66c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_WRITE, 67c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_OTHER, 68c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND, 69c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND_READ, 70c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND_WRITE, 71c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND, 72c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND_READ, 73c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND_WRITE, 74c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION, 75c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION_READ, 76c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION_WRITE, 77c4a5ef6eSThomas Moestl DSM_MAX 78c4a5ef6eSThomas Moestl } devstat_metric; 79c4a5ef6eSThomas Moestl 8028fb27baSJustin T. Gibbs struct devstat_match { 8128fb27baSJustin T. Gibbs devstat_match_flags match_fields; 8228fb27baSJustin T. Gibbs devstat_type_flags device_type; 8328fb27baSJustin T. Gibbs int num_match_categories; 8428fb27baSJustin T. Gibbs }; 8528fb27baSJustin T. Gibbs 8628fb27baSJustin T. Gibbs struct devstat_match_table { 8728fb27baSJustin T. Gibbs char *match_str; 8828fb27baSJustin T. Gibbs devstat_type_flags type; 8928fb27baSJustin T. Gibbs devstat_match_flags match_field; 9028fb27baSJustin T. Gibbs }; 9128fb27baSJustin T. Gibbs 9228fb27baSJustin T. Gibbs struct device_selection { 9328fb27baSJustin T. Gibbs u_int32_t device_number; 9428fb27baSJustin T. Gibbs char device_name[DEVSTAT_NAME_LEN]; 9528fb27baSJustin T. Gibbs int unit_number; 9628fb27baSJustin T. Gibbs int selected; 9728fb27baSJustin T. Gibbs u_int64_t bytes; 9828fb27baSJustin T. Gibbs int position; 9928fb27baSJustin T. Gibbs }; 10028fb27baSJustin T. Gibbs 10128fb27baSJustin T. Gibbs struct devinfo { 10228fb27baSJustin T. Gibbs struct devstat *devices; 10328fb27baSJustin T. Gibbs u_int8_t *mem_ptr; 104bcc6a3daSKenneth D. Merry long generation; 10528fb27baSJustin T. Gibbs int numdevs; 10628fb27baSJustin T. Gibbs }; 10728fb27baSJustin T. Gibbs 10828fb27baSJustin T. Gibbs struct statinfo { 10928fb27baSJustin T. Gibbs long cp_time[CPUSTATES]; 11028fb27baSJustin T. Gibbs long tk_nin; 11128fb27baSJustin T. Gibbs long tk_nout; 11228fb27baSJustin T. Gibbs struct devinfo *dinfo; 11328fb27baSJustin T. Gibbs struct timeval busy_time; 11428fb27baSJustin T. Gibbs }; 11528fb27baSJustin T. Gibbs 11628fb27baSJustin T. Gibbs typedef enum { 11728fb27baSJustin T. Gibbs DS_SELECT_ADD, 11828fb27baSJustin T. Gibbs DS_SELECT_ONLY, 11928fb27baSJustin T. Gibbs DS_SELECT_REMOVE, 12028fb27baSJustin T. Gibbs DS_SELECT_ADDONLY 12128fb27baSJustin T. Gibbs } devstat_select_mode; 12228fb27baSJustin T. Gibbs 12328fb27baSJustin T. Gibbs __BEGIN_DECLS 124c4a5ef6eSThomas Moestl /* Legacy interfaces. */ 12528fb27baSJustin T. Gibbs int getnumdevs(void); 126bcc6a3daSKenneth D. Merry long getgeneration(void); 12728fb27baSJustin T. Gibbs int getversion(void); 12828fb27baSJustin T. Gibbs int checkversion(void); 12928fb27baSJustin T. Gibbs int getdevs(struct statinfo *stats); 13028fb27baSJustin T. Gibbs int selectdevs(struct device_selection **dev_select, int *num_selected, 131bcc6a3daSKenneth D. Merry int *num_selections, long *select_generation, 132bcc6a3daSKenneth D. Merry long current_generation, struct devstat *devices, int numdevs, 13328fb27baSJustin T. Gibbs struct devstat_match *matches, int num_matches, 13428fb27baSJustin T. Gibbs char **dev_selections, int num_dev_selections, 13528fb27baSJustin T. Gibbs devstat_select_mode select_mode, int maxshowdevs, 13628fb27baSJustin T. Gibbs int perf_select); 13728fb27baSJustin T. Gibbs int buildmatch(char *match_str, struct devstat_match **matches, 13828fb27baSJustin T. Gibbs int *num_matches); 13928fb27baSJustin T. Gibbs int compute_stats(struct devstat *current, struct devstat *previous, 14028fb27baSJustin T. Gibbs long double etime, u_int64_t *total_bytes, 14128fb27baSJustin T. Gibbs u_int64_t *total_transfers, u_int64_t *total_blocks, 14228fb27baSJustin T. Gibbs long double *kb_per_transfer, 14328fb27baSJustin T. Gibbs long double *transfers_per_second, long double *mb_per_second, 14428fb27baSJustin T. Gibbs long double *blocks_per_second, 14528fb27baSJustin T. Gibbs long double *ms_per_transaction); 14628fb27baSJustin T. Gibbs long double compute_etime(struct timeval cur_time, struct timeval prev_time); 147c4a5ef6eSThomas Moestl 148c4a5ef6eSThomas Moestl /* New interfaces. */ 149c4a5ef6eSThomas Moestl int devstat_getnumdevs(kvm_t *kd); 150c4a5ef6eSThomas Moestl long devstat_getgeneration(kvm_t *kd); 151c4a5ef6eSThomas Moestl int devstat_getversion(kvm_t *kd); 152c4a5ef6eSThomas Moestl int devstat_checkversion(kvm_t *kd); 153c4a5ef6eSThomas Moestl int devstat_getdevs(kvm_t *kd, struct statinfo *stats); 154c4a5ef6eSThomas Moestl int devstat_selectdevs(struct device_selection **dev_select, int *num_selected, 155c4a5ef6eSThomas Moestl int *num_selections, long *select_generation, 156c4a5ef6eSThomas Moestl long current_generation, struct devstat *devices, 157c4a5ef6eSThomas Moestl int numdevs, struct devstat_match *matches, 158c4a5ef6eSThomas Moestl int num_matches, char **dev_selections, 159c4a5ef6eSThomas Moestl int num_dev_selections, devstat_select_mode select_mode, 160c4a5ef6eSThomas Moestl int maxshowdevs, int perf_select); 161c4a5ef6eSThomas Moestl int devstat_buildmatch(char *match_str, struct devstat_match **matches, 162c4a5ef6eSThomas Moestl int *num_matches); 163c4a5ef6eSThomas Moestl int devstat_compute_statistics(struct devstat *current, 164c4a5ef6eSThomas Moestl struct devstat *previous, 165c4a5ef6eSThomas Moestl long double etime, ...); 166c4a5ef6eSThomas Moestl long double devstat_compute_etime(struct timeval cur_time, 167c4a5ef6eSThomas Moestl struct timeval prev_time); 16828fb27baSJustin T. Gibbs __END_DECLS 16928fb27baSJustin T. Gibbs 17028fb27baSJustin T. Gibbs #endif /* _DEVSTAT_H */ 171