1ec1e6e6aSRavi Bangoria# SPDX-License-Identifier: GPL-2.0+ 2ec1e6e6aSRavi Bangoria# 3ec1e6e6aSRavi Bangoria# Copyright (C) 2018 Ravi Bangoria, IBM Corporation 4ec1e6e6aSRavi Bangoria# 5ec1e6e6aSRavi Bangoria# Hypervisor call statisics 6ec1e6e6aSRavi Bangoria 7*118af5bfSTony Jonesfrom __future__ import print_function 8*118af5bfSTony Jones 9ec1e6e6aSRavi Bangoriaimport os 10ec1e6e6aSRavi Bangoriaimport sys 11ec1e6e6aSRavi Bangoria 12ec1e6e6aSRavi Bangoriasys.path.append(os.environ['PERF_EXEC_PATH'] + \ 13ec1e6e6aSRavi Bangoria '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 14ec1e6e6aSRavi Bangoria 15ec1e6e6aSRavi Bangoriafrom perf_trace_context import * 16ec1e6e6aSRavi Bangoriafrom Core import * 17ec1e6e6aSRavi Bangoriafrom Util import * 18ec1e6e6aSRavi Bangoria 19ec1e6e6aSRavi Bangoria# output: { 20ec1e6e6aSRavi Bangoria# opcode: { 21ec1e6e6aSRavi Bangoria# 'min': minimum time nsec 22ec1e6e6aSRavi Bangoria# 'max': maximum time nsec 23ec1e6e6aSRavi Bangoria# 'time': average time nsec 24ec1e6e6aSRavi Bangoria# 'cnt': counter 25ec1e6e6aSRavi Bangoria# } ... 26ec1e6e6aSRavi Bangoria# } 27ec1e6e6aSRavi Bangoriaoutput = {} 28ec1e6e6aSRavi Bangoria 29ec1e6e6aSRavi Bangoria# d_enter: { 30ec1e6e6aSRavi Bangoria# cpu: { 31ec1e6e6aSRavi Bangoria# opcode: nsec 32ec1e6e6aSRavi Bangoria# } ... 33ec1e6e6aSRavi Bangoria# } 34ec1e6e6aSRavi Bangoriad_enter = {} 35ec1e6e6aSRavi Bangoria 36ec1e6e6aSRavi Bangoriahcall_table = { 37ec1e6e6aSRavi Bangoria 4: 'H_REMOVE', 38ec1e6e6aSRavi Bangoria 8: 'H_ENTER', 39ec1e6e6aSRavi Bangoria 12: 'H_READ', 40ec1e6e6aSRavi Bangoria 16: 'H_CLEAR_MOD', 41ec1e6e6aSRavi Bangoria 20: 'H_CLEAR_REF', 42ec1e6e6aSRavi Bangoria 24: 'H_PROTECT', 43ec1e6e6aSRavi Bangoria 28: 'H_GET_TCE', 44ec1e6e6aSRavi Bangoria 32: 'H_PUT_TCE', 45ec1e6e6aSRavi Bangoria 36: 'H_SET_SPRG0', 46ec1e6e6aSRavi Bangoria 40: 'H_SET_DABR', 47ec1e6e6aSRavi Bangoria 44: 'H_PAGE_INIT', 48ec1e6e6aSRavi Bangoria 48: 'H_SET_ASR', 49ec1e6e6aSRavi Bangoria 52: 'H_ASR_ON', 50ec1e6e6aSRavi Bangoria 56: 'H_ASR_OFF', 51ec1e6e6aSRavi Bangoria 60: 'H_LOGICAL_CI_LOAD', 52ec1e6e6aSRavi Bangoria 64: 'H_LOGICAL_CI_STORE', 53ec1e6e6aSRavi Bangoria 68: 'H_LOGICAL_CACHE_LOAD', 54ec1e6e6aSRavi Bangoria 72: 'H_LOGICAL_CACHE_STORE', 55ec1e6e6aSRavi Bangoria 76: 'H_LOGICAL_ICBI', 56ec1e6e6aSRavi Bangoria 80: 'H_LOGICAL_DCBF', 57ec1e6e6aSRavi Bangoria 84: 'H_GET_TERM_CHAR', 58ec1e6e6aSRavi Bangoria 88: 'H_PUT_TERM_CHAR', 59ec1e6e6aSRavi Bangoria 92: 'H_REAL_TO_LOGICAL', 60ec1e6e6aSRavi Bangoria 96: 'H_HYPERVISOR_DATA', 61ec1e6e6aSRavi Bangoria 100: 'H_EOI', 62ec1e6e6aSRavi Bangoria 104: 'H_CPPR', 63ec1e6e6aSRavi Bangoria 108: 'H_IPI', 64ec1e6e6aSRavi Bangoria 112: 'H_IPOLL', 65ec1e6e6aSRavi Bangoria 116: 'H_XIRR', 66ec1e6e6aSRavi Bangoria 120: 'H_MIGRATE_DMA', 67ec1e6e6aSRavi Bangoria 124: 'H_PERFMON', 68ec1e6e6aSRavi Bangoria 220: 'H_REGISTER_VPA', 69ec1e6e6aSRavi Bangoria 224: 'H_CEDE', 70ec1e6e6aSRavi Bangoria 228: 'H_CONFER', 71ec1e6e6aSRavi Bangoria 232: 'H_PROD', 72ec1e6e6aSRavi Bangoria 236: 'H_GET_PPP', 73ec1e6e6aSRavi Bangoria 240: 'H_SET_PPP', 74ec1e6e6aSRavi Bangoria 244: 'H_PURR', 75ec1e6e6aSRavi Bangoria 248: 'H_PIC', 76ec1e6e6aSRavi Bangoria 252: 'H_REG_CRQ', 77ec1e6e6aSRavi Bangoria 256: 'H_FREE_CRQ', 78ec1e6e6aSRavi Bangoria 260: 'H_VIO_SIGNAL', 79ec1e6e6aSRavi Bangoria 264: 'H_SEND_CRQ', 80ec1e6e6aSRavi Bangoria 272: 'H_COPY_RDMA', 81ec1e6e6aSRavi Bangoria 276: 'H_REGISTER_LOGICAL_LAN', 82ec1e6e6aSRavi Bangoria 280: 'H_FREE_LOGICAL_LAN', 83ec1e6e6aSRavi Bangoria 284: 'H_ADD_LOGICAL_LAN_BUFFER', 84ec1e6e6aSRavi Bangoria 288: 'H_SEND_LOGICAL_LAN', 85ec1e6e6aSRavi Bangoria 292: 'H_BULK_REMOVE', 86ec1e6e6aSRavi Bangoria 304: 'H_MULTICAST_CTRL', 87ec1e6e6aSRavi Bangoria 308: 'H_SET_XDABR', 88ec1e6e6aSRavi Bangoria 312: 'H_STUFF_TCE', 89ec1e6e6aSRavi Bangoria 316: 'H_PUT_TCE_INDIRECT', 90ec1e6e6aSRavi Bangoria 332: 'H_CHANGE_LOGICAL_LAN_MAC', 91ec1e6e6aSRavi Bangoria 336: 'H_VTERM_PARTNER_INFO', 92ec1e6e6aSRavi Bangoria 340: 'H_REGISTER_VTERM', 93ec1e6e6aSRavi Bangoria 344: 'H_FREE_VTERM', 94ec1e6e6aSRavi Bangoria 348: 'H_RESET_EVENTS', 95ec1e6e6aSRavi Bangoria 352: 'H_ALLOC_RESOURCE', 96ec1e6e6aSRavi Bangoria 356: 'H_FREE_RESOURCE', 97ec1e6e6aSRavi Bangoria 360: 'H_MODIFY_QP', 98ec1e6e6aSRavi Bangoria 364: 'H_QUERY_QP', 99ec1e6e6aSRavi Bangoria 368: 'H_REREGISTER_PMR', 100ec1e6e6aSRavi Bangoria 372: 'H_REGISTER_SMR', 101ec1e6e6aSRavi Bangoria 376: 'H_QUERY_MR', 102ec1e6e6aSRavi Bangoria 380: 'H_QUERY_MW', 103ec1e6e6aSRavi Bangoria 384: 'H_QUERY_HCA', 104ec1e6e6aSRavi Bangoria 388: 'H_QUERY_PORT', 105ec1e6e6aSRavi Bangoria 392: 'H_MODIFY_PORT', 106ec1e6e6aSRavi Bangoria 396: 'H_DEFINE_AQP1', 107ec1e6e6aSRavi Bangoria 400: 'H_GET_TRACE_BUFFER', 108ec1e6e6aSRavi Bangoria 404: 'H_DEFINE_AQP0', 109ec1e6e6aSRavi Bangoria 408: 'H_RESIZE_MR', 110ec1e6e6aSRavi Bangoria 412: 'H_ATTACH_MCQP', 111ec1e6e6aSRavi Bangoria 416: 'H_DETACH_MCQP', 112ec1e6e6aSRavi Bangoria 420: 'H_CREATE_RPT', 113ec1e6e6aSRavi Bangoria 424: 'H_REMOVE_RPT', 114ec1e6e6aSRavi Bangoria 428: 'H_REGISTER_RPAGES', 115ec1e6e6aSRavi Bangoria 432: 'H_DISABLE_AND_GETC', 116ec1e6e6aSRavi Bangoria 436: 'H_ERROR_DATA', 117ec1e6e6aSRavi Bangoria 440: 'H_GET_HCA_INFO', 118ec1e6e6aSRavi Bangoria 444: 'H_GET_PERF_COUNT', 119ec1e6e6aSRavi Bangoria 448: 'H_MANAGE_TRACE', 120ec1e6e6aSRavi Bangoria 468: 'H_FREE_LOGICAL_LAN_BUFFER', 121ec1e6e6aSRavi Bangoria 472: 'H_POLL_PENDING', 122ec1e6e6aSRavi Bangoria 484: 'H_QUERY_INT_STATE', 123ec1e6e6aSRavi Bangoria 580: 'H_ILLAN_ATTRIBUTES', 124ec1e6e6aSRavi Bangoria 592: 'H_MODIFY_HEA_QP', 125ec1e6e6aSRavi Bangoria 596: 'H_QUERY_HEA_QP', 126ec1e6e6aSRavi Bangoria 600: 'H_QUERY_HEA', 127ec1e6e6aSRavi Bangoria 604: 'H_QUERY_HEA_PORT', 128ec1e6e6aSRavi Bangoria 608: 'H_MODIFY_HEA_PORT', 129ec1e6e6aSRavi Bangoria 612: 'H_REG_BCMC', 130ec1e6e6aSRavi Bangoria 616: 'H_DEREG_BCMC', 131ec1e6e6aSRavi Bangoria 620: 'H_REGISTER_HEA_RPAGES', 132ec1e6e6aSRavi Bangoria 624: 'H_DISABLE_AND_GET_HEA', 133ec1e6e6aSRavi Bangoria 628: 'H_GET_HEA_INFO', 134ec1e6e6aSRavi Bangoria 632: 'H_ALLOC_HEA_RESOURCE', 135ec1e6e6aSRavi Bangoria 644: 'H_ADD_CONN', 136ec1e6e6aSRavi Bangoria 648: 'H_DEL_CONN', 137ec1e6e6aSRavi Bangoria 664: 'H_JOIN', 138ec1e6e6aSRavi Bangoria 676: 'H_VASI_STATE', 139ec1e6e6aSRavi Bangoria 688: 'H_ENABLE_CRQ', 140ec1e6e6aSRavi Bangoria 696: 'H_GET_EM_PARMS', 141ec1e6e6aSRavi Bangoria 720: 'H_SET_MPP', 142ec1e6e6aSRavi Bangoria 724: 'H_GET_MPP', 143ec1e6e6aSRavi Bangoria 748: 'H_HOME_NODE_ASSOCIATIVITY', 144ec1e6e6aSRavi Bangoria 756: 'H_BEST_ENERGY', 145ec1e6e6aSRavi Bangoria 764: 'H_XIRR_X', 146ec1e6e6aSRavi Bangoria 768: 'H_RANDOM', 147ec1e6e6aSRavi Bangoria 772: 'H_COP', 148ec1e6e6aSRavi Bangoria 788: 'H_GET_MPP_X', 149ec1e6e6aSRavi Bangoria 796: 'H_SET_MODE', 150ec1e6e6aSRavi Bangoria 61440: 'H_RTAS', 151ec1e6e6aSRavi Bangoria} 152ec1e6e6aSRavi Bangoria 153ec1e6e6aSRavi Bangoriadef hcall_table_lookup(opcode): 154*118af5bfSTony Jones if (opcode in hcall_table): 155ec1e6e6aSRavi Bangoria return hcall_table[opcode] 156ec1e6e6aSRavi Bangoria else: 157ec1e6e6aSRavi Bangoria return opcode 158ec1e6e6aSRavi Bangoria 159ec1e6e6aSRavi Bangoriaprint_ptrn = '%-28s%10s%10s%10s%10s' 160ec1e6e6aSRavi Bangoria 161ec1e6e6aSRavi Bangoriadef trace_end(): 162*118af5bfSTony Jones print(print_ptrn % ('hcall', 'count', 'min(ns)', 'max(ns)', 'avg(ns)')) 163*118af5bfSTony Jones print('-' * 68) 164ec1e6e6aSRavi Bangoria for opcode in output: 165ec1e6e6aSRavi Bangoria h_name = hcall_table_lookup(opcode) 166ec1e6e6aSRavi Bangoria time = output[opcode]['time'] 167ec1e6e6aSRavi Bangoria cnt = output[opcode]['cnt'] 168ec1e6e6aSRavi Bangoria min_t = output[opcode]['min'] 169ec1e6e6aSRavi Bangoria max_t = output[opcode]['max'] 170ec1e6e6aSRavi Bangoria 171*118af5bfSTony Jones print(print_ptrn % (h_name, cnt, min_t, max_t, time//cnt)) 172ec1e6e6aSRavi Bangoria 173ec1e6e6aSRavi Bangoriadef powerpc__hcall_exit(name, context, cpu, sec, nsec, pid, comm, callchain, 174ec1e6e6aSRavi Bangoria opcode, retval): 175*118af5bfSTony Jones if (cpu in d_enter and opcode in d_enter[cpu]): 176ec1e6e6aSRavi Bangoria diff = nsecs(sec, nsec) - d_enter[cpu][opcode] 177ec1e6e6aSRavi Bangoria 178*118af5bfSTony Jones if (opcode in output): 179ec1e6e6aSRavi Bangoria output[opcode]['time'] += diff 180ec1e6e6aSRavi Bangoria output[opcode]['cnt'] += 1 181ec1e6e6aSRavi Bangoria if (output[opcode]['min'] > diff): 182ec1e6e6aSRavi Bangoria output[opcode]['min'] = diff 183ec1e6e6aSRavi Bangoria if (output[opcode]['max'] < diff): 184ec1e6e6aSRavi Bangoria output[opcode]['max'] = diff 185ec1e6e6aSRavi Bangoria else: 186ec1e6e6aSRavi Bangoria output[opcode] = { 187ec1e6e6aSRavi Bangoria 'time': diff, 188ec1e6e6aSRavi Bangoria 'cnt': 1, 189ec1e6e6aSRavi Bangoria 'min': diff, 190ec1e6e6aSRavi Bangoria 'max': diff, 191ec1e6e6aSRavi Bangoria } 192ec1e6e6aSRavi Bangoria 193ec1e6e6aSRavi Bangoria del d_enter[cpu][opcode] 194ec1e6e6aSRavi Bangoria# else: 195*118af5bfSTony Jones# print("Can't find matching hcall_enter event. Ignoring sample") 196ec1e6e6aSRavi Bangoria 197ec1e6e6aSRavi Bangoriadef powerpc__hcall_entry(event_name, context, cpu, sec, nsec, pid, comm, 198ec1e6e6aSRavi Bangoria callchain, opcode): 199*118af5bfSTony Jones if (cpu in d_enter): 200ec1e6e6aSRavi Bangoria d_enter[cpu][opcode] = nsecs(sec, nsec) 201ec1e6e6aSRavi Bangoria else: 202ec1e6e6aSRavi Bangoria d_enter[cpu] = {opcode: nsecs(sec, nsec)} 203