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