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