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