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 387194d335SPoul-Henning Kamp /* 397194d335SPoul-Henning Kamp * Bumped every time we change the userland API. Hopefully this doesn't 407194d335SPoul-Henning Kamp * happen very often! This should be bumped every time we have to 417194d335SPoul-Henning Kamp * increment SHLIB_MAJOR in the libdevstat Makefile (for non-backwards 427194d335SPoul-Henning Kamp * compatible API changes) and should also be bumped every time we make 437194d335SPoul-Henning Kamp * backwards-compatible API changes, so application writers have a way to 447194d335SPoul-Henning Kamp * determine when a particular feature is available. 457194d335SPoul-Henning Kamp */ 460d2fdd78SPoul-Henning Kamp #define DEVSTAT_USER_API_VER 5 477194d335SPoul-Henning Kamp 4828fb27baSJustin T. Gibbs #define DEVSTAT_ERRBUF_SIZE 2048 /* size of the devstat library error string */ 4928fb27baSJustin T. Gibbs 5028fb27baSJustin T. Gibbs extern char devstat_errbuf[]; 5128fb27baSJustin T. Gibbs 5228fb27baSJustin T. Gibbs typedef enum { 5328fb27baSJustin T. Gibbs DEVSTAT_MATCH_NONE = 0x00, 5428fb27baSJustin T. Gibbs DEVSTAT_MATCH_TYPE = 0x01, 5528fb27baSJustin T. Gibbs DEVSTAT_MATCH_IF = 0x02, 5628fb27baSJustin T. Gibbs DEVSTAT_MATCH_PASS = 0x04 5728fb27baSJustin T. Gibbs } devstat_match_flags; 5828fb27baSJustin T. Gibbs 59c4a5ef6eSThomas Moestl typedef enum { 60c4a5ef6eSThomas Moestl DSM_NONE, 61c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES, 62c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES_READ, 63c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES_WRITE, 64c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS, 6536eab1f5SPoul-Henning Kamp DSM_TOTAL_TRANSFERS_OTHER, 66c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_READ, 67c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_WRITE, 68c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS, 69c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_READ, 70c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_WRITE, 7136eab1f5SPoul-Henning Kamp DSM_TOTAL_BLOCKS_FREE, 72c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER, 73c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER_READ, 74c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER_WRITE, 75c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND, 7636eab1f5SPoul-Henning Kamp DSM_TRANSFERS_PER_SECOND_OTHER, 77c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_READ, 78c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_WRITE, 79c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND, 80c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND_READ, 81c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND_WRITE, 82c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND, 83c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND_READ, 84c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND_WRITE, 85c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION, 86c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION_READ, 87c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION_WRITE, 880d2fdd78SPoul-Henning Kamp DSM_SKIP, 890d2fdd78SPoul-Henning Kamp DSM_TOTAL_BYTES_FREE, 900d2fdd78SPoul-Henning Kamp DSM_TOTAL_TRANSFERS_FREE, 910d2fdd78SPoul-Henning Kamp DSM_KB_PER_TRANSFER_FREE, 920d2fdd78SPoul-Henning Kamp DSM_MB_PER_SECOND_FREE, 930d2fdd78SPoul-Henning Kamp DSM_TRANSFERS_PER_SECOND_FREE, 940d2fdd78SPoul-Henning Kamp DSM_BLOCKS_PER_SECOND_FREE, 950d2fdd78SPoul-Henning Kamp DSM_MS_PER_TRANSACTION_OTHER, 9636eab1f5SPoul-Henning Kamp DSM_MS_PER_TRANSACTION_FREE, 9736eab1f5SPoul-Henning Kamp DSM_BUSY_PCT, 9836eab1f5SPoul-Henning Kamp DSM_QUEUE_LENGTH, 99c4a5ef6eSThomas Moestl DSM_MAX 100c4a5ef6eSThomas Moestl } devstat_metric; 101c4a5ef6eSThomas Moestl 10228fb27baSJustin T. Gibbs struct devstat_match { 10328fb27baSJustin T. Gibbs devstat_match_flags match_fields; 10428fb27baSJustin T. Gibbs devstat_type_flags device_type; 10528fb27baSJustin T. Gibbs int num_match_categories; 10628fb27baSJustin T. Gibbs }; 10728fb27baSJustin T. Gibbs 10828fb27baSJustin T. Gibbs struct devstat_match_table { 109c3508206SKenneth D. Merry const char * match_str; 11028fb27baSJustin T. Gibbs devstat_type_flags type; 11128fb27baSJustin T. Gibbs devstat_match_flags match_field; 11228fb27baSJustin T. Gibbs }; 11328fb27baSJustin T. Gibbs 11428fb27baSJustin T. Gibbs struct device_selection { 11528fb27baSJustin T. Gibbs u_int32_t device_number; 11628fb27baSJustin T. Gibbs char device_name[DEVSTAT_NAME_LEN]; 11728fb27baSJustin T. Gibbs int unit_number; 11828fb27baSJustin T. Gibbs int selected; 11928fb27baSJustin T. Gibbs u_int64_t bytes; 12028fb27baSJustin T. Gibbs int position; 12128fb27baSJustin T. Gibbs }; 12228fb27baSJustin T. Gibbs 12328fb27baSJustin T. Gibbs struct devinfo { 12428fb27baSJustin T. Gibbs struct devstat *devices; 12528fb27baSJustin T. Gibbs u_int8_t *mem_ptr; 126bcc6a3daSKenneth D. Merry long generation; 12728fb27baSJustin T. Gibbs int numdevs; 12828fb27baSJustin T. Gibbs }; 12928fb27baSJustin T. Gibbs 13028fb27baSJustin T. Gibbs struct statinfo { 13128fb27baSJustin T. Gibbs long cp_time[CPUSTATES]; 13228fb27baSJustin T. Gibbs long tk_nin; 13328fb27baSJustin T. Gibbs long tk_nout; 13428fb27baSJustin T. Gibbs struct devinfo *dinfo; 1357194d335SPoul-Henning Kamp long double snap_time; 13628fb27baSJustin T. Gibbs }; 13728fb27baSJustin T. Gibbs 13828fb27baSJustin T. Gibbs typedef enum { 13928fb27baSJustin T. Gibbs DS_SELECT_ADD, 14028fb27baSJustin T. Gibbs DS_SELECT_ONLY, 14128fb27baSJustin T. Gibbs DS_SELECT_REMOVE, 14228fb27baSJustin T. Gibbs DS_SELECT_ADDONLY 14328fb27baSJustin T. Gibbs } devstat_select_mode; 14428fb27baSJustin T. Gibbs 14528fb27baSJustin T. Gibbs __BEGIN_DECLS 146c4a5ef6eSThomas Moestl 147c4a5ef6eSThomas Moestl int devstat_getnumdevs(kvm_t *kd); 148c4a5ef6eSThomas Moestl long devstat_getgeneration(kvm_t *kd); 149c4a5ef6eSThomas Moestl int devstat_getversion(kvm_t *kd); 150c4a5ef6eSThomas Moestl int devstat_checkversion(kvm_t *kd); 151c4a5ef6eSThomas Moestl int devstat_getdevs(kvm_t *kd, struct statinfo *stats); 152c4a5ef6eSThomas Moestl int devstat_selectdevs(struct device_selection **dev_select, int *num_selected, 153c4a5ef6eSThomas Moestl int *num_selections, long *select_generation, 154c4a5ef6eSThomas Moestl long current_generation, struct devstat *devices, 155c4a5ef6eSThomas Moestl int numdevs, struct devstat_match *matches, 156c4a5ef6eSThomas Moestl int num_matches, char **dev_selections, 157c4a5ef6eSThomas Moestl int num_dev_selections, devstat_select_mode select_mode, 158c4a5ef6eSThomas Moestl int maxshowdevs, int perf_select); 159c4a5ef6eSThomas Moestl int devstat_buildmatch(char *match_str, struct devstat_match **matches, 160c4a5ef6eSThomas Moestl int *num_matches); 161c4a5ef6eSThomas Moestl int devstat_compute_statistics(struct devstat *current, 162c4a5ef6eSThomas Moestl struct devstat *previous, 163c4a5ef6eSThomas Moestl long double etime, ...); 1647194d335SPoul-Henning Kamp long double devstat_compute_etime(struct bintime *cur_time, 1657194d335SPoul-Henning Kamp struct bintime *prev_time); 16628fb27baSJustin T. Gibbs __END_DECLS 16728fb27baSJustin T. Gibbs 16828fb27baSJustin T. Gibbs #endif /* _DEVSTAT_H */ 169