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, 77884539f7SKenneth D. Merry DSM_SKIP, 78c4a5ef6eSThomas Moestl DSM_MAX 79c4a5ef6eSThomas Moestl } devstat_metric; 80c4a5ef6eSThomas Moestl 8128fb27baSJustin T. Gibbs struct devstat_match { 8228fb27baSJustin T. Gibbs devstat_match_flags match_fields; 8328fb27baSJustin T. Gibbs devstat_type_flags device_type; 8428fb27baSJustin T. Gibbs int num_match_categories; 8528fb27baSJustin T. Gibbs }; 8628fb27baSJustin T. Gibbs 8728fb27baSJustin T. Gibbs struct devstat_match_table { 88c3508206SKenneth D. Merry const char * match_str; 8928fb27baSJustin T. Gibbs devstat_type_flags type; 9028fb27baSJustin T. Gibbs devstat_match_flags match_field; 9128fb27baSJustin T. Gibbs }; 9228fb27baSJustin T. Gibbs 9328fb27baSJustin T. Gibbs struct device_selection { 9428fb27baSJustin T. Gibbs u_int32_t device_number; 9528fb27baSJustin T. Gibbs char device_name[DEVSTAT_NAME_LEN]; 9628fb27baSJustin T. Gibbs int unit_number; 9728fb27baSJustin T. Gibbs int selected; 9828fb27baSJustin T. Gibbs u_int64_t bytes; 9928fb27baSJustin T. Gibbs int position; 10028fb27baSJustin T. Gibbs }; 10128fb27baSJustin T. Gibbs 10228fb27baSJustin T. Gibbs struct devinfo { 10328fb27baSJustin T. Gibbs struct devstat *devices; 10428fb27baSJustin T. Gibbs u_int8_t *mem_ptr; 105bcc6a3daSKenneth D. Merry long generation; 10628fb27baSJustin T. Gibbs int numdevs; 10728fb27baSJustin T. Gibbs }; 10828fb27baSJustin T. Gibbs 10928fb27baSJustin T. Gibbs struct statinfo { 11028fb27baSJustin T. Gibbs long cp_time[CPUSTATES]; 11128fb27baSJustin T. Gibbs long tk_nin; 11228fb27baSJustin T. Gibbs long tk_nout; 11328fb27baSJustin T. Gibbs struct devinfo *dinfo; 11428fb27baSJustin T. Gibbs struct timeval busy_time; 11528fb27baSJustin T. Gibbs }; 11628fb27baSJustin T. Gibbs 11728fb27baSJustin T. Gibbs typedef enum { 11828fb27baSJustin T. Gibbs DS_SELECT_ADD, 11928fb27baSJustin T. Gibbs DS_SELECT_ONLY, 12028fb27baSJustin T. Gibbs DS_SELECT_REMOVE, 12128fb27baSJustin T. Gibbs DS_SELECT_ADDONLY 12228fb27baSJustin T. Gibbs } devstat_select_mode; 12328fb27baSJustin T. Gibbs 12428fb27baSJustin T. Gibbs __BEGIN_DECLS 125c4a5ef6eSThomas Moestl /* Legacy interfaces. */ 12628fb27baSJustin T. Gibbs int getnumdevs(void); 127bcc6a3daSKenneth D. Merry long getgeneration(void); 12828fb27baSJustin T. Gibbs int getversion(void); 12928fb27baSJustin T. Gibbs int checkversion(void); 13028fb27baSJustin T. Gibbs int getdevs(struct statinfo *stats); 13128fb27baSJustin T. Gibbs int selectdevs(struct device_selection **dev_select, int *num_selected, 132bcc6a3daSKenneth D. Merry int *num_selections, long *select_generation, 133bcc6a3daSKenneth D. Merry long current_generation, struct devstat *devices, int numdevs, 13428fb27baSJustin T. Gibbs struct devstat_match *matches, int num_matches, 13528fb27baSJustin T. Gibbs char **dev_selections, int num_dev_selections, 13628fb27baSJustin T. Gibbs devstat_select_mode select_mode, int maxshowdevs, 13728fb27baSJustin T. Gibbs int perf_select); 13828fb27baSJustin T. Gibbs int buildmatch(char *match_str, struct devstat_match **matches, 13928fb27baSJustin T. Gibbs int *num_matches); 14028fb27baSJustin T. Gibbs int compute_stats(struct devstat *current, struct devstat *previous, 14128fb27baSJustin T. Gibbs long double etime, u_int64_t *total_bytes, 14228fb27baSJustin T. Gibbs u_int64_t *total_transfers, u_int64_t *total_blocks, 14328fb27baSJustin T. Gibbs long double *kb_per_transfer, 14428fb27baSJustin T. Gibbs long double *transfers_per_second, long double *mb_per_second, 14528fb27baSJustin T. Gibbs long double *blocks_per_second, 14628fb27baSJustin T. Gibbs long double *ms_per_transaction); 14728fb27baSJustin T. Gibbs long double compute_etime(struct timeval cur_time, struct timeval prev_time); 148c4a5ef6eSThomas Moestl 149c4a5ef6eSThomas Moestl /* New interfaces. */ 150c4a5ef6eSThomas Moestl int devstat_getnumdevs(kvm_t *kd); 151c4a5ef6eSThomas Moestl long devstat_getgeneration(kvm_t *kd); 152c4a5ef6eSThomas Moestl int devstat_getversion(kvm_t *kd); 153c4a5ef6eSThomas Moestl int devstat_checkversion(kvm_t *kd); 154c4a5ef6eSThomas Moestl int devstat_getdevs(kvm_t *kd, struct statinfo *stats); 155c4a5ef6eSThomas Moestl int devstat_selectdevs(struct device_selection **dev_select, int *num_selected, 156c4a5ef6eSThomas Moestl int *num_selections, long *select_generation, 157c4a5ef6eSThomas Moestl long current_generation, struct devstat *devices, 158c4a5ef6eSThomas Moestl int numdevs, struct devstat_match *matches, 159c4a5ef6eSThomas Moestl int num_matches, char **dev_selections, 160c4a5ef6eSThomas Moestl int num_dev_selections, devstat_select_mode select_mode, 161c4a5ef6eSThomas Moestl int maxshowdevs, int perf_select); 162c4a5ef6eSThomas Moestl int devstat_buildmatch(char *match_str, struct devstat_match **matches, 163c4a5ef6eSThomas Moestl int *num_matches); 164c4a5ef6eSThomas Moestl int devstat_compute_statistics(struct devstat *current, 165c4a5ef6eSThomas Moestl struct devstat *previous, 166c4a5ef6eSThomas Moestl long double etime, ...); 167c4a5ef6eSThomas Moestl long double devstat_compute_etime(struct timeval cur_time, 168c4a5ef6eSThomas Moestl struct timeval prev_time); 16928fb27baSJustin T. Gibbs __END_DECLS 17028fb27baSJustin T. Gibbs 17128fb27baSJustin T. Gibbs #endif /* _DEVSTAT_H */ 172