| .. | .. |
|---|
| 8 | 8 | # dev=: show only thing related to specified device |
|---|
| 9 | 9 | # debug: work with debug mode. It shows buffer status. |
|---|
| 10 | 10 | |
|---|
| 11 | +from __future__ import print_function |
|---|
| 12 | + |
|---|
| 11 | 13 | import os |
|---|
| 12 | 14 | import sys |
|---|
| 13 | 15 | |
|---|
| .. | .. |
|---|
| 17 | 19 | from perf_trace_context import * |
|---|
| 18 | 20 | from Core import * |
|---|
| 19 | 21 | from Util import * |
|---|
| 22 | +from functools import cmp_to_key |
|---|
| 20 | 23 | |
|---|
| 21 | 24 | all_event_list = []; # insert all tracepoint event related with this script |
|---|
| 22 | 25 | irq_dic = {}; # key is cpu and value is a list which stacks irqs |
|---|
| .. | .. |
|---|
| 61 | 64 | def print_transmit(hunk): |
|---|
| 62 | 65 | if dev != 0 and hunk['dev'].find(dev) < 0: |
|---|
| 63 | 66 | return |
|---|
| 64 | | - print "%7s %5d %6d.%06dsec %12.3fmsec %12.3fmsec" % \ |
|---|
| 67 | + print("%7s %5d %6d.%06dsec %12.3fmsec %12.3fmsec" % |
|---|
| 65 | 68 | (hunk['dev'], hunk['len'], |
|---|
| 66 | 69 | nsecs_secs(hunk['queue_t']), |
|---|
| 67 | 70 | nsecs_nsecs(hunk['queue_t'])/1000, |
|---|
| 68 | 71 | diff_msec(hunk['queue_t'], hunk['xmit_t']), |
|---|
| 69 | | - diff_msec(hunk['xmit_t'], hunk['free_t'])) |
|---|
| 72 | + diff_msec(hunk['xmit_t'], hunk['free_t']))) |
|---|
| 70 | 73 | |
|---|
| 71 | 74 | # Format for displaying rx packet processing |
|---|
| 72 | 75 | PF_IRQ_ENTRY= " irq_entry(+%.3fmsec irq=%d:%s)" |
|---|
| .. | .. |
|---|
| 98 | 101 | if show_hunk == 0: |
|---|
| 99 | 102 | return |
|---|
| 100 | 103 | |
|---|
| 101 | | - print "%d.%06dsec cpu=%d" % \ |
|---|
| 102 | | - (nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu) |
|---|
| 104 | + print("%d.%06dsec cpu=%d" % |
|---|
| 105 | + (nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu)) |
|---|
| 103 | 106 | for i in range(len(irq_list)): |
|---|
| 104 | | - print PF_IRQ_ENTRY % \ |
|---|
| 107 | + print(PF_IRQ_ENTRY % |
|---|
| 105 | 108 | (diff_msec(base_t, irq_list[i]['irq_ent_t']), |
|---|
| 106 | | - irq_list[i]['irq'], irq_list[i]['name']) |
|---|
| 107 | | - print PF_JOINT |
|---|
| 109 | + irq_list[i]['irq'], irq_list[i]['name'])) |
|---|
| 110 | + print(PF_JOINT) |
|---|
| 108 | 111 | irq_event_list = irq_list[i]['event_list'] |
|---|
| 109 | 112 | for j in range(len(irq_event_list)): |
|---|
| 110 | 113 | irq_event = irq_event_list[j] |
|---|
| 111 | 114 | if irq_event['event'] == 'netif_rx': |
|---|
| 112 | | - print PF_NET_RX % \ |
|---|
| 115 | + print(PF_NET_RX % |
|---|
| 113 | 116 | (diff_msec(base_t, irq_event['time']), |
|---|
| 114 | | - irq_event['skbaddr']) |
|---|
| 115 | | - print PF_JOINT |
|---|
| 116 | | - print PF_SOFT_ENTRY % \ |
|---|
| 117 | | - diff_msec(base_t, hunk['sirq_ent_t']) |
|---|
| 118 | | - print PF_JOINT |
|---|
| 117 | + irq_event['skbaddr'])) |
|---|
| 118 | + print(PF_JOINT) |
|---|
| 119 | + print(PF_SOFT_ENTRY % |
|---|
| 120 | + diff_msec(base_t, hunk['sirq_ent_t'])) |
|---|
| 121 | + print(PF_JOINT) |
|---|
| 119 | 122 | event_list = hunk['event_list'] |
|---|
| 120 | 123 | for i in range(len(event_list)): |
|---|
| 121 | 124 | event = event_list[i] |
|---|
| 122 | 125 | if event['event_name'] == 'napi_poll': |
|---|
| 123 | | - print PF_NAPI_POLL % \ |
|---|
| 124 | | - (diff_msec(base_t, event['event_t']), event['dev']) |
|---|
| 126 | + print(PF_NAPI_POLL % |
|---|
| 127 | + (diff_msec(base_t, event['event_t']), |
|---|
| 128 | + event['dev'])) |
|---|
| 125 | 129 | if i == len(event_list) - 1: |
|---|
| 126 | | - print "" |
|---|
| 130 | + print("") |
|---|
| 127 | 131 | else: |
|---|
| 128 | | - print PF_JOINT |
|---|
| 132 | + print(PF_JOINT) |
|---|
| 129 | 133 | else: |
|---|
| 130 | | - print PF_NET_RECV % \ |
|---|
| 131 | | - (diff_msec(base_t, event['event_t']), event['skbaddr'], |
|---|
| 132 | | - event['len']) |
|---|
| 134 | + print(PF_NET_RECV % |
|---|
| 135 | + (diff_msec(base_t, event['event_t']), |
|---|
| 136 | + event['skbaddr'], |
|---|
| 137 | + event['len'])) |
|---|
| 133 | 138 | if 'comm' in event.keys(): |
|---|
| 134 | | - print PF_WJOINT |
|---|
| 135 | | - print PF_CPY_DGRAM % \ |
|---|
| 139 | + print(PF_WJOINT) |
|---|
| 140 | + print(PF_CPY_DGRAM % |
|---|
| 136 | 141 | (diff_msec(base_t, event['comm_t']), |
|---|
| 137 | | - event['pid'], event['comm']) |
|---|
| 142 | + event['pid'], event['comm'])) |
|---|
| 138 | 143 | elif 'handle' in event.keys(): |
|---|
| 139 | | - print PF_WJOINT |
|---|
| 144 | + print(PF_WJOINT) |
|---|
| 140 | 145 | if event['handle'] == "kfree_skb": |
|---|
| 141 | | - print PF_KFREE_SKB % \ |
|---|
| 146 | + print(PF_KFREE_SKB % |
|---|
| 142 | 147 | (diff_msec(base_t, |
|---|
| 143 | 148 | event['comm_t']), |
|---|
| 144 | | - event['location']) |
|---|
| 149 | + event['location'])) |
|---|
| 145 | 150 | elif event['handle'] == "consume_skb": |
|---|
| 146 | | - print PF_CONS_SKB % \ |
|---|
| 151 | + print(PF_CONS_SKB % |
|---|
| 147 | 152 | diff_msec(base_t, |
|---|
| 148 | | - event['comm_t']) |
|---|
| 149 | | - print PF_JOINT |
|---|
| 153 | + event['comm_t'])) |
|---|
| 154 | + print(PF_JOINT) |
|---|
| 150 | 155 | |
|---|
| 151 | 156 | def trace_begin(): |
|---|
| 152 | 157 | global show_tx |
|---|
| .. | .. |
|---|
| 172 | 177 | |
|---|
| 173 | 178 | def trace_end(): |
|---|
| 174 | 179 | # order all events in time |
|---|
| 175 | | - all_event_list.sort(lambda a,b :cmp(a[EINFO_IDX_TIME], |
|---|
| 176 | | - b[EINFO_IDX_TIME])) |
|---|
| 180 | + all_event_list.sort(key=cmp_to_key(lambda a,b :a[EINFO_IDX_TIME] < b[EINFO_IDX_TIME])) |
|---|
| 177 | 181 | # process all events |
|---|
| 178 | 182 | for i in range(len(all_event_list)): |
|---|
| 179 | 183 | event_info = all_event_list[i] |
|---|
| .. | .. |
|---|
| 210 | 214 | print_receive(receive_hunk_list[i]) |
|---|
| 211 | 215 | # display transmit hunks |
|---|
| 212 | 216 | if show_tx: |
|---|
| 213 | | - print " dev len Qdisc " \ |
|---|
| 214 | | - " netdevice free" |
|---|
| 217 | + print(" dev len Qdisc " |
|---|
| 218 | + " netdevice free") |
|---|
| 215 | 219 | for i in range(len(tx_free_list)): |
|---|
| 216 | 220 | print_transmit(tx_free_list[i]) |
|---|
| 217 | 221 | if debug: |
|---|
| 218 | | - print "debug buffer status" |
|---|
| 219 | | - print "----------------------------" |
|---|
| 220 | | - print "xmit Qdisc:remain:%d overflow:%d" % \ |
|---|
| 221 | | - (len(tx_queue_list), of_count_tx_queue_list) |
|---|
| 222 | | - print "xmit netdevice:remain:%d overflow:%d" % \ |
|---|
| 223 | | - (len(tx_xmit_list), of_count_tx_xmit_list) |
|---|
| 224 | | - print "receive:remain:%d overflow:%d" % \ |
|---|
| 225 | | - (len(rx_skb_list), of_count_rx_skb_list) |
|---|
| 222 | + print("debug buffer status") |
|---|
| 223 | + print("----------------------------") |
|---|
| 224 | + print("xmit Qdisc:remain:%d overflow:%d" % |
|---|
| 225 | + (len(tx_queue_list), of_count_tx_queue_list)) |
|---|
| 226 | + print("xmit netdevice:remain:%d overflow:%d" % |
|---|
| 227 | + (len(tx_xmit_list), of_count_tx_xmit_list)) |
|---|
| 228 | + print("receive:remain:%d overflow:%d" % |
|---|
| 229 | + (len(rx_skb_list), of_count_rx_skb_list)) |
|---|
| 226 | 230 | |
|---|
| 227 | 231 | # called from perf, when it finds a correspoinding event |
|---|
| 228 | 232 | def irq__softirq_entry(name, context, cpu, sec, nsec, pid, comm, callchain, vec): |
|---|
| .. | .. |
|---|
| 254 | 258 | all_event_list.append(event_info) |
|---|
| 255 | 259 | |
|---|
| 256 | 260 | def napi__napi_poll(name, context, cpu, sec, nsec, pid, comm, callchain, napi, |
|---|
| 257 | | - dev_name, work=None, budget=None): |
|---|
| 261 | + dev_name, work=None, budget=None): |
|---|
| 258 | 262 | event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, |
|---|
| 259 | 263 | napi, dev_name, work, budget) |
|---|
| 260 | 264 | all_event_list.append(event_info) |
|---|
| .. | .. |
|---|
| 351 | 355 | if irq_list == [] or event_list == 0: |
|---|
| 352 | 356 | return |
|---|
| 353 | 357 | rec_data = {'sirq_ent_t':sirq_ent_t, 'sirq_ext_t':time, |
|---|
| 354 | | - 'irq_list':irq_list, 'event_list':event_list} |
|---|
| 358 | + 'irq_list':irq_list, 'event_list':event_list} |
|---|
| 355 | 359 | # merge information realted to a NET_RX softirq |
|---|
| 356 | 360 | receive_hunk_list.append(rec_data) |
|---|
| 357 | 361 | |
|---|
| .. | .. |
|---|
| 388 | 392 | skbaddr, skblen, dev_name) = event_info |
|---|
| 389 | 393 | if cpu in net_rx_dic.keys(): |
|---|
| 390 | 394 | rec_data = {'event_name':'netif_receive_skb', |
|---|
| 391 | | - 'event_t':time, 'skbaddr':skbaddr, 'len':skblen} |
|---|
| 395 | + 'event_t':time, 'skbaddr':skbaddr, 'len':skblen} |
|---|
| 392 | 396 | event_list = net_rx_dic[cpu]['event_list'] |
|---|
| 393 | 397 | event_list.append(rec_data) |
|---|
| 394 | 398 | rx_skb_list.insert(0, rec_data) |
|---|