xref: /freebsd/cddl/usr.sbin/dwatch/libexec/io (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
15bf5ca77SDevin Teske# -*- tab-width: 4 -*- ;; Emacs
25bf5ca77SDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
35bf5ca77SDevin Teske############################################################ IDENT(1)
45bf5ca77SDevin Teske#
55bf5ca77SDevin Teske# $Title: dwatch(8) module for dtrace_io(4) $
65bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $
75bf5ca77SDevin Teske#
85bf5ca77SDevin Teske############################################################ DESCRIPTION
95bf5ca77SDevin Teske#
105bf5ca77SDevin Teske# Display activity related to disk I/O
115bf5ca77SDevin Teske#
125bf5ca77SDevin Teske############################################################ PROBE
135bf5ca77SDevin Teske
145bf5ca77SDevin Teskecase "$PROFILE" in
155bf5ca77SDevin Teskeio) : ${PROBE:=io:::start, io:::done} ;;
165bf5ca77SDevin Teske *) : ${PROBE:=io:::${PROFILE#io-}}
175bf5ca77SDevin Teskeesac
185bf5ca77SDevin Teske
195bf5ca77SDevin Teske############################################################ EVENT ACTION
205bf5ca77SDevin Teske
215bf5ca77SDevin Teske[ "$CUSTOM_TEST" ] || EVENT_TEST='this->devinfo.dev_name != ""'
225bf5ca77SDevin Teske
235bf5ca77SDevin Teske############################################################ ACTIONS
245bf5ca77SDevin Teske
255bf5ca77SDevin Teskeexec 9<<EOF
265bf5ca77SDevin Teskethis bufinfo_t	bufinfo;
275bf5ca77SDevin Teskethis devinfo_t	devinfo;
285bf5ca77SDevin Teskethis int	b_flags;
295bf5ca77SDevin Teskethis long	bio_length;
305bf5ca77SDevin Teskethis string	bio_cmd;
315bf5ca77SDevin Teskethis string	bio_flags;
325bf5ca77SDevin Teskethis string	device_entry;
335bf5ca77SDevin Teskethis string	device_if;
345bf5ca77SDevin Teskethis string	device_type;
355bf5ca77SDevin Teskethis string	flow;
365bf5ca77SDevin Teske
375bf5ca77SDevin Teskeinline string append_bio_flag[int flags, int flag] = this->bio_flags =
385bf5ca77SDevin Teske	strjoin(this->bio_flags,
395bf5ca77SDevin Teske	strjoin(this->bio_flags == "" ? "" : (flags & flag) == flag ? "|" : "",
405bf5ca77SDevin Teske		bio_flag_string[flags & flag]));
415bf5ca77SDevin Teske
425bf5ca77SDevin Teske$PROBE /(struct bio *)args[0] != NULL/ /* probe ID $ID */
435bf5ca77SDevin Teske{${TRACE:+
445bf5ca77SDevin Teske	printf("<$ID>");
455bf5ca77SDevin Teske}
465bf5ca77SDevin Teske	/*
475bf5ca77SDevin Teske	 * dtrace_io(4)
485bf5ca77SDevin Teske	 */
495bf5ca77SDevin Teske	this->flow = probefunc == "done" ? "<-" : "->";
505bf5ca77SDevin Teske
515bf5ca77SDevin Teske	/*
525bf5ca77SDevin Teske	 * struct bio *
535bf5ca77SDevin Teske	 */
545bf5ca77SDevin Teske	this->bufinfo = xlate <bufinfo_t> ((struct bio *)args[0]);
555bf5ca77SDevin Teske	this->bio_cmd = bio_cmd_string[(int)this->bufinfo.b_cmd];
565bf5ca77SDevin Teske	this->b_flags = (int)this->bufinfo.b_flags;
575bf5ca77SDevin Teske	this->bio_flags = bio_flag_string[this->b_flags & BIO_ERROR];
585bf5ca77SDevin Teske	this->bio_flags = strjoin(this->bio_flags, this->bufinfo.b_error ?
595bf5ca77SDevin Teske		strjoin(this->bio_flags == "" ?
605bf5ca77SDevin Teske			bio_flag_string[BIO_ERROR] : "",
615bf5ca77SDevin Teske			strjoin("#", lltostr(this->bufinfo.b_error))) :
625bf5ca77SDevin Teske		"");
635bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_DONE];
645bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_ONQUEUE];
655bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_ORDERED];
665bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_UNMAPPED];
675bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_TRANSIENT_MAPPING];
685bf5ca77SDevin Teske	append_bio_flag[this->b_flags, BIO_VLIST];
695bf5ca77SDevin Teske	this->bio_flags = this->bio_flags == "" ? "-" : this->bio_flags;
705bf5ca77SDevin Teske	this->bio_length = (long)this->bufinfo.b_bcount;
715bf5ca77SDevin Teske
725bf5ca77SDevin Teske	/*
735bf5ca77SDevin Teske	 * struct devstat *
745bf5ca77SDevin Teske	 */
755bf5ca77SDevin Teske	this->devinfo = xlate <devinfo_t> ((struct devstat *)args[1]);
765bf5ca77SDevin Teske	this->device_type = device_type[(int)this->devinfo.dev_type];
775bf5ca77SDevin Teske	this->device_if = device_if[(int)this->devinfo.dev_type];
785bf5ca77SDevin Teske	this->device_entry = strjoin(this->devinfo.dev_name,
795bf5ca77SDevin Teske		lltostr(this->devinfo.dev_minor));
805bf5ca77SDevin Teske}
815bf5ca77SDevin TeskeEOF
825bf5ca77SDevin TeskeACTIONS=$( cat <&9 )
835bf5ca77SDevin TeskeID=$(( $ID + 1 ))
845bf5ca77SDevin Teske
855bf5ca77SDevin Teske############################################################ EVENT DETAILS
865bf5ca77SDevin Teske
87*a061d970SDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then
885bf5ca77SDevin Teskeexec 9<<EOF
895bf5ca77SDevin Teske	/*
905bf5ca77SDevin Teske	 * Print disk I/O details
915bf5ca77SDevin Teske	 */
925bf5ca77SDevin Teske	printf("%s %s %s %s %s %s %d byte%s",
935bf5ca77SDevin Teske		this->flow,
945bf5ca77SDevin Teske		this->device_type,
955bf5ca77SDevin Teske		this->device_if,
965bf5ca77SDevin Teske		this->device_entry,
975bf5ca77SDevin Teske		this->bio_cmd,
985bf5ca77SDevin Teske		this->bio_flags,
995bf5ca77SDevin Teske		this->bio_length,
1005bf5ca77SDevin Teske		this->bio_length == 1 ? "" : "s");
1015bf5ca77SDevin TeskeEOF
1025bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 )
103*a061d970SDevin Teskefi
1045bf5ca77SDevin Teske
1055bf5ca77SDevin Teske################################################################################
1065bf5ca77SDevin Teske# END
1075bf5ca77SDevin Teske################################################################################
108