#!/usr/sbin/dtrace -qs #pragma D option dynvarsize=4m #pragma D option cleanrate=251Hz enum tx_event { DIRECT = 1, INDIRECT = 2 }; dtrace:::BEGIN { printf("Ready. Press ^C to stop..."); } fbt:if_cxgb:cxgb_transmit:entry { self->caller = DIRECT; self->n_encap = 0; } fbt:if_cxgb:cxgb_start_locked:entry /self->caller == 0/ { self->caller = INDIRECT; self->n_encap = 0; } fbt:if_cxgb:t3_encap:entry { self->n_encap++; } fbt:if_cxgb:cxgb_start_locked:return, fbt:if_cxgb:cxgb_transmit:return /self->caller != 0 && self->n_encap/ { this->p1 = self->caller == DIRECT ? "if_transmit" : "timeout/wdog"; @t3encap[this->p1] = quantize(self->n_encap); } fbt:if_cxgb:cxgb_start_locked:return, fbt:if_cxgb:cxgb_transmit:return /self->caller != 0/ { this->p1 = self->caller == DIRECT ? "if_transmit" : "timeout/wdog"; this->p2 = self->n_encap ? "tx" : "--"; @txevents[this->p1, this->p2] = count(); self->caller = 0; self->n_encap = 0; } dtrace:::END { printa("%s\t[%s]:\t%@u\n", @txevents); printa("%s -> t3_encap: %@u\n", @t3encap); }