From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4ADAAC32771 for ; Wed, 22 Jan 2020 06:48:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1EC2D24673 for ; Wed, 22 Jan 2020 06:48:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728890AbgAVGsS (ORCPT ); Wed, 22 Jan 2020 01:48:18 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:51728 "EHLO mx0b-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725862AbgAVGsQ (ORCPT ); Wed, 22 Jan 2020 01:48:16 -0500 Received: from pps.filterd (m0127361.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00M6lwMF173395 for ; Wed, 22 Jan 2020 01:48:14 -0500 Received: from e06smtp03.uk.ibm.com (e06smtp03.uk.ibm.com [195.75.94.99]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xkwq8n37c-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 22 Jan 2020 01:48:09 -0500 Received: from localhost by e06smtp03.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 22 Jan 2020 06:47:47 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp03.uk.ibm.com (192.168.101.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 22 Jan 2020 06:47:44 -0000 Received: from d06av24.portsmouth.uk.ibm.com (mk.ibm.com [9.149.105.60]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00M6lgDE39452868 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 22 Jan 2020 06:47:42 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id ADB8B4203F; Wed, 22 Jan 2020 06:47:42 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 86C2042042; Wed, 22 Jan 2020 06:47:40 +0000 (GMT) Received: from localhost.in.ibm.com (unknown [9.124.35.61]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 22 Jan 2020 06:47:40 +0000 (GMT) From: Kajol Jain To: acme@kernel.org Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, kjain@linux.ibm.com, Alexander Shishkin , Andi Kleen , Jiri Olsa , Kan Liang , Peter Zijlstra , Jin Yao , Madhavan Srinivasan , Anju T Sudhakar , Ravi Bangoria Subject: [PATCH v2] tools/perf/metricgroup: Fix printing event names of metric group with multiple events incase of overlapping events Date: Wed, 22 Jan 2020 12:17:21 +0530 X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 20012206-0012-0000-0000-0000037F91A2 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012206-0013-0000-0000-000021BBD3BE Message-Id: <20200122064721.24276-1-kjain@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-17_05:2020-01-16,2020-01-17 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 malwarescore=0 suspectscore=1 phishscore=0 adultscore=0 priorityscore=1501 mlxscore=0 lowpriorityscore=0 mlxlogscore=999 impostorscore=0 spamscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001220061 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit f01642e4912b ("perf metricgroup: Support multiple events for metricgroup") introduced support for multiple events in a metric group. But with the current upstream, metric events names are not printed properly incase we try to run multiple metric groups with overlapping event. With current upstream version, incase of overlapping metric events issue is, we always start our comparision logic from start. So, the events which already matched with some metric group also take part in comparision logic. Because of that when we have overlapping events, we end up matching current metric group event with already matched one. For example, in skylake machine we have metric event CoreIPC and Instructions. Both of them need 'inst_retired.any' event value. As events in Instructions is subset of events in CoreIPC, they endup in pointing to same 'inst_retired.any' value. In skylake platform: command:# ./perf stat -M CoreIPC,Instructions -C 0 sleep 1 Performance counter stats for 'CPU(s) 0': 1,254,992,790 inst_retired.any # 1254992790.0 Instructions # 1.3 CoreIPC 977,172,805 cycles 1,254,992,756 inst_retired.any 1.000802596 seconds time elapsed command:# sudo ./perf stat -M UPI,IPC sleep 1 Performance counter stats for 'sleep 1': 948,650 uops_retired.retire_slots 866,182 inst_retired.any # 0.7 IPC 866,182 inst_retired.any 1,175,671 cpu_clk_unhalted.thread Patch fixes the issue by adding a new variable 'evlist_iter' in evlist itself to keep track of events which already matched with some group. It points to event in perf_evlist from where next match should start. Because we need to make sure, we match correct set of events belongs to corresponding metric group. With this patch: In skylake platform: command:# ./perf stat -M CoreIPC,Instructions -C 0 sleep 1 Performance counter stats for 'CPU(s) 0': 149,481,533 inst_retired.any # 0.8 CoreIPC 186,244,218 cycles 149,479,362 inst_retired.any # 149479362.0 Instructions 1.001655885 seconds time elapsed command:# ./perf stat -M UPI,IPC sleep 1 Performance counter stats for 'CPU(s) 0': 16,858,849 uops_retired.retire_slots # 1.3 UPI 12,529,178 inst_retired.any 12,529,558 inst_retired.any # 0.3 IPC 39,936,071 cpu_clk_unhalted.thread 1.001413978 seconds time elapsed Signed-off-by: Kajol Jain Cc: Alexander Shishkin Cc: Andi Kleen Cc: Jiri Olsa Cc: Kan Liang Cc: Peter Zijlstra Cc: Jin Yao Cc: Madhavan Srinivasan Cc: Anju T Sudhakar Cc: Ravi Bangoria --- tools/perf/util/evlist.h | 1 + tools/perf/util/metricgroup.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) --- Changelog: v1 -> v2 - Rather then adding static variable in metricgroup.c, add a new variable in evlist itself with name 'evlist_iter' --- diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index f5bd5c386df1..255f872aee92 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -54,6 +54,7 @@ struct evlist { bool enabled; int id_pos; int is_pos; + int evlist_iter; u64 combined_sample_type; enum bkw_mmap_state bkw_mmap_state; struct { diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 02aee946b6c1..911fab4ac04b 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -96,10 +96,13 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist, struct evsel **metric_events) { struct evsel *ev; - int i = 0; + int i = 0, j = 0; bool leader_found; evlist__for_each_entry (perf_evlist, ev) { + j++; + if (j <= perf_evlist->evlist_iter) + continue; if (!strcmp(ev->name, ids[i])) { if (!metric_events[i]) metric_events[i] = ev; @@ -147,6 +150,8 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist, } } + perf_evlist->evlist_iter = j; + return metric_events[0]; } @@ -161,6 +166,13 @@ static int metricgroup__setup_events(struct list_head *groups, struct egroup *eg; struct evsel *evsel; + /* + * Reset the evlist_iter. This is needed because + * when we start comparision logic in find_evsel_group(), + * need to start it from very first event present in evlist. + */ + perf_evlist->evlist_iter = 0; + list_for_each_entry (eg, groups, nd) { struct evsel **metric_events; -- 2.21.0