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 */ 467194d335SPoul-Henning Kamp #define DEVSTAT_USER_API_VER 4 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, 65c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_READ, 66c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_WRITE, 67c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_OTHER, 68c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS, 69c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_READ, 70c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_WRITE, 71c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER, 72c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER_READ, 73c4a5ef6eSThomas Moestl DSM_KB_PER_TRANSFER_WRITE, 74c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND, 75c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_READ, 76c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_WRITE, 77c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_OTHER, 78c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND, 79c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND_READ, 80c4a5ef6eSThomas Moestl DSM_MB_PER_SECOND_WRITE, 81c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND, 82c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND_READ, 83c4a5ef6eSThomas Moestl DSM_BLOCKS_PER_SECOND_WRITE, 84c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION, 85c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION_READ, 86c4a5ef6eSThomas Moestl DSM_MS_PER_TRANSACTION_WRITE, 87884539f7SKenneth D. Merry DSM_SKIP, 88c4a5ef6eSThomas Moestl DSM_MAX 89c4a5ef6eSThomas Moestl } devstat_metric; 90c4a5ef6eSThomas Moestl 9128fb27baSJustin T. Gibbs struct devstat_match { 9228fb27baSJustin T. Gibbs devstat_match_flags match_fields; 9328fb27baSJustin T. Gibbs devstat_type_flags device_type; 9428fb27baSJustin T. Gibbs int num_match_categories; 9528fb27baSJustin T. Gibbs }; 9628fb27baSJustin T. Gibbs 9728fb27baSJustin T. Gibbs struct devstat_match_table { 98c3508206SKenneth D. Merry const char * match_str; 9928fb27baSJustin T. Gibbs devstat_type_flags type; 10028fb27baSJustin T. Gibbs devstat_match_flags match_field; 10128fb27baSJustin T. Gibbs }; 10228fb27baSJustin T. Gibbs 10328fb27baSJustin T. Gibbs struct device_selection { 10428fb27baSJustin T. Gibbs u_int32_t device_number; 10528fb27baSJustin T. Gibbs char device_name[DEVSTAT_NAME_LEN]; 10628fb27baSJustin T. Gibbs int unit_number; 10728fb27baSJustin T. Gibbs int selected; 10828fb27baSJustin T. Gibbs u_int64_t bytes; 10928fb27baSJustin T. Gibbs int position; 11028fb27baSJustin T. Gibbs }; 11128fb27baSJustin T. Gibbs 11228fb27baSJustin T. Gibbs struct devinfo { 11328fb27baSJustin T. Gibbs struct devstat *devices; 11428fb27baSJustin T. Gibbs u_int8_t *mem_ptr; 115bcc6a3daSKenneth D. Merry long generation; 11628fb27baSJustin T. Gibbs int numdevs; 11728fb27baSJustin T. Gibbs }; 11828fb27baSJustin T. Gibbs 11928fb27baSJustin T. Gibbs struct statinfo { 12028fb27baSJustin T. Gibbs long cp_time[CPUSTATES]; 12128fb27baSJustin T. Gibbs long tk_nin; 12228fb27baSJustin T. Gibbs long tk_nout; 12328fb27baSJustin T. Gibbs struct devinfo *dinfo; 1247194d335SPoul-Henning Kamp long double snap_time; 12528fb27baSJustin T. Gibbs }; 12628fb27baSJustin T. Gibbs 12728fb27baSJustin T. Gibbs typedef enum { 12828fb27baSJustin T. Gibbs DS_SELECT_ADD, 12928fb27baSJustin T. Gibbs DS_SELECT_ONLY, 13028fb27baSJustin T. Gibbs DS_SELECT_REMOVE, 13128fb27baSJustin T. Gibbs DS_SELECT_ADDONLY 13228fb27baSJustin T. Gibbs } devstat_select_mode; 13328fb27baSJustin T. Gibbs 13428fb27baSJustin T. Gibbs __BEGIN_DECLS 135c4a5ef6eSThomas Moestl 136c4a5ef6eSThomas Moestl int devstat_getnumdevs(kvm_t *kd); 137c4a5ef6eSThomas Moestl long devstat_getgeneration(kvm_t *kd); 138c4a5ef6eSThomas Moestl int devstat_getversion(kvm_t *kd); 139c4a5ef6eSThomas Moestl int devstat_checkversion(kvm_t *kd); 140c4a5ef6eSThomas Moestl int devstat_getdevs(kvm_t *kd, struct statinfo *stats); 141c4a5ef6eSThomas Moestl int devstat_selectdevs(struct device_selection **dev_select, int *num_selected, 142c4a5ef6eSThomas Moestl int *num_selections, long *select_generation, 143c4a5ef6eSThomas Moestl long current_generation, struct devstat *devices, 144c4a5ef6eSThomas Moestl int numdevs, struct devstat_match *matches, 145c4a5ef6eSThomas Moestl int num_matches, char **dev_selections, 146c4a5ef6eSThomas Moestl int num_dev_selections, devstat_select_mode select_mode, 147c4a5ef6eSThomas Moestl int maxshowdevs, int perf_select); 148c4a5ef6eSThomas Moestl int devstat_buildmatch(char *match_str, struct devstat_match **matches, 149c4a5ef6eSThomas Moestl int *num_matches); 150c4a5ef6eSThomas Moestl int devstat_compute_statistics(struct devstat *current, 151c4a5ef6eSThomas Moestl struct devstat *previous, 152c4a5ef6eSThomas Moestl long double etime, ...); 1537194d335SPoul-Henning Kamp long double devstat_compute_etime(struct bintime *cur_time, 1547194d335SPoul-Henning Kamp struct bintime *prev_time); 15528fb27baSJustin T. Gibbs __END_DECLS 15628fb27baSJustin T. Gibbs 15728fb27baSJustin T. Gibbs #endif /* _DEVSTAT_H */ 158