1*5e53a4f9SPedro F. Giffuni /*- 2*5e53a4f9SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*5e53a4f9SPedro F. Giffuni * 428fb27baSJustin T. Gibbs * Copyright (c) 1997, 1998 Kenneth D. Merry. 528fb27baSJustin T. Gibbs * All rights reserved. 628fb27baSJustin T. Gibbs * 728fb27baSJustin T. Gibbs * Redistribution and use in source and binary forms, with or without 828fb27baSJustin T. Gibbs * modification, are permitted provided that the following conditions 928fb27baSJustin T. Gibbs * are met: 1028fb27baSJustin T. Gibbs * 1. Redistributions of source code must retain the above copyright 1128fb27baSJustin T. Gibbs * notice, this list of conditions and the following disclaimer. 1228fb27baSJustin T. Gibbs * 2. Redistributions in binary form must reproduce the above copyright 1328fb27baSJustin T. Gibbs * notice, this list of conditions and the following disclaimer in the 1428fb27baSJustin T. Gibbs * documentation and/or other materials provided with the distribution. 1528fb27baSJustin T. Gibbs * 3. The name of the author may not be used to endorse or promote products 1628fb27baSJustin T. Gibbs * derived from this software without specific prior written permission. 1728fb27baSJustin T. Gibbs * 1828fb27baSJustin T. Gibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1928fb27baSJustin T. Gibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2028fb27baSJustin T. Gibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2128fb27baSJustin T. Gibbs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2228fb27baSJustin T. Gibbs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2328fb27baSJustin T. Gibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2428fb27baSJustin T. Gibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2528fb27baSJustin T. Gibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2628fb27baSJustin T. Gibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2728fb27baSJustin T. Gibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2828fb27baSJustin T. Gibbs * SUCH DAMAGE. 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> 35702bfe65SJohn Baldwin #include <sys/resource.h> 3628fb27baSJustin T. Gibbs 37c4a5ef6eSThomas Moestl #include <kvm.h> 38c4a5ef6eSThomas Moestl 397194d335SPoul-Henning Kamp /* 407194d335SPoul-Henning Kamp * Bumped every time we change the userland API. Hopefully this doesn't 417194d335SPoul-Henning Kamp * happen very often! This should be bumped every time we have to 427194d335SPoul-Henning Kamp * increment SHLIB_MAJOR in the libdevstat Makefile (for non-backwards 437194d335SPoul-Henning Kamp * compatible API changes) and should also be bumped every time we make 447194d335SPoul-Henning Kamp * backwards-compatible API changes, so application writers have a way to 457194d335SPoul-Henning Kamp * determine when a particular feature is available. 467194d335SPoul-Henning Kamp */ 47a84020c2SKen Smith #define DEVSTAT_USER_API_VER 6 487194d335SPoul-Henning Kamp 4928fb27baSJustin T. Gibbs #define DEVSTAT_ERRBUF_SIZE 2048 /* size of the devstat library error string */ 5028fb27baSJustin T. Gibbs 5128fb27baSJustin T. Gibbs extern char devstat_errbuf[]; 5228fb27baSJustin T. Gibbs 5328fb27baSJustin T. Gibbs typedef enum { 5428fb27baSJustin T. Gibbs DEVSTAT_MATCH_NONE = 0x00, 5528fb27baSJustin T. Gibbs DEVSTAT_MATCH_TYPE = 0x01, 5628fb27baSJustin T. Gibbs DEVSTAT_MATCH_IF = 0x02, 5728fb27baSJustin T. Gibbs DEVSTAT_MATCH_PASS = 0x04 5828fb27baSJustin T. Gibbs } devstat_match_flags; 5928fb27baSJustin T. Gibbs 60c4a5ef6eSThomas Moestl typedef enum { 61c4a5ef6eSThomas Moestl DSM_NONE, 62c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES, 63c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES_READ, 64c4a5ef6eSThomas Moestl DSM_TOTAL_BYTES_WRITE, 65c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS, 66c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_READ, 67c4a5ef6eSThomas Moestl DSM_TOTAL_TRANSFERS_WRITE, 68cb3733b7SPoul-Henning Kamp DSM_TOTAL_TRANSFERS_OTHER, 69c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS, 70c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_READ, 71c4a5ef6eSThomas Moestl DSM_TOTAL_BLOCKS_WRITE, 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, 76c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_READ, 77c4a5ef6eSThomas Moestl DSM_TRANSFERS_PER_SECOND_WRITE, 78cb3733b7SPoul-Henning Kamp DSM_TRANSFERS_PER_SECOND_OTHER, 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, 91cb3733b7SPoul-Henning Kamp DSM_TOTAL_BLOCKS_FREE, 920d2fdd78SPoul-Henning Kamp DSM_KB_PER_TRANSFER_FREE, 930d2fdd78SPoul-Henning Kamp DSM_MB_PER_SECOND_FREE, 940d2fdd78SPoul-Henning Kamp DSM_TRANSFERS_PER_SECOND_FREE, 950d2fdd78SPoul-Henning Kamp DSM_BLOCKS_PER_SECOND_FREE, 960d2fdd78SPoul-Henning Kamp DSM_MS_PER_TRANSACTION_OTHER, 9736eab1f5SPoul-Henning Kamp DSM_MS_PER_TRANSACTION_FREE, 9836eab1f5SPoul-Henning Kamp DSM_BUSY_PCT, 9936eab1f5SPoul-Henning Kamp DSM_QUEUE_LENGTH, 100fdd6757eSMikolaj Golub DSM_TOTAL_DURATION, 101fdd6757eSMikolaj Golub DSM_TOTAL_DURATION_READ, 102fdd6757eSMikolaj Golub DSM_TOTAL_DURATION_WRITE, 103fdd6757eSMikolaj Golub DSM_TOTAL_DURATION_FREE, 104fdd6757eSMikolaj Golub DSM_TOTAL_DURATION_OTHER, 105fdd6757eSMikolaj Golub DSM_TOTAL_BUSY_TIME, 106c4a5ef6eSThomas Moestl DSM_MAX 107c4a5ef6eSThomas Moestl } devstat_metric; 108c4a5ef6eSThomas Moestl 10928fb27baSJustin T. Gibbs struct devstat_match { 11028fb27baSJustin T. Gibbs devstat_match_flags match_fields; 11128fb27baSJustin T. Gibbs devstat_type_flags device_type; 11228fb27baSJustin T. Gibbs int num_match_categories; 11328fb27baSJustin T. Gibbs }; 11428fb27baSJustin T. Gibbs 11528fb27baSJustin T. Gibbs struct devstat_match_table { 116c3508206SKenneth D. Merry const char * match_str; 11728fb27baSJustin T. Gibbs devstat_type_flags type; 11828fb27baSJustin T. Gibbs devstat_match_flags match_field; 11928fb27baSJustin T. Gibbs }; 12028fb27baSJustin T. Gibbs 12128fb27baSJustin T. Gibbs struct device_selection { 12228fb27baSJustin T. Gibbs u_int32_t device_number; 12328fb27baSJustin T. Gibbs char device_name[DEVSTAT_NAME_LEN]; 12428fb27baSJustin T. Gibbs int unit_number; 12528fb27baSJustin T. Gibbs int selected; 12628fb27baSJustin T. Gibbs u_int64_t bytes; 12728fb27baSJustin T. Gibbs int position; 12828fb27baSJustin T. Gibbs }; 12928fb27baSJustin T. Gibbs 13028fb27baSJustin T. Gibbs struct devinfo { 13128fb27baSJustin T. Gibbs struct devstat *devices; 13228fb27baSJustin T. Gibbs u_int8_t *mem_ptr; 133bcc6a3daSKenneth D. Merry long generation; 13428fb27baSJustin T. Gibbs int numdevs; 13528fb27baSJustin T. Gibbs }; 13628fb27baSJustin T. Gibbs 13728fb27baSJustin T. Gibbs struct statinfo { 13828fb27baSJustin T. Gibbs long cp_time[CPUSTATES]; 13928fb27baSJustin T. Gibbs long tk_nin; 14028fb27baSJustin T. Gibbs long tk_nout; 14128fb27baSJustin T. Gibbs struct devinfo *dinfo; 1427194d335SPoul-Henning Kamp long double snap_time; 14328fb27baSJustin T. Gibbs }; 14428fb27baSJustin T. Gibbs 14528fb27baSJustin T. Gibbs typedef enum { 14628fb27baSJustin T. Gibbs DS_SELECT_ADD, 14728fb27baSJustin T. Gibbs DS_SELECT_ONLY, 14828fb27baSJustin T. Gibbs DS_SELECT_REMOVE, 14928fb27baSJustin T. Gibbs DS_SELECT_ADDONLY 15028fb27baSJustin T. Gibbs } devstat_select_mode; 15128fb27baSJustin T. Gibbs 15228fb27baSJustin T. Gibbs __BEGIN_DECLS 153c4a5ef6eSThomas Moestl 154c4a5ef6eSThomas Moestl int devstat_getnumdevs(kvm_t *kd); 155c4a5ef6eSThomas Moestl long devstat_getgeneration(kvm_t *kd); 156c4a5ef6eSThomas Moestl int devstat_getversion(kvm_t *kd); 157c4a5ef6eSThomas Moestl int devstat_checkversion(kvm_t *kd); 158c4a5ef6eSThomas Moestl int devstat_getdevs(kvm_t *kd, struct statinfo *stats); 159c4a5ef6eSThomas Moestl int devstat_selectdevs(struct device_selection **dev_select, int *num_selected, 160c4a5ef6eSThomas Moestl int *num_selections, long *select_generation, 161c4a5ef6eSThomas Moestl long current_generation, struct devstat *devices, 162c4a5ef6eSThomas Moestl int numdevs, struct devstat_match *matches, 163c4a5ef6eSThomas Moestl int num_matches, char **dev_selections, 164c4a5ef6eSThomas Moestl int num_dev_selections, devstat_select_mode select_mode, 165c4a5ef6eSThomas Moestl int maxshowdevs, int perf_select); 166c4a5ef6eSThomas Moestl int devstat_buildmatch(char *match_str, struct devstat_match **matches, 167c4a5ef6eSThomas Moestl int *num_matches); 168c4a5ef6eSThomas Moestl int devstat_compute_statistics(struct devstat *current, 169c4a5ef6eSThomas Moestl struct devstat *previous, 170c4a5ef6eSThomas Moestl long double etime, ...); 1717194d335SPoul-Henning Kamp long double devstat_compute_etime(struct bintime *cur_time, 1727194d335SPoul-Henning Kamp struct bintime *prev_time); 17328fb27baSJustin T. Gibbs __END_DECLS 17428fb27baSJustin T. Gibbs 17528fb27baSJustin T. Gibbs #endif /* _DEVSTAT_H */ 176