xref: /freebsd/cddl/usr.sbin/dwatch/libexec/io (revision 5bf5ca772c6de2d53344a78cf461447cc322ccea)
1*5bf5ca77SDevin Teske# -*- tab-width: 4 -*- ;; Emacs
2*5bf5ca77SDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
3*5bf5ca77SDevin Teske############################################################ IDENT(1)
4*5bf5ca77SDevin Teske#
5*5bf5ca77SDevin Teske# $Title: dwatch(8) module for dtrace_io(4) $
6*5bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $
7*5bf5ca77SDevin Teske# $FreeBSD$
8*5bf5ca77SDevin Teske#
9*5bf5ca77SDevin Teske############################################################ DESCRIPTION
10*5bf5ca77SDevin Teske#
11*5bf5ca77SDevin Teske# Display activity related to disk I/O
12*5bf5ca77SDevin Teske#
13*5bf5ca77SDevin Teske############################################################ PROBE
14*5bf5ca77SDevin Teske
15*5bf5ca77SDevin Teskecase "$PROFILE" in
16*5bf5ca77SDevin Teskeio) : ${PROBE:=io:::start, io:::done} ;;
17*5bf5ca77SDevin Teske *) : ${PROBE:=io:::${PROFILE#io-}}
18*5bf5ca77SDevin Teskeesac
19*5bf5ca77SDevin Teske
20*5bf5ca77SDevin Teske############################################################ EVENT ACTION
21*5bf5ca77SDevin Teske
22*5bf5ca77SDevin Teske[ "$CUSTOM_TEST" ] || EVENT_TEST='this->devinfo.dev_name != ""'
23*5bf5ca77SDevin Teske
24*5bf5ca77SDevin Teske############################################################ ACTIONS
25*5bf5ca77SDevin Teske
26*5bf5ca77SDevin Teskeexec 9<<EOF
27*5bf5ca77SDevin Teskethis bufinfo_t	bufinfo;
28*5bf5ca77SDevin Teskethis devinfo_t	devinfo;
29*5bf5ca77SDevin Teskethis int	b_flags;
30*5bf5ca77SDevin Teskethis long	bio_length;
31*5bf5ca77SDevin Teskethis string	bio_cmd;
32*5bf5ca77SDevin Teskethis string	bio_flags;
33*5bf5ca77SDevin Teskethis string	device_entry;
34*5bf5ca77SDevin Teskethis string	device_if;
35*5bf5ca77SDevin Teskethis string	device_type;
36*5bf5ca77SDevin Teskethis string	flow;
37*5bf5ca77SDevin Teske
38*5bf5ca77SDevin Teskeinline string append_bio_flag[int flags, int flag] = this->bio_flags =
39*5bf5ca77SDevin Teske	strjoin(this->bio_flags,
40*5bf5ca77SDevin Teske	strjoin(this->bio_flags == "" ? "" : (flags & flag) == flag ? "|" : "",
41*5bf5ca77SDevin Teske		bio_flag_string[flags & flag]));
42*5bf5ca77SDevin Teske
43*5bf5ca77SDevin Teske$PROBE /(struct bio *)args[0] != NULL/ /* probe ID $ID */
44*5bf5ca77SDevin Teske{${TRACE:+
45*5bf5ca77SDevin Teske	printf("<$ID>");
46*5bf5ca77SDevin Teske}
47*5bf5ca77SDevin Teske	/*
48*5bf5ca77SDevin Teske	 * dtrace_io(4)
49*5bf5ca77SDevin Teske	 */
50*5bf5ca77SDevin Teske	this->flow = probefunc == "done" ? "<-" : "->";
51*5bf5ca77SDevin Teske
52*5bf5ca77SDevin Teske	/*
53*5bf5ca77SDevin Teske	 * struct bio *
54*5bf5ca77SDevin Teske	 */
55*5bf5ca77SDevin Teske	this->bufinfo = xlate <bufinfo_t> ((struct bio *)args[0]);
56*5bf5ca77SDevin Teske	this->bio_cmd = bio_cmd_string[(int)this->bufinfo.b_cmd];
57*5bf5ca77SDevin Teske	this->b_flags = (int)this->bufinfo.b_flags;
58*5bf5ca77SDevin Teske	this->bio_flags = bio_flag_string[this->b_flags & BIO_ERROR];
59*5bf5ca77SDevin Teske	this->bio_flags = strjoin(this->bio_flags, this->bufinfo.b_error ?
60*5bf5ca77SDevin Teske		strjoin(this->bio_flags == "" ?
61*5bf5ca77SDevin Teske			bio_flag_string[BIO_ERROR] : "",
62*5bf5ca77SDevin Teske			strjoin("#", lltostr(this->bufinfo.b_error))) :
63*5bf5ca77SDevin Teske		"");
64*5bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_DONE];
65*5bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_ONQUEUE];
66*5bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_ORDERED];
67*5bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_UNMAPPED];
68*5bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_TRANSIENT_MAPPING];
69*5bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_VLIST];
70*5bf5ca77SDevin Teske	this->bio_flags = this->bio_flags == "" ? "-" : this->bio_flags;
71*5bf5ca77SDevin Teske	this->bio_length = (long)this->bufinfo.b_bcount;
72*5bf5ca77SDevin Teske
73*5bf5ca77SDevin Teske	/*
74*5bf5ca77SDevin Teske	 * struct devstat *
75*5bf5ca77SDevin Teske	 */
76*5bf5ca77SDevin Teske	this->devinfo = xlate <devinfo_t> ((struct devstat *)args[1]);
77*5bf5ca77SDevin Teske	this->device_type = device_type[(int)this->devinfo.dev_type];
78*5bf5ca77SDevin Teske	this->device_if = device_if[(int)this->devinfo.dev_type];
79*5bf5ca77SDevin Teske	this->device_entry = strjoin(this->devinfo.dev_name,
80*5bf5ca77SDevin Teske		lltostr(this->devinfo.dev_minor));
81*5bf5ca77SDevin Teske}
82*5bf5ca77SDevin TeskeEOF
83*5bf5ca77SDevin TeskeACTIONS=$( cat <&9 )
84*5bf5ca77SDevin TeskeID=$(( $ID + 1 ))
85*5bf5ca77SDevin Teske
86*5bf5ca77SDevin Teske############################################################ EVENT DETAILS
87*5bf5ca77SDevin Teske
88*5bf5ca77SDevin Teskeexec 9<<EOF
89*5bf5ca77SDevin Teske	/*
90*5bf5ca77SDevin Teske	 * Print disk I/O details
91*5bf5ca77SDevin Teske	 */
92*5bf5ca77SDevin Teske	printf("%s %s %s %s %s %s %d byte%s",
93*5bf5ca77SDevin Teske		this->flow,
94*5bf5ca77SDevin Teske		this->device_type,
95*5bf5ca77SDevin Teske		this->device_if,
96*5bf5ca77SDevin Teske		this->device_entry,
97*5bf5ca77SDevin Teske		this->bio_cmd,
98*5bf5ca77SDevin Teske		this->bio_flags,
99*5bf5ca77SDevin Teske		this->bio_length,
100*5bf5ca77SDevin Teske		this->bio_length == 1 ? "" : "s");
101*5bf5ca77SDevin TeskeEOF
102*5bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 )
103*5bf5ca77SDevin Teske
104*5bf5ca77SDevin Teske################################################################################
105*5bf5ca77SDevin Teske# END
106*5bf5ca77SDevin Teske################################################################################
107