Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp1910282ybf; Sun, 1 Mar 2020 21:25:38 -0800 (PST) X-Google-Smtp-Source: APXvYqwY8se4EaAmxQQCXIAqgMS0llF7JVe2WcLMuSR82GzKkeKFKl/uozAE+ENZ/sbfpxM4YQTQ X-Received: by 2002:a05:6808:8ec:: with SMTP id d12mr10724367oic.114.1583126738731; Sun, 01 Mar 2020 21:25:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583126738; cv=none; d=google.com; s=arc-20160816; b=CFAaiW7rOtcI4Ubea5FsjUftQqtCm2IUivLnMUBFd1pgzFJhBrqc7muq+XTBAKR6Xn t/1X4A8ibBay5fnCcOsSYm5scKxXJnWM28WZBeJTLt9CNAOJZrGdw9kyZusO+TFkhPOE /OBR/31rhP8DPziCT0ki+3G4MEcSgpVNuvq9oGMpMS7wKc16tADj01ywU8EuXvNqKmLK 359/Kvo1c86bnH6vg4uOII7AZR3i1G7jyowsWmr7ugZpDsUrqyD69EBX+Vgd7oicTdgu fC5yYT6LRBiR5oyhUedJJde0Z/kP1UddQKaJf2Yu+VD8JIL6xjh91MUw5qGt/6SfEzBd elkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:content-transfer-encoding :mime-version:references:in-reply-to:date:subject:cc:to:from; bh=IRqc/OjqYSyDb37+cKvB1JtVKa0IBKrNH+ijYSImKqw=; b=NGDHkT4ZVZf5r9nm9bmd5m+MXzXplb0xWT1QckBCsNF3kMQGlImOtMEKLKiEIn9+BF IrOtckfQqQJYGsOR6zQFvHDsD2bLkFBVYqeBoCSW9Vo73KO9+suTCgRlMsjd6f6fMgIy FVJ5XULGETd0AzJ0BRyR7UhW74W7dncM8RTI+Gx6mhyP1opbakfu5pccbvGW4EqMmOEa RUSdRBCIb1irPUXICf0mrKBSj0mjA+AXAOAWnMoHO5fhUWiY0USfRhGLrNy9XCKGq3FP xDsFAMwTyjdztvGAvqAKQIqEmfGyWa2R1VeInajQovyaR+nxE3d6gv5SeCdy8zJ1sVyr G+Hw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v15si5814619oth.307.2020.03.01.21.25.27; Sun, 01 Mar 2020 21:25:38 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727077AbgCBFYz (ORCPT + 99 others); Mon, 2 Mar 2020 00:24:55 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:21442 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726980AbgCBFYx (ORCPT ); Mon, 2 Mar 2020 00:24:53 -0500 Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 0225Ofv3011509 for ; Mon, 2 Mar 2020 00:24:52 -0500 Received: from e06smtp07.uk.ibm.com (e06smtp07.uk.ibm.com [195.75.94.103]) by mx0a-001b2d01.pphosted.com with ESMTP id 2yfhqp5uwq-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 02 Mar 2020 00:24:52 -0500 Received: from localhost by e06smtp07.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 2 Mar 2020 05:24:49 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp07.uk.ibm.com (192.168.101.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 2 Mar 2020 05:24:44 -0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 0225Ogi438994036 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 2 Mar 2020 05:24:42 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 753985204F; Mon, 2 Mar 2020 05:24:42 +0000 (GMT) Received: from bangoria.in.ibm.com (unknown [9.124.31.175]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 1F9A252050; Mon, 2 Mar 2020 05:24:38 +0000 (GMT) From: Ravi Bangoria To: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Cc: eranian@google.com, peterz@infradead.org, mpe@ellerman.id.au, paulus@samba.org, mingo@redhat.com, acme@kernel.org, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, adrian.hunter@intel.com, ak@linux.intel.com, kan.liang@linux.intel.com, alexey.budankov@linux.intel.com, yao.jin@linux.intel.com, robert.richter@amd.com, kim.phillips@amd.com, maddy@linux.ibm.com, ravi.bangoria@linux.ibm.com, Madhavan Srinivasan Subject: [RFC 07/11] perf hazard: Functions to convert generic hazard data to arch specific string Date: Mon, 2 Mar 2020 10:53:51 +0530 X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200302052355.36365-1-ravi.bangoria@linux.ibm.com> References: <20200302052355.36365-1-ravi.bangoria@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 20030205-0028-0000-0000-000003DFC476 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20030205-0029-0000-0000-000024A4EBF6 Message-Id: <20200302052355.36365-8-ravi.bangoria@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-03-02_01:2020-02-28,2020-03-02 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 phishscore=0 priorityscore=1501 clxscore=1015 lowpriorityscore=0 bulkscore=0 impostorscore=0 malwarescore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2001150001 definitions=main-2003020039 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Madhavan Srinivasan Kernel provides pipeline hazard data in struct perf_pipeline_haz_data format. Add code to convert this data into meaningful string which can be shown in perf report (followup patch). Introduce tools/perf/utils/hazard directory which will contains arch specific directories. Under arch specific directory, add arch specific logic that will be called by generic code. This directory structure is introduced to enable cross-arch reporting. Signed-off-by: Madhavan Srinivasan Signed-off-by: Ravi Bangoria --- tools/perf/util/Build | 2 + tools/perf/util/hazard.c | 51 +++++++ tools/perf/util/hazard.h | 14 ++ tools/perf/util/hazard/Build | 1 + .../util/hazard/powerpc/perf_pipeline_haz.h | 80 ++++++++++ .../perf/util/hazard/powerpc/powerpc_hazard.c | 142 ++++++++++++++++++ .../perf/util/hazard/powerpc/powerpc_hazard.h | 14 ++ 7 files changed, 304 insertions(+) create mode 100644 tools/perf/util/hazard.c create mode 100644 tools/perf/util/hazard.h create mode 100644 tools/perf/util/hazard/Build create mode 100644 tools/perf/util/hazard/powerpc/perf_pipeline_haz.h create mode 100644 tools/perf/util/hazard/powerpc/powerpc_hazard.c create mode 100644 tools/perf/util/hazard/powerpc/powerpc_hazard.h diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 07da6c790b63..f5e1b7d79b6d 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -118,6 +118,7 @@ perf-y += parse-regs-options.o perf-y += term.o perf-y += help-unknown-cmd.o perf-y += mem-events.o +perf-y += hazard.o perf-y += vsprintf.o perf-y += units.o perf-y += time-utils.o @@ -153,6 +154,7 @@ perf-$(CONFIG_LIBUNWIND_AARCH64) += libunwind/arm64.o perf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o perf-y += scripting-engines/ +perf-y += hazard/ perf-$(CONFIG_ZLIB) += zlib.o perf-$(CONFIG_LZMA) += lzma.o diff --git a/tools/perf/util/hazard.c b/tools/perf/util/hazard.c new file mode 100644 index 000000000000..db235b26b266 --- /dev/null +++ b/tools/perf/util/hazard.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include "hazard/powerpc/powerpc_hazard.h" + +const char *perf_haz__itype_str(u8 itype, const char *arch) +{ + if (!strncmp(arch, "powerpc", strlen("powerpc"))) + return powerpc__haz__itype_str(itype); + + return "-"; +} + +const char *perf_haz__icache_str(u8 icache, const char *arch) +{ + if (!strncmp(arch, "powerpc", strlen("powerpc"))) + return powerpc__haz__icache_str(icache); + + return "-"; +} + +const char *perf_haz__hstage_str(u8 hstage, const char *arch) +{ + if (!strncmp(arch, "powerpc", strlen("powerpc"))) + return powerpc__haz__hstage_str(hstage); + + return "-"; +} + +const char *perf_haz__hreason_str(u8 hstage, u8 hreason, const char *arch) +{ + if (!strncmp(arch, "powerpc", strlen("powerpc"))) + return powerpc__haz__hreason_str(hstage, hreason); + + return "-"; +} + +const char *perf_haz__sstage_str(u8 sstage, const char *arch) +{ + if (!strncmp(arch, "powerpc", strlen("powerpc"))) + return powerpc__haz__sstage_str(sstage); + + return "-"; +} + +const char *perf_haz__sreason_str(u8 sstage, u8 sreason, const char *arch) +{ + if (!strncmp(arch, "powerpc", strlen("powerpc"))) + return powerpc__haz__sreason_str(sstage, sreason); + + return "-"; +} diff --git a/tools/perf/util/hazard.h b/tools/perf/util/hazard.h new file mode 100644 index 000000000000..eab4190e056a --- /dev/null +++ b/tools/perf/util/hazard.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __PERF_HAZARD_H +#define __PERF_HAZARD_H + +#include "sort.h" + +const char *perf_haz__itype_str(u8 itype, const char *arch); +const char *perf_haz__icache_str(u8 icache, const char *arch); +const char *perf_haz__hstage_str(u8 hstage, const char *arch); +const char *perf_haz__hreason_str(u8 hstage, u8 hreason, const char *arch); +const char *perf_haz__sstage_str(u8 sstage, const char *arch); +const char *perf_haz__sreason_str(u8 sstage, u8 sreason, const char *arch); + +#endif /* __PERF_HAZARD_H */ diff --git a/tools/perf/util/hazard/Build b/tools/perf/util/hazard/Build new file mode 100644 index 000000000000..314c5e316383 --- /dev/null +++ b/tools/perf/util/hazard/Build @@ -0,0 +1 @@ +perf-y += powerpc/powerpc_hazard.o diff --git a/tools/perf/util/hazard/powerpc/perf_pipeline_haz.h b/tools/perf/util/hazard/powerpc/perf_pipeline_haz.h new file mode 100644 index 000000000000..de8857ec31dd --- /dev/null +++ b/tools/perf/util/hazard/powerpc/perf_pipeline_haz.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_ASM_POWERPC_PERF_PIPELINE_HAZ_H +#define _UAPI_ASM_POWERPC_PERF_PIPELINE_HAZ_H + +enum perf_inst_type { + PERF_HAZ__ITYPE_LOAD = 1, + PERF_HAZ__ITYPE_STORE, + PERF_HAZ__ITYPE_BRANCH, + PERF_HAZ__ITYPE_FP, + PERF_HAZ__ITYPE_FX, + PERF_HAZ__ITYPE_CR_OR_SC, +}; + +enum perf_inst_cache { + PERF_HAZ__ICACHE_L1_HIT = 1, + PERF_HAZ__ICACHE_L2_HIT, + PERF_HAZ__ICACHE_L3_HIT, + PERF_HAZ__ICACHE_L3_MISS, +}; + +enum perf_pipeline_stage { + PERF_HAZ__PIPE_STAGE_IFU = 1, + PERF_HAZ__PIPE_STAGE_IDU, + PERF_HAZ__PIPE_STAGE_ISU, + PERF_HAZ__PIPE_STAGE_LSU, + PERF_HAZ__PIPE_STAGE_BRU, + PERF_HAZ__PIPE_STAGE_FXU, + PERF_HAZ__PIPE_STAGE_FPU, + PERF_HAZ__PIPE_STAGE_VSU, + PERF_HAZ__PIPE_STAGE_OTHER, +}; + +enum perf_haz_bru_reason { + PERF_HAZ__HAZ_BRU_MPRED_DIR = 1, + PERF_HAZ__HAZ_BRU_MPRED_TA, +}; + +enum perf_haz_isu_reason { + PERF_HAZ__HAZ_ISU_SRC = 1, + PERF_HAZ__HAZ_ISU_COL = 1, +}; + +enum perf_haz_lsu_reason { + PERF_HAZ__HAZ_LSU_ERAT_MISS = 1, + PERF_HAZ__HAZ_LSU_LMQ, + PERF_HAZ__HAZ_LSU_LHS, + PERF_HAZ__HAZ_LSU_MPRED, + PERF_HAZ__HAZ_DERAT_MISS, + PERF_HAZ__HAZ_LSU_LMQ_DERAT_MISS, + PERF_HAZ__HAZ_LSU_LHS_DERAT_MISS, + PERF_HAZ__HAZ_LSU_MPRED_DERAT_MISS, +}; + +enum perf_stall_lsu_reason { + PERF_HAZ__STALL_LSU_DCACHE_MISS = 1, + PERF_HAZ__STALL_LSU_LD_FIN, + PERF_HAZ__STALL_LSU_ST_FWD, + PERF_HAZ__STALL_LSU_ST, +}; + +enum perf_stall_fxu_reason { + PERF_HAZ__STALL_FXU_MC = 1, + PERF_HAZ__STALL_FXU_FC, +}; + +enum perf_stall_bru_reason { + PERF_HAZ__STALL_BRU_FIN_MPRED = 1, + PERF_HAZ__STALL_BRU_FC, +}; + +enum perf_stall_vsu_reason { + PERF_HAZ__STALL_VSU_MC = 1, + PERF_HAZ__STALL_VSU_FC, +}; + +enum perf_stall_other_reason { + PERF_HAZ__STALL_NTC, +}; + +#endif /* _UAPI_ASM_POWERPC_PERF_PIPELINE_HAZ_H */ diff --git a/tools/perf/util/hazard/powerpc/powerpc_hazard.c b/tools/perf/util/hazard/powerpc/powerpc_hazard.c new file mode 100644 index 000000000000..dcb95b769367 --- /dev/null +++ b/tools/perf/util/hazard/powerpc/powerpc_hazard.c @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include "hazard.h" +#include "powerpc_hazard.h" +#include "perf_pipeline_haz.h" + +static const char *haz_inst_type[] = { + "-", + "Load", + "Store", + "Branch", + "Floating Point", + "Fixed point", + "Condition Register/System Call", +}; + +const char *powerpc__haz__itype_str(u8 itype) +{ + return haz_inst_type[itype]; +} + +static const char *haz_inst_cache[] = { + "-", + "L1 hit", + "L2 hit", + "L3 hit", + "L3 Miss" +}; + +const char *powerpc__haz__icache_str(u8 icache) +{ + return haz_inst_cache[icache]; +} + +static const char *pipeline_stages[] = { + "-", + "IFU", + "IDU", + "ISU", + "LSU", + "BRU", + "FXU", + "FPU", + "VSU", +}; + +const char *powerpc__haz__hstage_str(u8 hstage) +{ + return pipeline_stages[hstage]; +} + +static const char *haz_bru_reason[] = { + "-", + "Direction", + "Target Address", +}; + +static const char *haz_isu_reason[] = { + "-", + "Source Unavailable", + "Resource Collision", +}; + +static const char *haz_lsu_reason[] = { + "-", + "ERAT Miss", + "LMQ Full", + "Load Hit Store", + "Mispredict", + "DERAT Miss", + "LMQ Full, DERAT Miss", + "Load Hit Store, DERAT Miss", + "Mispredict, DERAT Miss", +}; + +const char *powerpc__haz__hreason_str(u8 hstage, u8 hreason) +{ + switch (hstage) { + case PERF_HAZ__PIPE_STAGE_BRU: + return haz_bru_reason[hreason]; + case PERF_HAZ__PIPE_STAGE_LSU: + return haz_lsu_reason[hreason]; + case PERF_HAZ__PIPE_STAGE_ISU: + return haz_isu_reason[hreason]; + default: + return "-"; + } +} + +const char *powerpc__haz__sstage_str(u8 sstage) +{ + return pipeline_stages[sstage]; +} + +static const char *stall_lsu_reason[] = { + "-", + "Dcache_miss", + "Load fin", + "Store fwd", + "Store", +}; + +static const char *stall_fxu_reason[] = { + "-", + "Multi cycle", + "Fixed cycle", +}; + +static const char *stall_bru_reason[] = { + "-", + "Finish Mispredict", + "Fixed cycle", +}; + +static const char *stall_vsu_reason[] = { + "-", + "Multi cycle", + "Fixed cycle", +}; + +static const char *stall_other_reason[] = { + "-", + "Marked fin before NTC", +}; + +const char *powerpc__haz__sreason_str(u8 sstage, u8 sreason) +{ + switch (sstage) { + case PERF_HAZ__PIPE_STAGE_LSU: + return stall_lsu_reason[sreason]; + case PERF_HAZ__PIPE_STAGE_FXU: + return stall_fxu_reason[sreason]; + case PERF_HAZ__PIPE_STAGE_BRU: + return stall_bru_reason[sreason]; + case PERF_HAZ__PIPE_STAGE_VSU: + return stall_vsu_reason[sreason]; + case PERF_HAZ__PIPE_STAGE_OTHER: + return stall_other_reason[sreason]; + default: + return "-"; + } +} diff --git a/tools/perf/util/hazard/powerpc/powerpc_hazard.h b/tools/perf/util/hazard/powerpc/powerpc_hazard.h new file mode 100644 index 000000000000..f13f8f3cd10d --- /dev/null +++ b/tools/perf/util/hazard/powerpc/powerpc_hazard.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __PERF_POWERPC_HAZARD_H +#define __PERF_POWERPC_HAZARD_H + +#include "hazard.h" + +const char *powerpc__haz__itype_str(u8 itype); +const char *powerpc__haz__icache_str(u8 icache); +const char *powerpc__haz__hstage_str(u8 hstage); +const char *powerpc__haz__hreason_str(u8 hstage, u8 hreason); +const char *powerpc__haz__sstage_str(u8 sstage); +const char *powerpc__haz__sreason_str(u8 sstage, u8 sreason); + +#endif /* __PERF_POWERPC_HAZARD_H */ -- 2.21.1