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