1*359d5106SKoki Sanagi# Display a process of packets and processed time. 2*359d5106SKoki Sanagi# It helps us to investigate networking or network device. 3*359d5106SKoki Sanagi# 4*359d5106SKoki Sanagi# options 5*359d5106SKoki Sanagi# tx: show only tx chart 6*359d5106SKoki Sanagi# rx: show only rx chart 7*359d5106SKoki Sanagi# dev=: show only thing related to specified device 8*359d5106SKoki Sanagi# debug: work with debug mode. It shows buffer status. 9*359d5106SKoki Sanagi 10*359d5106SKoki Sanagiimport os 11*359d5106SKoki Sanagiimport sys 12*359d5106SKoki Sanagi 13*359d5106SKoki Sanagisys.path.append(os.environ['PERF_EXEC_PATH'] + \ 14*359d5106SKoki Sanagi '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 15*359d5106SKoki Sanagi 16*359d5106SKoki Sanagifrom perf_trace_context import * 17*359d5106SKoki Sanagifrom Core import * 18*359d5106SKoki Sanagifrom Util import * 19*359d5106SKoki Sanagi 20*359d5106SKoki Sanagiall_event_list = []; # insert all tracepoint event related with this script 21*359d5106SKoki Sanagiirq_dic = {}; # key is cpu and value is a list which stacks irqs 22*359d5106SKoki Sanagi # which raise NET_RX softirq 23*359d5106SKoki Sanaginet_rx_dic = {}; # key is cpu and value include time of NET_RX softirq-entry 24*359d5106SKoki Sanagi # and a list which stacks receive 25*359d5106SKoki Sanagireceive_hunk_list = []; # a list which include a sequence of receive events 26*359d5106SKoki Sanagirx_skb_list = []; # received packet list for matching 27*359d5106SKoki Sanagi # skb_copy_datagram_iovec 28*359d5106SKoki Sanagi 29*359d5106SKoki Sanagibuffer_budget = 65536; # the budget of rx_skb_list, tx_queue_list and 30*359d5106SKoki Sanagi # tx_xmit_list 31*359d5106SKoki Sanagiof_count_rx_skb_list = 0; # overflow count 32*359d5106SKoki Sanagi 33*359d5106SKoki Sanagitx_queue_list = []; # list of packets which pass through dev_queue_xmit 34*359d5106SKoki Sanagiof_count_tx_queue_list = 0; # overflow count 35*359d5106SKoki Sanagi 36*359d5106SKoki Sanagitx_xmit_list = []; # list of packets which pass through dev_hard_start_xmit 37*359d5106SKoki Sanagiof_count_tx_xmit_list = 0; # overflow count 38*359d5106SKoki Sanagi 39*359d5106SKoki Sanagitx_free_list = []; # list of packets which is freed 40*359d5106SKoki Sanagi 41*359d5106SKoki Sanagi# options 42*359d5106SKoki Sanagishow_tx = 0; 43*359d5106SKoki Sanagishow_rx = 0; 44*359d5106SKoki Sanagidev = 0; # store a name of device specified by option "dev=" 45*359d5106SKoki Sanagidebug = 0; 46*359d5106SKoki Sanagi 47*359d5106SKoki Sanagi# indices of event_info tuple 48*359d5106SKoki SanagiEINFO_IDX_NAME= 0 49*359d5106SKoki SanagiEINFO_IDX_CONTEXT=1 50*359d5106SKoki SanagiEINFO_IDX_CPU= 2 51*359d5106SKoki SanagiEINFO_IDX_TIME= 3 52*359d5106SKoki SanagiEINFO_IDX_PID= 4 53*359d5106SKoki SanagiEINFO_IDX_COMM= 5 54*359d5106SKoki Sanagi 55*359d5106SKoki Sanagi# Calculate a time interval(msec) from src(nsec) to dst(nsec) 56*359d5106SKoki Sanagidef diff_msec(src, dst): 57*359d5106SKoki Sanagi return (dst - src) / 1000000.0 58*359d5106SKoki Sanagi 59*359d5106SKoki Sanagi# Display a process of transmitting a packet 60*359d5106SKoki Sanagidef print_transmit(hunk): 61*359d5106SKoki Sanagi if dev != 0 and hunk['dev'].find(dev) < 0: 62*359d5106SKoki Sanagi return 63*359d5106SKoki Sanagi print "%7s %5d %6d.%06dsec %12.3fmsec %12.3fmsec" % \ 64*359d5106SKoki Sanagi (hunk['dev'], hunk['len'], 65*359d5106SKoki Sanagi nsecs_secs(hunk['queue_t']), 66*359d5106SKoki Sanagi nsecs_nsecs(hunk['queue_t'])/1000, 67*359d5106SKoki Sanagi diff_msec(hunk['queue_t'], hunk['xmit_t']), 68*359d5106SKoki Sanagi diff_msec(hunk['xmit_t'], hunk['free_t'])) 69*359d5106SKoki Sanagi 70*359d5106SKoki Sanagi# Format for displaying rx packet processing 71*359d5106SKoki SanagiPF_IRQ_ENTRY= " irq_entry(+%.3fmsec irq=%d:%s)" 72*359d5106SKoki SanagiPF_SOFT_ENTRY=" softirq_entry(+%.3fmsec)" 73*359d5106SKoki SanagiPF_NAPI_POLL= " napi_poll_exit(+%.3fmsec %s)" 74*359d5106SKoki SanagiPF_JOINT= " |" 75*359d5106SKoki SanagiPF_WJOINT= " | |" 76*359d5106SKoki SanagiPF_NET_RECV= " |---netif_receive_skb(+%.3fmsec skb=%x len=%d)" 77*359d5106SKoki SanagiPF_NET_RX= " |---netif_rx(+%.3fmsec skb=%x)" 78*359d5106SKoki SanagiPF_CPY_DGRAM= " | skb_copy_datagram_iovec(+%.3fmsec %d:%s)" 79*359d5106SKoki SanagiPF_KFREE_SKB= " | kfree_skb(+%.3fmsec location=%x)" 80*359d5106SKoki SanagiPF_CONS_SKB= " | consume_skb(+%.3fmsec)" 81*359d5106SKoki Sanagi 82*359d5106SKoki Sanagi# Display a process of received packets and interrputs associated with 83*359d5106SKoki Sanagi# a NET_RX softirq 84*359d5106SKoki Sanagidef print_receive(hunk): 85*359d5106SKoki Sanagi show_hunk = 0 86*359d5106SKoki Sanagi irq_list = hunk['irq_list'] 87*359d5106SKoki Sanagi cpu = irq_list[0]['cpu'] 88*359d5106SKoki Sanagi base_t = irq_list[0]['irq_ent_t'] 89*359d5106SKoki Sanagi # check if this hunk should be showed 90*359d5106SKoki Sanagi if dev != 0: 91*359d5106SKoki Sanagi for i in range(len(irq_list)): 92*359d5106SKoki Sanagi if irq_list[i]['name'].find(dev) >= 0: 93*359d5106SKoki Sanagi show_hunk = 1 94*359d5106SKoki Sanagi break 95*359d5106SKoki Sanagi else: 96*359d5106SKoki Sanagi show_hunk = 1 97*359d5106SKoki Sanagi if show_hunk == 0: 98*359d5106SKoki Sanagi return 99*359d5106SKoki Sanagi 100*359d5106SKoki Sanagi print "%d.%06dsec cpu=%d" % \ 101*359d5106SKoki Sanagi (nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu) 102*359d5106SKoki Sanagi for i in range(len(irq_list)): 103*359d5106SKoki Sanagi print PF_IRQ_ENTRY % \ 104*359d5106SKoki Sanagi (diff_msec(base_t, irq_list[i]['irq_ent_t']), 105*359d5106SKoki Sanagi irq_list[i]['irq'], irq_list[i]['name']) 106*359d5106SKoki Sanagi print PF_JOINT 107*359d5106SKoki Sanagi irq_event_list = irq_list[i]['event_list'] 108*359d5106SKoki Sanagi for j in range(len(irq_event_list)): 109*359d5106SKoki Sanagi irq_event = irq_event_list[j] 110*359d5106SKoki Sanagi if irq_event['event'] == 'netif_rx': 111*359d5106SKoki Sanagi print PF_NET_RX % \ 112*359d5106SKoki Sanagi (diff_msec(base_t, irq_event['time']), 113*359d5106SKoki Sanagi irq_event['skbaddr']) 114*359d5106SKoki Sanagi print PF_JOINT 115*359d5106SKoki Sanagi print PF_SOFT_ENTRY % \ 116*359d5106SKoki Sanagi diff_msec(base_t, hunk['sirq_ent_t']) 117*359d5106SKoki Sanagi print PF_JOINT 118*359d5106SKoki Sanagi event_list = hunk['event_list'] 119*359d5106SKoki Sanagi for i in range(len(event_list)): 120*359d5106SKoki Sanagi event = event_list[i] 121*359d5106SKoki Sanagi if event['event_name'] == 'napi_poll': 122*359d5106SKoki Sanagi print PF_NAPI_POLL % \ 123*359d5106SKoki Sanagi (diff_msec(base_t, event['event_t']), event['dev']) 124*359d5106SKoki Sanagi if i == len(event_list) - 1: 125*359d5106SKoki Sanagi print "" 126*359d5106SKoki Sanagi else: 127*359d5106SKoki Sanagi print PF_JOINT 128*359d5106SKoki Sanagi else: 129*359d5106SKoki Sanagi print PF_NET_RECV % \ 130*359d5106SKoki Sanagi (diff_msec(base_t, event['event_t']), event['skbaddr'], 131*359d5106SKoki Sanagi event['len']) 132*359d5106SKoki Sanagi if 'comm' in event.keys(): 133*359d5106SKoki Sanagi print PF_WJOINT 134*359d5106SKoki Sanagi print PF_CPY_DGRAM % \ 135*359d5106SKoki Sanagi (diff_msec(base_t, event['comm_t']), 136*359d5106SKoki Sanagi event['pid'], event['comm']) 137*359d5106SKoki Sanagi elif 'handle' in event.keys(): 138*359d5106SKoki Sanagi print PF_WJOINT 139*359d5106SKoki Sanagi if event['handle'] == "kfree_skb": 140*359d5106SKoki Sanagi print PF_KFREE_SKB % \ 141*359d5106SKoki Sanagi (diff_msec(base_t, 142*359d5106SKoki Sanagi event['comm_t']), 143*359d5106SKoki Sanagi event['location']) 144*359d5106SKoki Sanagi elif event['handle'] == "consume_skb": 145*359d5106SKoki Sanagi print PF_CONS_SKB % \ 146*359d5106SKoki Sanagi diff_msec(base_t, 147*359d5106SKoki Sanagi event['comm_t']) 148*359d5106SKoki Sanagi print PF_JOINT 149*359d5106SKoki Sanagi 150*359d5106SKoki Sanagidef trace_begin(): 151*359d5106SKoki Sanagi global show_tx 152*359d5106SKoki Sanagi global show_rx 153*359d5106SKoki Sanagi global dev 154*359d5106SKoki Sanagi global debug 155*359d5106SKoki Sanagi 156*359d5106SKoki Sanagi for i in range(len(sys.argv)): 157*359d5106SKoki Sanagi if i == 0: 158*359d5106SKoki Sanagi continue 159*359d5106SKoki Sanagi arg = sys.argv[i] 160*359d5106SKoki Sanagi if arg == 'tx': 161*359d5106SKoki Sanagi show_tx = 1 162*359d5106SKoki Sanagi elif arg =='rx': 163*359d5106SKoki Sanagi show_rx = 1 164*359d5106SKoki Sanagi elif arg.find('dev=',0, 4) >= 0: 165*359d5106SKoki Sanagi dev = arg[4:] 166*359d5106SKoki Sanagi elif arg == 'debug': 167*359d5106SKoki Sanagi debug = 1 168*359d5106SKoki Sanagi if show_tx == 0 and show_rx == 0: 169*359d5106SKoki Sanagi show_tx = 1 170*359d5106SKoki Sanagi show_rx = 1 171*359d5106SKoki Sanagi 172*359d5106SKoki Sanagidef trace_end(): 173*359d5106SKoki Sanagi # order all events in time 174*359d5106SKoki Sanagi all_event_list.sort(lambda a,b :cmp(a[EINFO_IDX_TIME], 175*359d5106SKoki Sanagi b[EINFO_IDX_TIME])) 176*359d5106SKoki Sanagi # process all events 177*359d5106SKoki Sanagi for i in range(len(all_event_list)): 178*359d5106SKoki Sanagi event_info = all_event_list[i] 179*359d5106SKoki Sanagi name = event_info[EINFO_IDX_NAME] 180*359d5106SKoki Sanagi if name == 'irq__softirq_exit': 181*359d5106SKoki Sanagi handle_irq_softirq_exit(event_info) 182*359d5106SKoki Sanagi elif name == 'irq__softirq_entry': 183*359d5106SKoki Sanagi handle_irq_softirq_entry(event_info) 184*359d5106SKoki Sanagi elif name == 'irq__softirq_raise': 185*359d5106SKoki Sanagi handle_irq_softirq_raise(event_info) 186*359d5106SKoki Sanagi elif name == 'irq__irq_handler_entry': 187*359d5106SKoki Sanagi handle_irq_handler_entry(event_info) 188*359d5106SKoki Sanagi elif name == 'irq__irq_handler_exit': 189*359d5106SKoki Sanagi handle_irq_handler_exit(event_info) 190*359d5106SKoki Sanagi elif name == 'napi__napi_poll': 191*359d5106SKoki Sanagi handle_napi_poll(event_info) 192*359d5106SKoki Sanagi elif name == 'net__netif_receive_skb': 193*359d5106SKoki Sanagi handle_netif_receive_skb(event_info) 194*359d5106SKoki Sanagi elif name == 'net__netif_rx': 195*359d5106SKoki Sanagi handle_netif_rx(event_info) 196*359d5106SKoki Sanagi elif name == 'skb__skb_copy_datagram_iovec': 197*359d5106SKoki Sanagi handle_skb_copy_datagram_iovec(event_info) 198*359d5106SKoki Sanagi elif name == 'net__net_dev_queue': 199*359d5106SKoki Sanagi handle_net_dev_queue(event_info) 200*359d5106SKoki Sanagi elif name == 'net__net_dev_xmit': 201*359d5106SKoki Sanagi handle_net_dev_xmit(event_info) 202*359d5106SKoki Sanagi elif name == 'skb__kfree_skb': 203*359d5106SKoki Sanagi handle_kfree_skb(event_info) 204*359d5106SKoki Sanagi elif name == 'skb__consume_skb': 205*359d5106SKoki Sanagi handle_consume_skb(event_info) 206*359d5106SKoki Sanagi # display receive hunks 207*359d5106SKoki Sanagi if show_rx: 208*359d5106SKoki Sanagi for i in range(len(receive_hunk_list)): 209*359d5106SKoki Sanagi print_receive(receive_hunk_list[i]) 210*359d5106SKoki Sanagi # display transmit hunks 211*359d5106SKoki Sanagi if show_tx: 212*359d5106SKoki Sanagi print " dev len Qdisc " \ 213*359d5106SKoki Sanagi " netdevice free" 214*359d5106SKoki Sanagi for i in range(len(tx_free_list)): 215*359d5106SKoki Sanagi print_transmit(tx_free_list[i]) 216*359d5106SKoki Sanagi if debug: 217*359d5106SKoki Sanagi print "debug buffer status" 218*359d5106SKoki Sanagi print "----------------------------" 219*359d5106SKoki Sanagi print "xmit Qdisc:remain:%d overflow:%d" % \ 220*359d5106SKoki Sanagi (len(tx_queue_list), of_count_tx_queue_list) 221*359d5106SKoki Sanagi print "xmit netdevice:remain:%d overflow:%d" % \ 222*359d5106SKoki Sanagi (len(tx_xmit_list), of_count_tx_xmit_list) 223*359d5106SKoki Sanagi print "receive:remain:%d overflow:%d" % \ 224*359d5106SKoki Sanagi (len(rx_skb_list), of_count_rx_skb_list) 225*359d5106SKoki Sanagi 226*359d5106SKoki Sanagi# called from perf, when it finds a correspoinding event 227*359d5106SKoki Sanagidef irq__softirq_entry(name, context, cpu, sec, nsec, pid, comm, vec): 228*359d5106SKoki Sanagi if symbol_str("irq__softirq_entry", "vec", vec) != "NET_RX": 229*359d5106SKoki Sanagi return 230*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, vec) 231*359d5106SKoki Sanagi all_event_list.append(event_info) 232*359d5106SKoki Sanagi 233*359d5106SKoki Sanagidef irq__softirq_exit(name, context, cpu, sec, nsec, pid, comm, vec): 234*359d5106SKoki Sanagi if symbol_str("irq__softirq_entry", "vec", vec) != "NET_RX": 235*359d5106SKoki Sanagi return 236*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, vec) 237*359d5106SKoki Sanagi all_event_list.append(event_info) 238*359d5106SKoki Sanagi 239*359d5106SKoki Sanagidef irq__softirq_raise(name, context, cpu, sec, nsec, pid, comm, vec): 240*359d5106SKoki Sanagi if symbol_str("irq__softirq_entry", "vec", vec) != "NET_RX": 241*359d5106SKoki Sanagi return 242*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, vec) 243*359d5106SKoki Sanagi all_event_list.append(event_info) 244*359d5106SKoki Sanagi 245*359d5106SKoki Sanagidef irq__irq_handler_entry(name, context, cpu, sec, nsec, pid, comm, 246*359d5106SKoki Sanagi irq, irq_name): 247*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 248*359d5106SKoki Sanagi irq, irq_name) 249*359d5106SKoki Sanagi all_event_list.append(event_info) 250*359d5106SKoki Sanagi 251*359d5106SKoki Sanagidef irq__irq_handler_exit(name, context, cpu, sec, nsec, pid, comm, irq, ret): 252*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, irq, ret) 253*359d5106SKoki Sanagi all_event_list.append(event_info) 254*359d5106SKoki Sanagi 255*359d5106SKoki Sanagidef napi__napi_poll(name, context, cpu, sec, nsec, pid, comm, napi, dev_name): 256*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 257*359d5106SKoki Sanagi napi, dev_name) 258*359d5106SKoki Sanagi all_event_list.append(event_info) 259*359d5106SKoki Sanagi 260*359d5106SKoki Sanagidef net__netif_receive_skb(name, context, cpu, sec, nsec, pid, comm, skbaddr, 261*359d5106SKoki Sanagi skblen, dev_name): 262*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 263*359d5106SKoki Sanagi skbaddr, skblen, dev_name) 264*359d5106SKoki Sanagi all_event_list.append(event_info) 265*359d5106SKoki Sanagi 266*359d5106SKoki Sanagidef net__netif_rx(name, context, cpu, sec, nsec, pid, comm, skbaddr, 267*359d5106SKoki Sanagi skblen, dev_name): 268*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 269*359d5106SKoki Sanagi skbaddr, skblen, dev_name) 270*359d5106SKoki Sanagi all_event_list.append(event_info) 271*359d5106SKoki Sanagi 272*359d5106SKoki Sanagidef net__net_dev_queue(name, context, cpu, sec, nsec, pid, comm, 273*359d5106SKoki Sanagi skbaddr, skblen, dev_name): 274*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 275*359d5106SKoki Sanagi skbaddr, skblen, dev_name) 276*359d5106SKoki Sanagi all_event_list.append(event_info) 277*359d5106SKoki Sanagi 278*359d5106SKoki Sanagidef net__net_dev_xmit(name, context, cpu, sec, nsec, pid, comm, 279*359d5106SKoki Sanagi skbaddr, skblen, rc, dev_name): 280*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 281*359d5106SKoki Sanagi skbaddr, skblen, rc ,dev_name) 282*359d5106SKoki Sanagi all_event_list.append(event_info) 283*359d5106SKoki Sanagi 284*359d5106SKoki Sanagidef skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, 285*359d5106SKoki Sanagi skbaddr, protocol, location): 286*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 287*359d5106SKoki Sanagi skbaddr, protocol, location) 288*359d5106SKoki Sanagi all_event_list.append(event_info) 289*359d5106SKoki Sanagi 290*359d5106SKoki Sanagidef skb__consume_skb(name, context, cpu, sec, nsec, pid, comm, skbaddr): 291*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 292*359d5106SKoki Sanagi skbaddr) 293*359d5106SKoki Sanagi all_event_list.append(event_info) 294*359d5106SKoki Sanagi 295*359d5106SKoki Sanagidef skb__skb_copy_datagram_iovec(name, context, cpu, sec, nsec, pid, comm, 296*359d5106SKoki Sanagi skbaddr, skblen): 297*359d5106SKoki Sanagi event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, 298*359d5106SKoki Sanagi skbaddr, skblen) 299*359d5106SKoki Sanagi all_event_list.append(event_info) 300*359d5106SKoki Sanagi 301*359d5106SKoki Sanagidef handle_irq_handler_entry(event_info): 302*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, irq, irq_name) = event_info 303*359d5106SKoki Sanagi if cpu not in irq_dic.keys(): 304*359d5106SKoki Sanagi irq_dic[cpu] = [] 305*359d5106SKoki Sanagi irq_record = {'irq':irq, 'name':irq_name, 'cpu':cpu, 'irq_ent_t':time} 306*359d5106SKoki Sanagi irq_dic[cpu].append(irq_record) 307*359d5106SKoki Sanagi 308*359d5106SKoki Sanagidef handle_irq_handler_exit(event_info): 309*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, irq, ret) = event_info 310*359d5106SKoki Sanagi if cpu not in irq_dic.keys(): 311*359d5106SKoki Sanagi return 312*359d5106SKoki Sanagi irq_record = irq_dic[cpu].pop() 313*359d5106SKoki Sanagi if irq != irq_record['irq']: 314*359d5106SKoki Sanagi return 315*359d5106SKoki Sanagi irq_record.update({'irq_ext_t':time}) 316*359d5106SKoki Sanagi # if an irq doesn't include NET_RX softirq, drop. 317*359d5106SKoki Sanagi if 'event_list' in irq_record.keys(): 318*359d5106SKoki Sanagi irq_dic[cpu].append(irq_record) 319*359d5106SKoki Sanagi 320*359d5106SKoki Sanagidef handle_irq_softirq_raise(event_info): 321*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, vec) = event_info 322*359d5106SKoki Sanagi if cpu not in irq_dic.keys() \ 323*359d5106SKoki Sanagi or len(irq_dic[cpu]) == 0: 324*359d5106SKoki Sanagi return 325*359d5106SKoki Sanagi irq_record = irq_dic[cpu].pop() 326*359d5106SKoki Sanagi if 'event_list' in irq_record.keys(): 327*359d5106SKoki Sanagi irq_event_list = irq_record['event_list'] 328*359d5106SKoki Sanagi else: 329*359d5106SKoki Sanagi irq_event_list = [] 330*359d5106SKoki Sanagi irq_event_list.append({'time':time, 'event':'sirq_raise'}) 331*359d5106SKoki Sanagi irq_record.update({'event_list':irq_event_list}) 332*359d5106SKoki Sanagi irq_dic[cpu].append(irq_record) 333*359d5106SKoki Sanagi 334*359d5106SKoki Sanagidef handle_irq_softirq_entry(event_info): 335*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, vec) = event_info 336*359d5106SKoki Sanagi net_rx_dic[cpu] = {'sirq_ent_t':time, 'event_list':[]} 337*359d5106SKoki Sanagi 338*359d5106SKoki Sanagidef handle_irq_softirq_exit(event_info): 339*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, vec) = event_info 340*359d5106SKoki Sanagi irq_list = [] 341*359d5106SKoki Sanagi event_list = 0 342*359d5106SKoki Sanagi if cpu in irq_dic.keys(): 343*359d5106SKoki Sanagi irq_list = irq_dic[cpu] 344*359d5106SKoki Sanagi del irq_dic[cpu] 345*359d5106SKoki Sanagi if cpu in net_rx_dic.keys(): 346*359d5106SKoki Sanagi sirq_ent_t = net_rx_dic[cpu]['sirq_ent_t'] 347*359d5106SKoki Sanagi event_list = net_rx_dic[cpu]['event_list'] 348*359d5106SKoki Sanagi del net_rx_dic[cpu] 349*359d5106SKoki Sanagi if irq_list == [] or event_list == 0: 350*359d5106SKoki Sanagi return 351*359d5106SKoki Sanagi rec_data = {'sirq_ent_t':sirq_ent_t, 'sirq_ext_t':time, 352*359d5106SKoki Sanagi 'irq_list':irq_list, 'event_list':event_list} 353*359d5106SKoki Sanagi # merge information realted to a NET_RX softirq 354*359d5106SKoki Sanagi receive_hunk_list.append(rec_data) 355*359d5106SKoki Sanagi 356*359d5106SKoki Sanagidef handle_napi_poll(event_info): 357*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, napi, dev_name) = event_info 358*359d5106SKoki Sanagi if cpu in net_rx_dic.keys(): 359*359d5106SKoki Sanagi event_list = net_rx_dic[cpu]['event_list'] 360*359d5106SKoki Sanagi rec_data = {'event_name':'napi_poll', 361*359d5106SKoki Sanagi 'dev':dev_name, 'event_t':time} 362*359d5106SKoki Sanagi event_list.append(rec_data) 363*359d5106SKoki Sanagi 364*359d5106SKoki Sanagidef handle_netif_rx(event_info): 365*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, 366*359d5106SKoki Sanagi skbaddr, skblen, dev_name) = event_info 367*359d5106SKoki Sanagi if cpu not in irq_dic.keys() \ 368*359d5106SKoki Sanagi or len(irq_dic[cpu]) == 0: 369*359d5106SKoki Sanagi return 370*359d5106SKoki Sanagi irq_record = irq_dic[cpu].pop() 371*359d5106SKoki Sanagi if 'event_list' in irq_record.keys(): 372*359d5106SKoki Sanagi irq_event_list = irq_record['event_list'] 373*359d5106SKoki Sanagi else: 374*359d5106SKoki Sanagi irq_event_list = [] 375*359d5106SKoki Sanagi irq_event_list.append({'time':time, 'event':'netif_rx', 376*359d5106SKoki Sanagi 'skbaddr':skbaddr, 'skblen':skblen, 'dev_name':dev_name}) 377*359d5106SKoki Sanagi irq_record.update({'event_list':irq_event_list}) 378*359d5106SKoki Sanagi irq_dic[cpu].append(irq_record) 379*359d5106SKoki Sanagi 380*359d5106SKoki Sanagidef handle_netif_receive_skb(event_info): 381*359d5106SKoki Sanagi global of_count_rx_skb_list 382*359d5106SKoki Sanagi 383*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, 384*359d5106SKoki Sanagi skbaddr, skblen, dev_name) = event_info 385*359d5106SKoki Sanagi if cpu in net_rx_dic.keys(): 386*359d5106SKoki Sanagi rec_data = {'event_name':'netif_receive_skb', 387*359d5106SKoki Sanagi 'event_t':time, 'skbaddr':skbaddr, 'len':skblen} 388*359d5106SKoki Sanagi event_list = net_rx_dic[cpu]['event_list'] 389*359d5106SKoki Sanagi event_list.append(rec_data) 390*359d5106SKoki Sanagi rx_skb_list.insert(0, rec_data) 391*359d5106SKoki Sanagi if len(rx_skb_list) > buffer_budget: 392*359d5106SKoki Sanagi rx_skb_list.pop() 393*359d5106SKoki Sanagi of_count_rx_skb_list += 1 394*359d5106SKoki Sanagi 395*359d5106SKoki Sanagidef handle_net_dev_queue(event_info): 396*359d5106SKoki Sanagi global of_count_tx_queue_list 397*359d5106SKoki Sanagi 398*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, 399*359d5106SKoki Sanagi skbaddr, skblen, dev_name) = event_info 400*359d5106SKoki Sanagi skb = {'dev':dev_name, 'skbaddr':skbaddr, 'len':skblen, 'queue_t':time} 401*359d5106SKoki Sanagi tx_queue_list.insert(0, skb) 402*359d5106SKoki Sanagi if len(tx_queue_list) > buffer_budget: 403*359d5106SKoki Sanagi tx_queue_list.pop() 404*359d5106SKoki Sanagi of_count_tx_queue_list += 1 405*359d5106SKoki Sanagi 406*359d5106SKoki Sanagidef handle_net_dev_xmit(event_info): 407*359d5106SKoki Sanagi global of_count_tx_xmit_list 408*359d5106SKoki Sanagi 409*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, 410*359d5106SKoki Sanagi skbaddr, skblen, rc, dev_name) = event_info 411*359d5106SKoki Sanagi if rc == 0: # NETDEV_TX_OK 412*359d5106SKoki Sanagi for i in range(len(tx_queue_list)): 413*359d5106SKoki Sanagi skb = tx_queue_list[i] 414*359d5106SKoki Sanagi if skb['skbaddr'] == skbaddr: 415*359d5106SKoki Sanagi skb['xmit_t'] = time 416*359d5106SKoki Sanagi tx_xmit_list.insert(0, skb) 417*359d5106SKoki Sanagi del tx_queue_list[i] 418*359d5106SKoki Sanagi if len(tx_xmit_list) > buffer_budget: 419*359d5106SKoki Sanagi tx_xmit_list.pop() 420*359d5106SKoki Sanagi of_count_tx_xmit_list += 1 421*359d5106SKoki Sanagi return 422*359d5106SKoki Sanagi 423*359d5106SKoki Sanagidef handle_kfree_skb(event_info): 424*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, 425*359d5106SKoki Sanagi skbaddr, protocol, location) = event_info 426*359d5106SKoki Sanagi for i in range(len(tx_queue_list)): 427*359d5106SKoki Sanagi skb = tx_queue_list[i] 428*359d5106SKoki Sanagi if skb['skbaddr'] == skbaddr: 429*359d5106SKoki Sanagi del tx_queue_list[i] 430*359d5106SKoki Sanagi return 431*359d5106SKoki Sanagi for i in range(len(tx_xmit_list)): 432*359d5106SKoki Sanagi skb = tx_xmit_list[i] 433*359d5106SKoki Sanagi if skb['skbaddr'] == skbaddr: 434*359d5106SKoki Sanagi skb['free_t'] = time 435*359d5106SKoki Sanagi tx_free_list.append(skb) 436*359d5106SKoki Sanagi del tx_xmit_list[i] 437*359d5106SKoki Sanagi return 438*359d5106SKoki Sanagi for i in range(len(rx_skb_list)): 439*359d5106SKoki Sanagi rec_data = rx_skb_list[i] 440*359d5106SKoki Sanagi if rec_data['skbaddr'] == skbaddr: 441*359d5106SKoki Sanagi rec_data.update({'handle':"kfree_skb", 442*359d5106SKoki Sanagi 'comm':comm, 'pid':pid, 'comm_t':time}) 443*359d5106SKoki Sanagi del rx_skb_list[i] 444*359d5106SKoki Sanagi return 445*359d5106SKoki Sanagi 446*359d5106SKoki Sanagidef handle_consume_skb(event_info): 447*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, skbaddr) = event_info 448*359d5106SKoki Sanagi for i in range(len(tx_xmit_list)): 449*359d5106SKoki Sanagi skb = tx_xmit_list[i] 450*359d5106SKoki Sanagi if skb['skbaddr'] == skbaddr: 451*359d5106SKoki Sanagi skb['free_t'] = time 452*359d5106SKoki Sanagi tx_free_list.append(skb) 453*359d5106SKoki Sanagi del tx_xmit_list[i] 454*359d5106SKoki Sanagi return 455*359d5106SKoki Sanagi 456*359d5106SKoki Sanagidef handle_skb_copy_datagram_iovec(event_info): 457*359d5106SKoki Sanagi (name, context, cpu, time, pid, comm, skbaddr, skblen) = event_info 458*359d5106SKoki Sanagi for i in range(len(rx_skb_list)): 459*359d5106SKoki Sanagi rec_data = rx_skb_list[i] 460*359d5106SKoki Sanagi if skbaddr == rec_data['skbaddr']: 461*359d5106SKoki Sanagi rec_data.update({'handle':"skb_copy_datagram_iovec", 462*359d5106SKoki Sanagi 'comm':comm, 'pid':pid, 'comm_t':time}) 463*359d5106SKoki Sanagi del rx_skb_list[i] 464*359d5106SKoki Sanagi return 465