139211Sgibbs/*
239211Sgibbs * Copyright (c) 1997, 1998 Kenneth D. Merry.
339211Sgibbs * All rights reserved.
439211Sgibbs *
539211Sgibbs * Redistribution and use in source and binary forms, with or without
639211Sgibbs * modification, are permitted provided that the following conditions
739211Sgibbs * are met:
839211Sgibbs * 1. Redistributions of source code must retain the above copyright
939211Sgibbs *    notice, this list of conditions and the following disclaimer.
1039211Sgibbs * 2. Redistributions in binary form must reproduce the above copyright
1139211Sgibbs *    notice, this list of conditions and the following disclaimer in the
1239211Sgibbs *    documentation and/or other materials provided with the distribution.
1339211Sgibbs * 3. The name of the author may not be used to endorse or promote products
1439211Sgibbs *    derived from this software without specific prior written permission.
1539211Sgibbs *
1639211Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1739211Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1839211Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1939211Sgibbs * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2039211Sgibbs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2139211Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2239211Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2339211Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2439211Sgibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2539211Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2639211Sgibbs * SUCH DAMAGE.
2739211Sgibbs *
2850476Speter * $FreeBSD$
2939211Sgibbs */
3039211Sgibbs
3139211Sgibbs#ifndef _DEVSTAT_H
3239211Sgibbs#define _DEVSTAT_H
3339211Sgibbs#include <sys/cdefs.h>
3439211Sgibbs#include <sys/devicestat.h>
35175861Sjhb#include <sys/resource.h>
3639211Sgibbs
3781133Stmm#include <kvm.h>
3881133Stmm
39112288Sphk/*
40112288Sphk * Bumped every time we change the userland API.  Hopefully this doesn't
41112288Sphk * happen very often!  This should be bumped every time we have to
42112288Sphk * increment SHLIB_MAJOR in the libdevstat Makefile (for non-backwards
43112288Sphk * compatible API changes) and should also be bumped every time we make
44112288Sphk * backwards-compatible API changes, so application writers have a way to
45112288Sphk * determine when a particular feature is available.
46112288Sphk */
47148297Skensmith#define	DEVSTAT_USER_API_VER	6
48112288Sphk
4939211Sgibbs#define DEVSTAT_ERRBUF_SIZE  2048 /* size of the devstat library error string */
5039211Sgibbs
5139211Sgibbsextern char devstat_errbuf[];
5239211Sgibbs
5339211Sgibbstypedef enum {
5439211Sgibbs	DEVSTAT_MATCH_NONE	= 0x00,
5539211Sgibbs	DEVSTAT_MATCH_TYPE	= 0x01,
5639211Sgibbs	DEVSTAT_MATCH_IF	= 0x02,
5739211Sgibbs	DEVSTAT_MATCH_PASS	= 0x04
5839211Sgibbs} devstat_match_flags;
5939211Sgibbs
6081133Stmmtypedef enum {
6181133Stmm	DSM_NONE,
6281133Stmm	DSM_TOTAL_BYTES,
6381133Stmm	DSM_TOTAL_BYTES_READ,
6481133Stmm	DSM_TOTAL_BYTES_WRITE,
6581133Stmm	DSM_TOTAL_TRANSFERS,
6681133Stmm	DSM_TOTAL_TRANSFERS_READ,
6781133Stmm	DSM_TOTAL_TRANSFERS_WRITE,
68112381Sphk	DSM_TOTAL_TRANSFERS_OTHER,
6981133Stmm	DSM_TOTAL_BLOCKS,
7081133Stmm	DSM_TOTAL_BLOCKS_READ,
7181133Stmm	DSM_TOTAL_BLOCKS_WRITE,
7281133Stmm	DSM_KB_PER_TRANSFER,
7381133Stmm	DSM_KB_PER_TRANSFER_READ,
7481133Stmm	DSM_KB_PER_TRANSFER_WRITE,
7581133Stmm	DSM_TRANSFERS_PER_SECOND,
7681133Stmm	DSM_TRANSFERS_PER_SECOND_READ,
7781133Stmm	DSM_TRANSFERS_PER_SECOND_WRITE,
78112381Sphk	DSM_TRANSFERS_PER_SECOND_OTHER,
7981133Stmm	DSM_MB_PER_SECOND,
8081133Stmm	DSM_MB_PER_SECOND_READ,
8181133Stmm	DSM_MB_PER_SECOND_WRITE,
8281133Stmm	DSM_BLOCKS_PER_SECOND,
8381133Stmm	DSM_BLOCKS_PER_SECOND_READ,
8481133Stmm	DSM_BLOCKS_PER_SECOND_WRITE,
8581133Stmm	DSM_MS_PER_TRANSACTION,
8681133Stmm	DSM_MS_PER_TRANSACTION_READ,
8781133Stmm	DSM_MS_PER_TRANSACTION_WRITE,
88112380Sphk	DSM_SKIP,
89112380Sphk	DSM_TOTAL_BYTES_FREE,
90112380Sphk	DSM_TOTAL_TRANSFERS_FREE,
91112381Sphk	DSM_TOTAL_BLOCKS_FREE,
92112380Sphk	DSM_KB_PER_TRANSFER_FREE,
93112380Sphk	DSM_MB_PER_SECOND_FREE,
94112380Sphk	DSM_TRANSFERS_PER_SECOND_FREE,
95112380Sphk	DSM_BLOCKS_PER_SECOND_FREE,
96112380Sphk	DSM_MS_PER_TRANSACTION_OTHER,
97112373Sphk	DSM_MS_PER_TRANSACTION_FREE,
98112373Sphk	DSM_BUSY_PCT,
99112373Sphk	DSM_QUEUE_LENGTH,
100244270Strociny	DSM_TOTAL_DURATION,
101244270Strociny	DSM_TOTAL_DURATION_READ,
102244270Strociny	DSM_TOTAL_DURATION_WRITE,
103244270Strociny	DSM_TOTAL_DURATION_FREE,
104244270Strociny	DSM_TOTAL_DURATION_OTHER,
105244270Strociny	DSM_TOTAL_BUSY_TIME,
10681133Stmm	DSM_MAX
10781133Stmm} devstat_metric;
10881133Stmm
10939211Sgibbsstruct devstat_match {
11039211Sgibbs	devstat_match_flags	match_fields;
11139211Sgibbs	devstat_type_flags	device_type;
11239211Sgibbs	int			num_match_categories;
11339211Sgibbs};
11439211Sgibbs
11539211Sgibbsstruct devstat_match_table {
11683868Sken	const char *		match_str;
11739211Sgibbs	devstat_type_flags	type;
11839211Sgibbs	devstat_match_flags	match_field;
11939211Sgibbs};
12039211Sgibbs
12139211Sgibbsstruct device_selection {
12239211Sgibbs	u_int32_t	device_number;
12339211Sgibbs	char		device_name[DEVSTAT_NAME_LEN];
12439211Sgibbs	int		unit_number;
12539211Sgibbs	int		selected;
12639211Sgibbs	u_int64_t	bytes;
12739211Sgibbs	int		position;
12839211Sgibbs};
12939211Sgibbs
13039211Sgibbsstruct devinfo {
13139211Sgibbs	struct devstat	*devices;
13239211Sgibbs	u_int8_t	*mem_ptr;
13339498Sken	long		generation;
13439211Sgibbs	int		numdevs;
13539211Sgibbs};
13639211Sgibbs
13739211Sgibbsstruct statinfo {
13839211Sgibbs	long		cp_time[CPUSTATES];
13939211Sgibbs	long		tk_nin;
14039211Sgibbs	long		tk_nout;
14139211Sgibbs	struct devinfo	*dinfo;
142112288Sphk	long double 	snap_time;
14339211Sgibbs};
14439211Sgibbs
14539211Sgibbstypedef enum {
14639211Sgibbs	DS_SELECT_ADD,
14739211Sgibbs	DS_SELECT_ONLY,
14839211Sgibbs	DS_SELECT_REMOVE,
14939211Sgibbs	DS_SELECT_ADDONLY
15039211Sgibbs} devstat_select_mode;
15139211Sgibbs
15239211Sgibbs__BEGIN_DECLS
15381133Stmm
15481133Stmmint devstat_getnumdevs(kvm_t *kd);
15581133Stmmlong devstat_getgeneration(kvm_t *kd);
15681133Stmmint devstat_getversion(kvm_t *kd);
15781133Stmmint devstat_checkversion(kvm_t *kd);
15881133Stmmint devstat_getdevs(kvm_t *kd, struct statinfo *stats);
15981133Stmmint devstat_selectdevs(struct device_selection **dev_select, int *num_selected,
16081133Stmm		       int *num_selections, long *select_generation,
16181133Stmm		       long current_generation, struct devstat *devices,
16281133Stmm		       int numdevs, struct devstat_match *matches,
16381133Stmm		       int num_matches, char **dev_selections,
16481133Stmm		       int num_dev_selections, devstat_select_mode select_mode,
16581133Stmm		       int maxshowdevs, int perf_select);
16681133Stmmint devstat_buildmatch(char *match_str, struct devstat_match **matches,
16781133Stmm		       int *num_matches);
16881133Stmmint devstat_compute_statistics(struct devstat *current,
16981133Stmm			       struct devstat *previous,
17081133Stmm			       long double etime, ...);
171112288Sphklong double devstat_compute_etime(struct bintime *cur_time,
172112288Sphk				  struct bintime *prev_time);
17339211Sgibbs__END_DECLS
17439211Sgibbs
17539211Sgibbs#endif /* _DEVSTAT_H  */
176