From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AFA4C64EC4 for ; Wed, 8 Mar 2023 08:18:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229952AbjCHISG (ORCPT ); Wed, 8 Mar 2023 03:18:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229636AbjCHIR7 (ORCPT ); Wed, 8 Mar 2023 03:17:59 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 594EF12BC6 for ; Wed, 8 Mar 2023 00:17:56 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id m6-20020a056902118600b00aeb1e3dbd1bso16686444ybu.9 for ; Wed, 08 Mar 2023 00:17:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263475; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=ywTh5n03SqFTSvl6jepwvheFrqPaSHAy7v4KxsLV2lY=; b=k37Zel3K78y2RXeX59p9IX3jO1BCWDMXFQICKa5aOp8uyNc9Fo6TSxvZTfud5WfZmy bbuEA9vKQXt/45E7yOe1rPGuM+mMZdsmRRn6Id24WjXl2K6d9t2tSkTCAdqZo8MPrtHH LtIotovSED/S9C5a83fKPCgCqx08g01zJw1PTmySborNq9XHGGd6XMIu6CoAvgc5cngS GNosj4nFEwQ5YhrGUTIMThG5lmhFeM90/L4ua5aOEMLxBkujfvKftxEGP/ZaMcaTm1GN NABl3um2vEo77k4AqR8GYMwWxISH9w59rrhsKaQKcGR37VGDjVOrdvYfEpXIoQ3zQCiQ FiXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263475; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ywTh5n03SqFTSvl6jepwvheFrqPaSHAy7v4KxsLV2lY=; b=dZBa8V2KwQohDPVlO1CD1TUmHRCDqHUTX3vEKeWfv/8Wp3lWqDmwW5lQbTHq9hykHJ hCb6HecuUU9iCmlxaqRavc0Tm9wIlOjp9AJhlT2J38elkl8eN41epJNLTIabVB2iKhVY 6RjYYE1ylc8i/gnHnxs7s5T88YpNgb6on5Y0bSDR5UpyzdABz9yqWhti9QVSWIklK357 /280rHeF4lJs8S/N0Nz+4wYcOgEWtXiu6n4G3HRwU0ZWS5swCn0l+I5yxmT+63DSqhGZ GfXdPUCrYCk010cyeXXOeVViuvV9PH9PUWZWDEOTq1W8hpFl023JIWchNMx3qbC24gcM 37kQ== X-Gm-Message-State: AO0yUKX3miIAroIK0fI0L/UzWDFi7vZh2TUhUSCM1NxD/cQpzydyinKa 0vzo4i306+fjgnIaEiqhDH3+IoG5g+y0 X-Google-Smtp-Source: AK7set+/+vEn8fMSc0dc71hwtQ6ZSPMUQDWUafdkCj5lAKVUx8HRElKYsfX5hn/Cg6AXKK1+0RRVejmsbE/f X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:542:0:b0:a67:c976:c910 with SMTP id r2-20020a5b0542000000b00a67c976c910mr8271656ybp.7.1678263475634; Wed, 08 Mar 2023 00:17:55 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:21 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-2-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 01/11] libperf evlist: Avoid a use of evsel idx From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Setting the leader iterates the list, so rather than use idx (which may be changed through list reordering) just count the elements and set afterwards. Signed-off-by: Ian Rogers Reviewed-by: John Garry --- tools/lib/perf/evlist.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c index 61b637f29b82..2d6121e89ccb 100644 --- a/tools/lib/perf/evlist.c +++ b/tools/lib/perf/evlist.c @@ -687,15 +687,14 @@ perf_evlist__next_mmap(struct perf_evlist *evlist, st= ruct perf_mmap *map, =20 void __perf_evlist__set_leader(struct list_head *list, struct perf_evsel *= leader) { - struct perf_evsel *first, *last, *evsel; - - first =3D list_first_entry(list, struct perf_evsel, node); - last =3D list_last_entry(list, struct perf_evsel, node); - - leader->nr_members =3D last->idx - first->idx + 1; + struct perf_evsel *evsel; + int n =3D 0; =20 - __perf_evlist__for_each_entry(list, evsel) + __perf_evlist__for_each_entry(list, evsel) { evsel->leader =3D leader; + n++; + } + leader->nr_members =3D n; } =20 void perf_evlist__set_leader(struct perf_evlist *evlist) --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3B0FC678D5 for ; Wed, 8 Mar 2023 08:18:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230075AbjCHISL (ORCPT ); Wed, 8 Mar 2023 03:18:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33874 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230052AbjCHISG (ORCPT ); Wed, 8 Mar 2023 03:18:06 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A79DA5FE for ; Wed, 8 Mar 2023 00:18:04 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-53865bdc1b1so163088967b3.16 for ; Wed, 08 Mar 2023 00:18:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263483; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=dvqLbFbIa5Th4hLVJzIhGZ3VgrtC26zZgF3M8vwaoio=; b=PjnUeRwk9Flf5/KgWTPUHPhH1Ksd8NChwAqNNyKs3hT2VJ+j8t84vRp08y/phCC/3n Dq1CoTyHkTLSMh7RCIznqMyHpfko9YaK3uC2hxljieaD0TZ3saXHKv07rr5LGQirmsvR 8z4eHHGsX8zUisVsnHcKYNf3TslDxRCqhGUaSvjLruJv9nHy9vOto/hLbtERz2H+ST01 I1x+C44Sq4bVRaZ4PgY3siaL5mzf59AFQvlXUsRNIfWsgtteIZpFK8r4iccq9SsWd7kD 6V2OR2BLoMNB12b55Jz/qKGiOSZo0vn/oFmabWvdRvgIe2h8Ab66rhSXwO1QRvtS5icu LV4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263483; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dvqLbFbIa5Th4hLVJzIhGZ3VgrtC26zZgF3M8vwaoio=; b=vnBAMbEfJZ3DuvEVk9wnWXIcnjAVsVJk3T1fplNkCDWPJ/GrP4GFIL0KUNoaiZSc23 vQs0U4AuzF8mYFSHyLU2VvothGsJRcycNtJoByGo4TfLwwiESDij3jGSyTgoYVREWJ4I MYWL6upMGNwOfK7E7P8CA1WIPN8ngQHpgGi64FkRHEJgqYBgnCbbQ4FzmsnE8lNduaNw SIW0n5k2qN1vElZCg5+XAxUt/JAOr5zqlji/SsbhLBcexYx2I8Cr0xq1i9lJBxJ8O35Y P9YTO0QAfoEmmNayscJ4D6y1phq2Gw4Qk3dIq3gN6XLG6VIwQlxcvdzEv2Dxjnj4f32l i4rQ== X-Gm-Message-State: AO0yUKUD8TUVvJhypQnXN2YvUhMrZo+w/I/A9BzfXefhopFq4cGfzeMj g6SQypintOZq+LeqKcNNGM/UJrDJCd2W X-Google-Smtp-Source: AK7set8sUjOKoa5f+EMHlB+KYfOPxPp735B6lo22IR78tMM7/iFbITr44EyzpBv8HaNOBVWz7gZMCvPbq5GL X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:308:0:b0:90d:af77:9ca6 with SMTP id j8-20020a5b0308000000b0090daf779ca6mr10538713ybp.7.1678263483246; Wed, 08 Mar 2023 00:18:03 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:22 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-3-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 02/11] perf stat: Don't remove all grouped events when CPU maps disagree From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If the events in an evlist's CPU map differ then the entire group is removed. For example: ``` $ perf stat -e '{imc_free_running/data_read/,imc_free_running/data_write/,c= s}' -a sleep 1 WARNING: grouped events cpus do not match, disabling group: anon group { imc_free_running/data_read/, imc_free_running/data_write/, c= s } ``` Change the behavior so that just the events not matching the leader are removed. So in the example above, just 'cs' will be removed. Modify the warning so that it is produced once for each group, rather than once for the entire evlist. Shrink the scope and size of the warning text buffer. Signed-off-by: Ian Rogers --- tools/perf/builtin-stat.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index d70b1ec88594..5c12ae5efce5 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -181,14 +181,13 @@ static bool cpus_map_matched(struct evsel *a, struct = evsel *b) =20 static void evlist__check_cpu_maps(struct evlist *evlist) { - struct evsel *evsel, *pos, *leader; - char buf[1024]; + struct evsel *evsel, *warned_leader =3D NULL; =20 if (evlist__has_hybrid(evlist)) evlist__warn_hybrid_group(evlist); =20 evlist__for_each_entry(evlist, evsel) { - leader =3D evsel__leader(evsel); + struct evsel *leader =3D evsel__leader(evsel); =20 /* Check that leader matches cpus with each member. */ if (leader =3D=3D evsel) @@ -197,19 +196,26 @@ static void evlist__check_cpu_maps(struct evlist *evl= ist) continue; =20 /* If there's mismatch disable the group and warn user. */ - WARN_ONCE(1, "WARNING: grouped events cpus do not match, disabling group= :\n"); - evsel__group_desc(leader, buf, sizeof(buf)); - pr_warning(" %s\n", buf); - + if (warned_leader !=3D leader) { + char buf[200]; + + pr_warning("WARNING: grouped events cpus do not match.\n" + "Events with CPUs not matching the leader will " + "be removed from the group.\n"); + evsel__group_desc(leader, buf, sizeof(buf)); + pr_warning(" %s\n", buf); + warned_leader =3D leader; + } if (verbose > 0) { + char buf[200]; + cpu_map__snprint(leader->core.cpus, buf, sizeof(buf)); pr_warning(" %s: %s\n", leader->name, buf); cpu_map__snprint(evsel->core.cpus, buf, sizeof(buf)); pr_warning(" %s: %s\n", evsel->name, buf); } =20 - for_each_group_evsel(pos, leader) - evsel__remove_from_group(pos, leader); + evsel__remove_from_group(evsel, leader); } } =20 --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BA2DFC64EC4 for ; Wed, 8 Mar 2023 08:18:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230095AbjCHIS2 (ORCPT ); Wed, 8 Mar 2023 03:18:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34176 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230092AbjCHIST (ORCPT ); Wed, 8 Mar 2023 03:18:19 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 936127F01A for ; Wed, 8 Mar 2023 00:18:11 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-536a5a0b6e3so164531807b3.10 for ; Wed, 08 Mar 2023 00:18:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263490; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=sLp16thdoL8gYxkkfhRZgItEDw/VHlYRuSQJ2A/KjWw=; b=EfW+9a47KBIdziTM7x7a2ANP1WlRWe9rDGoGTPnoi9oLeCZbdrYqEUBp/iMW01A+HW O6ai2+XCJRNw/O1LxcmNlCxYhzfwqZM8q7gVlkWJYtboZ3LosTlkrP3/3/RutYVouUHG IT5nKQq6fKEZXQBj3nBbFiJTmYv64TUl6SeNfOrqrMzj6QVE8c9AK5gPOH+MV2bHeFJe kWrTlcYhqi7GPk2+ExxcE26UsPYaaSBeo5SYQm3eHV9cB3R1dTON3A6BwHQMWbHfyQyd uoiqH8jEKGJCwdAbTz81jSEfW9eb5PszlU0MMLkKFXZAPg1eJvWeRoVbShcJftGbyBOQ fe1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263490; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=sLp16thdoL8gYxkkfhRZgItEDw/VHlYRuSQJ2A/KjWw=; b=eCpyCaqjfix5GaJy80Ocq7XLlV4ID6CN3pu6hAF8IhCog/3mCmjCkBNq+vxwZFrjf3 IOUjECVlZWsGVFiDsInBpDouuuhTxTy6VNNhJtffMJdSEgyOBISCW8mAfCEAmZqgOqbF HehatJy823yz6EbOyfNTb2JNyPE41inTj/aeg+9BCf2KRwO+3y717ftcjIZt75r1tAlW UFnWk4GX70faC/YTG2aIX5eFRReordbwYOcILQT45IqKPR+9sJJFkbBBqQNIaeXrUGyU BN1N1fD6my293XxMC536hybL+UvRdT7r69kxOsRpnmQLHya1AitM+hecN3vJRswQ3gbf lV9A== X-Gm-Message-State: AO0yUKWI7k2PneLexVh8duEBUgVfYg+VLLp0Nz5/VPD/uV4E2G4oX9pU d19JJIv8zwDNNtUUX9YPO5tF7w/fQrcT X-Google-Smtp-Source: AK7set/r6knPTbdZZ65XOastihxReoqy7J+DgQeV11VF8N93mA6AZ2m+HNStQQOI5vnPLMDQCu62VB0J1Apk X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a25:e90b:0:b0:9fc:e3d7:d60f with SMTP id n11-20020a25e90b000000b009fce3d7d60fmr7943980ybd.5.1678263490719; Wed, 08 Mar 2023 00:18:10 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:23 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-4-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 03/11] perf record: Early auxtrace initialization before event parsing From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This allows event parsing to use the evsel__is_aux_event function, which is important when determining event grouping. Signed-off-by: Ian Rogers --- tools/perf/arch/x86/util/auxtrace.c | 17 +++++++++++++---- tools/perf/builtin-record.c | 6 ++++++ tools/perf/util/auxtrace.h | 2 ++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/tools/perf/arch/x86/util/auxtrace.c b/tools/perf/arch/x86/util= /auxtrace.c index 3da506e13f49..de1e4842ea2e 100644 --- a/tools/perf/arch/x86/util/auxtrace.c +++ b/tools/perf/arch/x86/util/auxtrace.c @@ -15,6 +15,19 @@ #include "../../../util/intel-bts.h" #include "../../../util/evlist.h" =20 +void auxtrace__early_init(void) +{ + struct perf_pmu *intel_pt_pmu; + struct perf_pmu *intel_bts_pmu; + + intel_pt_pmu =3D perf_pmu__find(INTEL_PT_PMU_NAME); + if (intel_pt_pmu) + intel_pt_pmu->auxtrace =3D true; + intel_bts_pmu =3D perf_pmu__find(INTEL_BTS_PMU_NAME); + if (intel_bts_pmu) + intel_bts_pmu->auxtrace =3D true; +} + static struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist, int *err) @@ -26,11 +39,7 @@ struct auxtrace_record *auxtrace_record__init_intel(stru= ct evlist *evlist, bool found_bts =3D false; =20 intel_pt_pmu =3D perf_pmu__find(INTEL_PT_PMU_NAME); - if (intel_pt_pmu) - intel_pt_pmu->auxtrace =3D true; intel_bts_pmu =3D perf_pmu__find(INTEL_BTS_PMU_NAME); - if (intel_bts_pmu) - intel_bts_pmu->auxtrace =3D true; =20 evlist__for_each_entry(evlist, evsel) { if (intel_pt_pmu && evsel->core.attr.type =3D=3D intel_pt_pmu->type) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 8374117e66f6..a0870c076dc0 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -3940,6 +3940,10 @@ static int record__init_thread_masks(struct record *= rec) return ret; } =20 +__weak void auxtrace__early_init(void) +{ +} + int cmd_record(int argc, const char **argv) { int err; @@ -3985,6 +3989,8 @@ int cmd_record(int argc, const char **argv) if (err) return err; =20 + auxtrace__early_init(); + argc =3D parse_options(argc, argv, record_options, record_usage, PARSE_OPT_STOP_AT_NON_OPTION); if (quiet) diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h index 29eb82dff574..49a86aa6ac94 100644 --- a/tools/perf/util/auxtrace.h +++ b/tools/perf/util/auxtrace.h @@ -457,6 +457,8 @@ struct addr_filters { =20 struct auxtrace_cache; =20 +void auxtrace__early_init(void); + #ifdef HAVE_AUXTRACE_SUPPORT =20 u64 compat_auxtrace_mmap__read_head(struct auxtrace_mmap *mm); --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2D817C64EC4 for ; Wed, 8 Mar 2023 08:18:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230104AbjCHISn (ORCPT ); Wed, 8 Mar 2023 03:18:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33876 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230076AbjCHIS1 (ORCPT ); Wed, 8 Mar 2023 03:18:27 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8FD944A1D9 for ; Wed, 8 Mar 2023 00:18:19 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id d7-20020a25adc7000000b00953ffdfbe1aso17247996ybe.23 for ; Wed, 08 Mar 2023 00:18:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263498; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=pBjmM/9ZxcY4QPw1OT563S/xkYBM1O7yZVKEKyXWS5g=; b=pxEIKL3PPwlLN25TpuV0eautgYwV0o0aW2grlqQeTcfwjmIZQil6pJYUPMEAxU4Srb 7+OwVGY8HDpmBsBFFS+oKiq/0OnJFSw3yr+fvEmx9wepn6Q1dHpQdhJpbeK8gd9PVEHK 4FBPWrwDUUadtk0Gdf3tDQ5Ed66djl1JBTDVZxfvgA4m504KL7o9Ra8UxQIuntd+6DlH n5XFdEsf43PQ7RZhOnb6wys4naGaG31RZel3b39NTMP6PcWfVhy7V7ay9lC06kgXCsPt pgrINEKblHASyMrd53gusCR6hN9faCsRSq43QRhNT9OJKncHrUeoxMP+H1ZNWZhsUpSK 6ndg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263498; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=pBjmM/9ZxcY4QPw1OT563S/xkYBM1O7yZVKEKyXWS5g=; b=OKSrv4+E7G7I5gyDILg5gdSh6VewsfLTJIUpYSdqbGexc11IwAfLOIoCThP2clZVwS 6jm8TzkugUQ/9wvNGZ2zn6vXf4th82x/ZgAXCzy54ztFo59vuhFMqDjI0Q0GavyrIJKH c1rhvrVfWKTFgkxP+tRNBb0ZvXdcGAcFwCKQN8IQwx8szLvFuaEh0EgWA2DL2vdk9aTB bgud048+NHTzQckePF32FblBBgWO1HfHBpxjdfEgCA7l9IYH2FoGdM/41O3rpROKACon lc2/nCx+5pvu8mPx4/nIgIeuIFgotm0PYYBiJ3wuNBMWUEct8Msj4wJ+jilzbIdqLkzJ RjrA== X-Gm-Message-State: AO0yUKX2roXsDB2BawYDatEE5BpmLRZZPqQS/13Rklgeug/GneB+r14J 5QLR8TTEGHzjr1cml/Te1N0eVeBPev9l X-Google-Smtp-Source: AK7set+9O9Wk5BTCkRajxDbon6ycn1pAYNIVG/NGlctTUcdXrjn2qjwP6WpHtNlyYFMb9Y/pOgb8vp5bjVOq X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:c0b:0:b0:80b:4f92:1623 with SMTP id f11-20020a5b0c0b000000b0080b4f921623mr6ybq.370.1678263498380; Wed, 08 Mar 2023 00:18:18 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:24 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-5-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 04/11] perf stat: Modify the group test From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently nr_members is 0 for an event with no group, however, they are always a leader of their own group. A later change will make that count 1 because the event is its own leader. Make the find_stat logic consistent with this, an improvement suggested by Namhyung Kim. Suggested-by: Namhyung Kim Signed-off-by: Ian Rogers --- tools/perf/util/stat-shadow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index ef85f1ae1ab2..eeccab6751d7 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -163,7 +163,7 @@ static double find_stat(const struct evsel *evsel, int = aggr_idx, enum stat_type continue; =20 /* Ignore evsels that are part of different groups. */ - if (evsel->core.leader->nr_members && + if (evsel->core.leader->nr_members > 1 && evsel->core.leader !=3D cur->core.leader) continue; /* Ignore evsels with mismatched modifiers. */ --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D014CC64EC4 for ; Wed, 8 Mar 2023 08:19:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230098AbjCHITE (ORCPT ); Wed, 8 Mar 2023 03:19:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34772 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230085AbjCHISl (ORCPT ); Wed, 8 Mar 2023 03:18:41 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1D2C58B6F for ; Wed, 8 Mar 2023 00:18:26 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-536c039f859so164428207b3.21 for ; Wed, 08 Mar 2023 00:18:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263506; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=mSc6zWu+gp18coqfyQ+Fs9l1x/Sawfb5L2ZQMm92/Ks=; b=gLWDALHSInxky1q6KNIpnowuYEoAGOGZqYbXoY4UG9TnPphzEsx1yixDt3YiKOyxy1 XEKNGbnfoszZmuZYOOn1uPUN942/LROjz6KlDdi+FPTEjr/1QP440MweC2zp02lgEOmC E+S14VlZ8ME5YG8xPOkBs3cPdBsjbW+OEvwKzM8F2J7nGW9pCZwCgUedh8OT31ehxrcM 7xAtmVbyAGN6ehrI35e+jjqnzVdIMOjJxe96QrrvDDwF9P2CZffeldPb6ktuDsSAVC63 mGgZVK0PXgMVjtv+89zCZeeBEbXau66K9sL9q9vm8KxfN2xQ1SlPCmC/MYAUyQFCay4I m0IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263506; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mSc6zWu+gp18coqfyQ+Fs9l1x/Sawfb5L2ZQMm92/Ks=; b=uC7KbX9oyZvGs2AjZND7IPOtYKpvCgNFENGOgMQH42F9BWyhS9/x+2bTZGIia4ZDE1 7g/2xZu8Q5NoAWbEJLbqAITWIz1pLA4ktCrwhZMFmk8z+ZPXxjwxdtInj2U+h3QIXcKP cNQCxBc6d5fkdcKs2mqwmQBDFA7BPtKoHKlOYv3eUgUStvFbwt80V4ek5NIWf3WW2djX vNPOLYRb6b1uHTq5uEYUjPkHb/unqdWpT6HDJiQp6EvarMQ/Vse8yiXJopZ6ZrxDVenv cWV874KkrL8ZAHR/KH7AHQ8vh+gyLqCxCm+kBGYyoaF7n2cwqk12UaT3sa3Qrns9A1QA KS0A== X-Gm-Message-State: AO0yUKXphx/lcUfGJS6iG6ybf9tJ79U5XRs0V2qeYubk4Fhto1V+4tnp xu+8B/8FoI+5i5mDKKdvZb7u5Ce1CwF0 X-Google-Smtp-Source: AK7set/23H5ZOdtcYZfBRDyjidz9RK2zlWG161Fx6tujXY+ah9CAk/M7KPO62g4Wp4xGn09+d51ommDZZNtV X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:e92:0:b0:ab8:1ed9:cfc9 with SMTP id z18-20020a5b0e92000000b00ab81ed9cfc9mr10409623ybr.6.1678263506184; Wed, 08 Mar 2023 00:18:26 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:25 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-6-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 05/11] perf evsel: Allow const evsel for certain accesses From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" List sorting, added later to evlist, passes const elements requiring helper functions to also be const. Make the argument to evsel__find_pmu, evsel__is_aux_event and evsel__leader const. Signed-off-by: Ian Rogers --- tools/perf/util/evsel.c | 2 +- tools/perf/util/evsel.h | 6 +++--- tools/perf/util/pmu.c | 6 +++--- tools/perf/util/python.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 51e8ce6edddc..2dc2c24252bb 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -3139,7 +3139,7 @@ bool evsel__is_hybrid(const struct evsel *evsel) return evsel->pmu_name && perf_pmu__is_hybrid(evsel->pmu_name); } =20 -struct evsel *evsel__leader(struct evsel *evsel) +struct evsel *evsel__leader(const struct evsel *evsel) { return container_of(evsel->core.leader, struct evsel, core); } diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 814a49ebb7e3..676c499323e9 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -212,8 +212,8 @@ int evsel__object_config(size_t object_size, int (*init)(struct evsel *evsel), void (*fini)(struct evsel *evsel)); =20 -struct perf_pmu *evsel__find_pmu(struct evsel *evsel); -bool evsel__is_aux_event(struct evsel *evsel); +struct perf_pmu *evsel__find_pmu(const struct evsel *evsel); +bool evsel__is_aux_event(const struct evsel *evsel); =20 struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx); =20 @@ -505,7 +505,7 @@ int evsel__store_ids(struct evsel *evsel, struct evlist= *evlist); =20 void evsel__zero_per_pkg(struct evsel *evsel); bool evsel__is_hybrid(const struct evsel *evsel); -struct evsel *evsel__leader(struct evsel *evsel); +struct evsel *evsel__leader(const struct evsel *evsel); bool evsel__has_leader(struct evsel *evsel, struct evsel *leader); bool evsel__is_leader(struct evsel *evsel); void evsel__set_leader(struct evsel *evsel, struct evsel *leader); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 43b6182d96b7..45d9b8e28e16 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -988,7 +988,7 @@ struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu) return NULL; } =20 -struct perf_pmu *evsel__find_pmu(struct evsel *evsel) +struct perf_pmu *evsel__find_pmu(const struct evsel *evsel) { struct perf_pmu *pmu =3D NULL; =20 @@ -1000,11 +1000,11 @@ struct perf_pmu *evsel__find_pmu(struct evsel *evse= l) break; } =20 - evsel->pmu =3D pmu; + ((struct evsel *)evsel)->pmu =3D pmu; return pmu; } =20 -bool evsel__is_aux_event(struct evsel *evsel) +bool evsel__is_aux_event(const struct evsel *evsel) { struct perf_pmu *pmu =3D evsel__find_pmu(evsel); =20 diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 42e8b813d010..ab48ffbb6448 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c @@ -83,7 +83,7 @@ const char *perf_env__arch(struct perf_env *env __maybe_u= nused) * far, for the perf python binding known usecases, revisit if this become * necessary. */ -struct perf_pmu *evsel__find_pmu(struct evsel *evsel __maybe_unused) +struct perf_pmu *evsel__find_pmu(const struct evsel *evsel __maybe_unused) { return NULL; } --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9666CC64EC4 for ; Wed, 8 Mar 2023 08:19:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229963AbjCHITL (ORCPT ); Wed, 8 Mar 2023 03:19:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36240 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230108AbjCHISr (ORCPT ); Wed, 8 Mar 2023 03:18:47 -0500 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 96D39A3348 for ; Wed, 8 Mar 2023 00:18:34 -0800 (PST) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-536af109f9aso163948007b3.13 for ; Wed, 08 Mar 2023 00:18:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263513; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=NBVnqvPJIWvW8Q6RkCDyc/WyuejWqbt8BpFQxOyzWTY=; b=Dd5AtqIxiqrKsdgITUYGy2qdvIWIn7hXGg3AystvVuMH0hMFS4fltx0yn1PeTZ765O qs2MIFkZAd7KlrTcReMU0ShQYFbUF/72oakyl5cRJCKwpE1Q0ZuQVghBUkNPooxs6O91 UciQ8fl+tMAT5weLM5rKPkrqZSm59V7ag5o19Oa8TxqwYmDQ+1dTciodHMlEd9f0EoTW rG7IpJNhJGzZzMM4GzyCLE/h7vh3m6ASkjAM+Q/YUJdSg6osNREONSmSZROS+0Fe9B2h Iy+OjU/WgANSB0TVouA8ZGbON99vA4ny+yRgRvV5xsYfHZr9j/ZRpCpSC94pIKJebPah 8mJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263513; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=NBVnqvPJIWvW8Q6RkCDyc/WyuejWqbt8BpFQxOyzWTY=; b=vShaJYjwDhb73zlKLi14/66ehtDX6U6efa5zdm2jN0e7eyPVyQ5Bjr/WN/Z0xoNIbH H68EjQBo4h+E7Omk5DunJcD8vB3/qCBTCTzUiGokXAnTAW10/naPQKD5qzI3NZMAXGI4 tRXEey6/bS+FwopE+NN0WPuN5xn0f61J1jAT5/QyCxZ+xxdfzGVqFvl3fsSL7GRR6p+F E0Q93aI4EMklikQl9wXb1za8bC1JG/hhxLdWdqnKn68WDFbaEbyJ49by78+W7bzX9fW/ WkG99xWvdbeAWe+Z5kBXuwl21kj1Vui7hFAUicyjsceFVM7nQN+iKJvffhqLeMLWRW8b bzsg== X-Gm-Message-State: AO0yUKWhaCeTGNYOooChcdFWaCPpAJC/abrecI6oIl5GhcWgzY6xRX8h +ZxcEIZaurl+FRRgQbxd64svhXT6KC9N X-Google-Smtp-Source: AK7set9yRy04IKzIcosRVW9Zn3vDebQNB9h1NT13rTmOw/BVNpWGDlEwr26BwCGuN+axvpjYbeROetb+KceI X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a05:6902:10e:b0:98e:6280:74ca with SMTP id o14-20020a056902010e00b0098e628074camr8504481ybh.1.1678263513764; Wed, 08 Mar 2023 00:18:33 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:26 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-7-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 06/11] perf evsel: Add function to compute group PMU name From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The computed name respects software events and aux event groups, such that the pmu_name is changed to be that of the aux event leader or group leader for software events. This is done as a later change will split events that are in different PMUs into different groups. Signed-off-by: Ian Rogers --- tools/perf/util/evsel.c | 24 ++++++++++++++++++++++++ tools/perf/util/evsel.h | 1 + 2 files changed, 25 insertions(+) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 2dc2c24252bb..51d9650267d0 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -821,6 +821,30 @@ const char *evsel__name(struct evsel *evsel) return "unknown"; } =20 +const char *evsel__group_pmu_name(const struct evsel *evsel) +{ + const struct evsel *leader; + + /* If the pmu_name is set use it. pmu_name isn't set for CPU and software= events. */ + if (evsel->pmu_name) + return evsel->pmu_name; + /* + * Software events may be in a group with other uncore PMU events. Use + * the pmu_name of the group leader to avoid breaking the software event + * out of the group. + * + * Aux event leaders, like intel_pt, expect a group with events from + * other PMUs, so substitute the AUX event's PMU in this case. + */ + leader =3D evsel__leader(evsel); + if ((evsel->core.attr.type =3D=3D PERF_TYPE_SOFTWARE || evsel__is_aux_eve= nt(leader)) && + leader->pmu_name) { + return leader->pmu_name; + } + + return "cpu"; +} + const char *evsel__metric_id(const struct evsel *evsel) { if (evsel->metric_id) diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 676c499323e9..d26745ca6147 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -280,6 +280,7 @@ int arch_evsel__hw_name(struct evsel *evsel, char *bf, = size_t size); =20 int __evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, char *bf= , size_t size); const char *evsel__name(struct evsel *evsel); +const char *evsel__group_pmu_name(const struct evsel *evsel); const char *evsel__metric_id(const struct evsel *evsel); =20 static inline bool evsel__is_tool(const struct evsel *evsel) --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C143BC64EC4 for ; Wed, 8 Mar 2023 08:19:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229695AbjCHIT1 (ORCPT ); Wed, 8 Mar 2023 03:19:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34758 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229955AbjCHITA (ORCPT ); Wed, 8 Mar 2023 03:19:00 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAF6A4AFFE for ; Wed, 8 Mar 2023 00:18:41 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id a137-20020a25ca8f000000b0091b90b20cd9so16931975ybg.6 for ; Wed, 08 Mar 2023 00:18:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263521; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=dcvWMdLTJ1iuXhAaTLlBF3OqMzr4/MuwhIZh3sQrcPM=; b=FWNtGJtYxUG//wEXtm6p8eRyzLunuHYYz3q8R61LClpUjKQP8mKwPSZjyu4xTFWlN5 +T+8WTP2KH1fWLe6MSLjq8ZU1839uwN7XJljbSNFGfhpdtKde9GWyT4NmmS8xh+IEgJ1 rZtr9N2R/FZZN/Md/pn1amM/6cPH1/Ktgx+nkl0encQuduucTBghVLBozAtXfpEkmrGd 1c/QrmMiYwZ8WHhaPaqvNWyJ00GPdlvL+iUOH5smcPq2t2sH3O1QNUBH/0/2+1RsmNxY mJFLhPJRGhRK8DGOQM5m8kjiHyIoMZd7ipXJzXJ8RfA6ihWtkBiaCwQFNc2mIAKPZs35 UXPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263521; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dcvWMdLTJ1iuXhAaTLlBF3OqMzr4/MuwhIZh3sQrcPM=; b=UsRvmIuDN5lsWm7t+kJyXiogSVtuwNMfyHIa4mFeF7ZOpmMttkvAvvw96Rjtbw2CVT GmpZG1M1f0juzju7JU3++7V8O/AcIAfo/pUWMC7OFA/M2HP1JrZDW7K9+Ec301jUdu0e HjsPQQKgDGxEgN11vY/HhI9ZlQrKE2JJa29cXdds6968hwMvRY/JP3bOgya/qrhIYjc3 BfHFXS8ZykclPFN9AkXQ6FvLPgfNePnA0jBRDdrk9MlMd81AFAmc+8MMWF1e75ExC1Rf rQIsxJlXdUl+sA1qZuoTkJb85KLlvNXjlB4q5EXUIJG5omBQ+88j0DXEld1zNJpgxqjM qGYg== X-Gm-Message-State: AO0yUKVy/7TVEpvxuuj4HJpw9M7JrFDVI+e1shPN9UJEiC40kYD3fZNo ZRHQqJq2KEzY5R+xxbhXPFd6tDyWNcQG X-Google-Smtp-Source: AK7set+TIyKgKbB/riuRBP5LOZDBYsXH0JHi23Ny36X3MvlOQC+v1WdsfIm72GMBlqh4k28gZBKZR0ZdbLnG X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a81:b243:0:b0:52e:d380:ab14 with SMTP id q64-20020a81b243000000b0052ed380ab14mr9684584ywh.3.1678263521140; Wed, 08 Mar 2023 00:18:41 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:27 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-8-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 07/11] perf parse-events: Pass ownership of the group name From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass ownership of the group name rather than copying and freeing the original. This saves a memory allocation and copy. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.c | 3 ++- tools/perf/util/parse-events.y | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 0336ff27c15f..1be454697d57 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1761,6 +1761,7 @@ parse_events__set_leader_for_uncore_aliase(char *name= , struct list_head *list, =20 handled: ret =3D 1; + free(name); out: free(leaders); return ret; @@ -1786,7 +1787,7 @@ void parse_events__set_leader(char *name, struct list= _head *list, =20 leader =3D arch_evlist__leader(list); __perf_evlist__set_leader(list, &leader->core); - leader->group_name =3D name ? strdup(name) : NULL; + leader->group_name =3D name; list_move(&leader->core.node, list); } =20 diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index be8c51770051..541b8dde2063 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -202,8 +202,8 @@ PE_NAME '{' events '}' struct list_head *list =3D $3; =20 inc_group_count(list, _parse_state); + /* Takes ownership of $1. */ parse_events__set_leader($1, list, _parse_state); - free($1); $$ =3D list; } | --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8EA80C64EC4 for ; Wed, 8 Mar 2023 08:19:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230112AbjCHITc (ORCPT ); Wed, 8 Mar 2023 03:19:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34052 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229820AbjCHITE (ORCPT ); Wed, 8 Mar 2023 03:19:04 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 632F1A76B6 for ; Wed, 8 Mar 2023 00:18:51 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id x64-20020a25ce43000000b00ae6d5855d78so17049898ybe.12 for ; Wed, 08 Mar 2023 00:18:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263530; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=ctl/zbbcBTiCypGQ4gzGnhIydZa9Hxty23aBTbLFH5M=; b=E8EOdNoTlppoxrymqxsrbxoGCnZYPhkZTrtVUkUCRCVX4Htyk3ASONtF6l5edMS//V GDCQO3m9CfSQQpJMNu1PNnBjiOpPxaHlc3FINjl9WprxEl3C05gVZFFU8tDEjGnkVZWu QFyaUn+ttwDIrrvGoZpDJHU+Q1x/30VTGQmIXI1qSP830JUqlb3E7P8YOuysGVS2rQ7w vSX0EmwwXjooHAzoMC3PsYAH4nCqrmzObFDamRpZEVDG57KsXUzmzcRUXMaTJAyGtg/7 p46xQ0J6QK2dDYfyXX0UwA6v729iTNuHLuiJyFxGggk7tS2zgAab09gO0eJ8z1d31WKr KQIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263530; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ctl/zbbcBTiCypGQ4gzGnhIydZa9Hxty23aBTbLFH5M=; b=kAJhMrPsMC9vWuDY568VLtT9J5wCClrEqX3nXG6PXTZ3rpxKJZSg/h8KRg4a+E/gsq W9iFH49obrNDeH3a2MPylHzTfH7nLQ4C38D3ZVzzJMhaX280ohz8VaLin6/01QPg03gA gaoqYOcTiMyCvRgsM2xJfQeA2s+dnSdBQO4+giWzIDhWjHOoLprQRR5tO/cgahU1ZAeM NrmYt2tXzAbBlXMqmtBfGpfVhHjRi+fRDuK2oyxck3Y2gA6h0DzbqfjAMSD+aerHL61P 9QzACptWMYHQl361stQPnRD+O3y7zH4VQ77pdTfGKHLBGLZd/PBIgm24AEWlx5/vC24/ /QnQ== X-Gm-Message-State: AO0yUKUnDf/8EtSl3wqJQAx94j41g/ztodUXW5ByHduPiYDN4dzEn6tN fO8BxIdBllLQQc0bnWom6REmbdc2R2Vx X-Google-Smtp-Source: AK7set82tSdag3Ksou/N22iN902WThULsJWMJdzUQSabn26wNDea90nu+q08JAI5s0fqA7Koj+vxTW3Mb2KZ X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:11:0:b0:8de:ddd5:7f8e with SMTP id a17-20020a5b0011000000b008deddd57f8emr8356338ybp.4.1678263530736; Wed, 08 Mar 2023 00:18:50 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:28 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-9-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 08/11] perf parse-events: Sort and group parsed events From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change is intended to be a no-op for most current cases, the default sort order is the order the events were parsed. Where it varies is in how groups are handled. Previously an uncore and core event that are grouped would most often cause the group to be removed: ``` $ perf stat -e '{instructions,uncore_imc_free_running_0/data_total/}' -a sl= eep 1 WARNING: grouped events cpus do not match, disabling group: anon group { instructions, uncore_imc_free_running_0/data_total/ } ... ``` However, when wildcards are used the events should be re-sorted and re-grouped in parse_events__set_leader, but this currently fails for simple examples: ``` $ perf stat -e '{uncore_imc_free_running/data_read/,uncore_imc_free_running= /data_write/}' -a sleep 1 Performance counter stats for 'system wide': MiB uncore_imc_free_running/data_read/ MiB uncore_imc_free_running/data_write/ 1.000996992 seconds time elapsed ``` A futher failure mode, fixed in this patch, is to force topdown events into a group. This change moves sorting the evsels in the evlist after parsing. It requires parsing to set up groups. First the evsels are sorted respecting the existing groupings and parse order, but also reordering to ensure evsels of the same PMU and group appear together. So that software and aux events respect groups, their pmu_name is taken from the group leader. The sorting is done with list_sort removing a memory allocation. After sorting a pass is done to correct the group leaders and for topdown events ensuring they have a group leader. This fixes the problems seen before: ``` $ perf stat -e '{uncore_imc_free_running/data_read/,uncore_imc_free_running= /data_write/}' -a sleep 1 Performance counter stats for 'system wide': 727.42 MiB uncore_imc_free_running/data_read/ 81.84 MiB uncore_imc_free_running/data_write/ 1.000948615 seconds time elapsed ``` As well as making groups not fail for cases like: ``` $ perf stat -e '{imc_free_running_0/data_total/,imc_free_running_1/data_tot= al/}' -a sleep 1 Performance counter stats for 'system wide': 256.47 MiB imc_free_running_0/data_total/ 256.48 MiB imc_free_running_1/data_total/ 1.001165442 seconds time elapsed ``` Signed-off-by: Ian Rogers --- tools/perf/arch/x86/util/evlist.c | 39 ++--- tools/perf/util/evlist.h | 2 +- tools/perf/util/parse-events.c | 240 +++++++++++++++--------------- tools/perf/util/parse-events.h | 3 +- tools/perf/util/parse-events.y | 4 +- 5 files changed, 136 insertions(+), 152 deletions(-) diff --git a/tools/perf/arch/x86/util/evlist.c b/tools/perf/arch/x86/util/e= vlist.c index 8a7ae4162563..d4193479a364 100644 --- a/tools/perf/arch/x86/util/evlist.c +++ b/tools/perf/arch/x86/util/evlist.c @@ -65,29 +65,22 @@ int arch_evlist__add_default_attrs(struct evlist *evlis= t, return ___evlist__add_default_attrs(evlist, attrs, nr_attrs); } =20 -struct evsel *arch_evlist__leader(struct list_head *list) +int arch_evlist__cmp(const struct evsel *lhs, const struct evsel *rhs) { - struct evsel *evsel, *first, *slots =3D NULL; - bool has_topdown =3D false; - - first =3D list_first_entry(list, struct evsel, core.node); - - if (!topdown_sys_has_perf_metrics()) - return first; - - /* If there is a slots event and a topdown event then the slots event com= es first. */ - __evlist__for_each_entry(list, evsel) { - if (evsel->pmu_name && !strncmp(evsel->pmu_name, "cpu", 3) && evsel->nam= e) { - if (strcasestr(evsel->name, "slots")) { - slots =3D evsel; - if (slots =3D=3D first) - return first; - } - if (strcasestr(evsel->name, "topdown")) - has_topdown =3D true; - if (slots && has_topdown) - return slots; - } + if (topdown_sys_has_perf_metrics() && + (!lhs->pmu_name || !strncmp(lhs->pmu_name, "cpu", 3))) { + /* Ensure the topdown slots comes first. */ + if (strcasestr(lhs->name, "slots")) + return -1; + if (strcasestr(rhs->name, "slots")) + return 1; + /* Followed by topdown events. */ + if (strcasestr(lhs->name, "topdown") && !strcasestr(rhs->name, "topdown"= )) + return -1; + if (!strcasestr(lhs->name, "topdown") && strcasestr(rhs->name, "topdown"= )) + return 1; } - return first; + + /* Default ordering by insertion index. */ + return lhs->core.idx - rhs->core.idx; } diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 01fa9d592c5a..d89d8f92802b 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -119,7 +119,7 @@ int arch_evlist__add_default_attrs(struct evlist *evlis= t, #define evlist__add_default_attrs(evlist, array) \ arch_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array)) =20 -struct evsel *arch_evlist__leader(struct list_head *list); +int arch_evlist__cmp(const struct evsel *lhs, const struct evsel *rhs); =20 int evlist__add_dummy(struct evlist *evlist); struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wid= e); diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 1be454697d57..394ab23089d0 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 #include #include +#include #include #include #include @@ -1655,125 +1656,7 @@ int parse_events__modifier_group(struct list_head *= list, return parse_events__modifier_event(list, event_mod, true); } =20 -/* - * Check if the two uncore PMUs are from the same uncore block - * The format of the uncore PMU name is uncore_#blockname_#pmuidx - */ -static bool is_same_uncore_block(const char *pmu_name_a, const char *pmu_n= ame_b) -{ - char *end_a, *end_b; - - end_a =3D strrchr(pmu_name_a, '_'); - end_b =3D strrchr(pmu_name_b, '_'); - - if (!end_a || !end_b) - return false; - - if ((end_a - pmu_name_a) !=3D (end_b - pmu_name_b)) - return false; - - return (strncmp(pmu_name_a, pmu_name_b, end_a - pmu_name_a) =3D=3D 0); -} - -static int -parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *l= ist, - struct parse_events_state *parse_state) -{ - struct evsel *evsel, *leader; - uintptr_t *leaders; - bool is_leader =3D true; - int i, nr_pmu =3D 0, total_members, ret =3D 0; - - leader =3D list_first_entry(list, struct evsel, core.node); - evsel =3D list_last_entry(list, struct evsel, core.node); - total_members =3D evsel->core.idx - leader->core.idx + 1; - - leaders =3D calloc(total_members, sizeof(uintptr_t)); - if (WARN_ON(!leaders)) - return 0; - - /* - * Going through the whole group and doing sanity check. - * All members must use alias, and be from the same uncore block. - * Also, storing the leader events in an array. - */ - __evlist__for_each_entry(list, evsel) { - - /* Only split the uncore group which members use alias */ - if (!evsel->use_uncore_alias) - goto out; - - /* The events must be from the same uncore block */ - if (!is_same_uncore_block(leader->pmu_name, evsel->pmu_name)) - goto out; - - if (!is_leader) - continue; - /* - * If the event's PMU name starts to repeat, it must be a new - * event. That can be used to distinguish the leader from - * other members, even they have the same event name. - */ - if ((leader !=3D evsel) && - !strcmp(leader->pmu_name, evsel->pmu_name)) { - is_leader =3D false; - continue; - } - - /* Store the leader event for each PMU */ - leaders[nr_pmu++] =3D (uintptr_t) evsel; - } - - /* only one event alias */ - if (nr_pmu =3D=3D total_members) { - parse_state->nr_groups--; - goto handled; - } - - /* - * An uncore event alias is a joint name which means the same event - * runs on all PMUs of a block. - * Perf doesn't support mixed events from different PMUs in the same - * group. The big group has to be split into multiple small groups - * which only include the events from the same PMU. - * - * Here the uncore event aliases must be from the same uncore block. - * The number of PMUs must be same for each alias. The number of new - * small groups equals to the number of PMUs. - * Setting the leader event for corresponding members in each group. - */ - i =3D 0; - __evlist__for_each_entry(list, evsel) { - if (i >=3D nr_pmu) - i =3D 0; - evsel__set_leader(evsel, (struct evsel *) leaders[i++]); - } - - /* The number of members and group name are same for each group */ - for (i =3D 0; i < nr_pmu; i++) { - evsel =3D (struct evsel *) leaders[i]; - evsel->core.nr_members =3D total_members / nr_pmu; - evsel->group_name =3D name ? strdup(name) : NULL; - } - - /* Take the new small groups into account */ - parse_state->nr_groups +=3D nr_pmu - 1; - -handled: - ret =3D 1; - free(name); -out: - free(leaders); - return ret; -} - -__weak struct evsel *arch_evlist__leader(struct list_head *list) -{ - return list_first_entry(list, struct evsel, core.node); -} - -void parse_events__set_leader(char *name, struct list_head *list, - struct parse_events_state *parse_state) +void parse_events__set_leader(char *name, struct list_head *list) { struct evsel *leader; =20 @@ -1782,13 +1665,9 @@ void parse_events__set_leader(char *name, struct lis= t_head *list, return; } =20 - if (parse_events__set_leader_for_uncore_aliase(name, list, parse_state)) - return; - - leader =3D arch_evlist__leader(list); + leader =3D list_first_entry(list, struct evsel, core.node); __perf_evlist__set_leader(list, &leader->core); leader->group_name =3D name; - list_move(&leader->core.node, list); } =20 /* list_event is assumed to point to malloc'ed memory */ @@ -2245,6 +2124,117 @@ static int parse_events__with_hybrid_pmu(struct par= se_events_state *parse_state, return ret; } =20 +__weak int arch_evlist__cmp(const struct evsel *lhs, const struct evsel *r= hs) +{ + /* Order by insertion index. */ + return lhs->core.idx - rhs->core.idx; +} + +static int evlist__cmp(void *state, const struct list_head *l, const struc= t list_head *r) +{ + const struct perf_evsel *lhs_core =3D container_of(l, struct perf_evsel, = node); + const struct evsel *lhs =3D container_of(lhs_core, struct evsel, core); + const struct perf_evsel *rhs_core =3D container_of(r, struct perf_evsel, = node); + const struct evsel *rhs =3D container_of(rhs_core, struct evsel, core); + int *leader_idx =3D state; + int lhs_leader_idx =3D *leader_idx, rhs_leader_idx =3D *leader_idx, ret; + const char *lhs_pmu_name, *rhs_pmu_name; + + /* + * First sort by grouping/leader. Read the leader idx only if the evsel + * is part of a group, as -1 indicates no group. + */ + if (lhs_core->leader !=3D lhs_core || lhs_core->nr_members > 1) + lhs_leader_idx =3D lhs_core->leader->idx; + if (rhs_core->leader !=3D rhs_core || rhs_core->nr_members > 1) + rhs_leader_idx =3D rhs_core->leader->idx; + + if (lhs_leader_idx !=3D rhs_leader_idx) + return lhs_leader_idx - rhs_leader_idx; + + /* Group by PMU. Groups can't span PMUs. */ + lhs_pmu_name =3D evsel__group_pmu_name(lhs); + rhs_pmu_name =3D evsel__group_pmu_name(rhs); + ret =3D strcmp(lhs_pmu_name, rhs_pmu_name); + if (ret) + return ret; + + /* Architecture specific sorting. */ + return arch_evlist__cmp(lhs, rhs); +} + +static void parse_events__sort_events_and_fix_groups(struct list_head *lis= t) +{ + int idx =3D -1; + struct evsel *pos, *cur_leader =3D NULL; + struct perf_evsel *cur_leaders_grp =3D NULL; + + /* + * Compute index to insert ungrouped events at. Place them where the + * first ungrouped event appears. + */ + list_for_each_entry(pos, list, core.node) { + const struct evsel *pos_leader =3D evsel__leader(pos); + + if (pos !=3D pos_leader || pos->core.nr_members > 1) + continue; + + idx =3D pos->core.idx; + break; + } + + /* Sort events. */ + list_sort(&idx, list, evlist__cmp); + + /* + * Recompute groups, splitting for PMUs and adding groups for events + * that require them. + */ + idx =3D 0; + list_for_each_entry(pos, list, core.node) { + const struct evsel *pos_leader =3D evsel__leader(pos); + const char *pos_pmu_name =3D evsel__group_pmu_name(pos); + const char *cur_leader_pmu_name, *pos_leader_pmu_name; + bool force_grouped =3D arch_evsel__must_be_in_group(pos); + + /* Reset index and nr_members. */ + pos->core.idx =3D idx++; + pos->core.nr_members =3D 0; + + /* + * Set the group leader respecting the given groupings and that + * groups can't span PMUs. + */ + if (!cur_leader) + cur_leader =3D pos; + + cur_leader_pmu_name =3D evsel__group_pmu_name(cur_leader); + if ((cur_leaders_grp !=3D pos->core.leader && !force_grouped) || + strcmp(cur_leader_pmu_name, pos_pmu_name)) { + /* Event is for a different group/PMU than last. */ + cur_leader =3D pos; + /* + * Remember the leader's group before it is overwritten, + * so that later events match as being in the same + * group. + */ + cur_leaders_grp =3D pos->core.leader; + } + pos_leader_pmu_name =3D evsel__group_pmu_name(pos_leader); + if (strcmp(pos_leader_pmu_name, pos_pmu_name) || force_grouped) { + /* + * Event's PMU differs from its leader's. Groups can't + * span PMUs, so update leader from the group/PMU + * tracker. + */ + evsel__set_leader(pos, cur_leader); + } + } + list_for_each_entry(pos, list, core.node) { + pos->core.leader->nr_members++; + } +} + int __parse_events(struct evlist *evlist, const char *str, struct parse_events_error *err, struct perf_pmu *fake_pmu) { @@ -2266,6 +2256,8 @@ int __parse_events(struct evlist *evlist, const char = *str, return -1; } =20 + parse_events__sort_events_and_fix_groups(&parse_state.list); + /* * Add list to the evlist even with errors to allow callers to clean up. */ diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 428e72eaafcc..22fc11b0bd59 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -200,8 +200,7 @@ int parse_events_copy_term_list(struct list_head *old, =20 enum perf_pmu_event_symbol_type perf_pmu__parse_check(const char *name); -void parse_events__set_leader(char *name, struct list_head *list, - struct parse_events_state *parse_state); +void parse_events__set_leader(char *name, struct list_head *list); void parse_events_update_lists(struct list_head *list_event, struct list_head *list_all); void parse_events_evlist_error(struct parse_events_state *parse_state, diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 541b8dde2063..90d12f2bc8be 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -203,7 +203,7 @@ PE_NAME '{' events '}' =20 inc_group_count(list, _parse_state); /* Takes ownership of $1. */ - parse_events__set_leader($1, list, _parse_state); + parse_events__set_leader($1, list); $$ =3D list; } | @@ -212,7 +212,7 @@ PE_NAME '{' events '}' struct list_head *list =3D $2; =20 inc_group_count(list, _parse_state); - parse_events__set_leader(NULL, list, _parse_state); + parse_events__set_leader(NULL, list); $$ =3D list; } =20 --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CC125C64EC4 for ; Wed, 8 Mar 2023 08:19:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229762AbjCHITg (ORCPT ); Wed, 8 Mar 2023 03:19:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36970 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230109AbjCHITI (ORCPT ); Wed, 8 Mar 2023 03:19:08 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E045AF741 for ; Wed, 8 Mar 2023 00:18:57 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5376fa4106eso162384627b3.7 for ; Wed, 08 Mar 2023 00:18:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263537; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=2Zi5p4CfxjslDfFVesFPJB5iL1V/LCfUtX6duyKxd8c=; b=YdAdLYcK8sWIVTwyTrqtRaR0SjJ9t8Q0EKD3edlPqX+FxA9MzgM6TZl6ceBNdgiQLr kSvt73qy5ImkjXyUHvd7rYBpwT6IqP3nFqaSAM6c8f4bu/fNU2RNrclF/0UbR5HLPwJk uGx9i5KdvGIMqsC4LcJAAJEhAtNP7ABrM6pa2zxLFp4s9LumMndYD4K9hM6sCEpNl7XL 2ikQCmQBV2One9usFWx0yEgMZ3eqd0zzXM1WghkmON1pEExWdeqxPtFNHqGE66lpnSka vpdMbU5TPlLaIcQAfi/8+bBsHsLwuCQGMIq+Z2KHyRr6Cjmbt7QlKp2ukoB98EDvuFFs BogA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263537; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2Zi5p4CfxjslDfFVesFPJB5iL1V/LCfUtX6duyKxd8c=; b=m+5fkJE1DgjexqhMASNh+qsz4RN0jJYWIRtFByujnlktJJPbhk7Ieb7Q+xIZKnkXxb mC+wE9crcwXATdnxeu/jZuU8xDgurRAbHSA0H8vIL3+mzhDPqmhFXt/USBZUuw/NZoU1 51lQBFN+kFiKVLEaIlMRdGW+HMJg/954+s11SX6krhqN0jM0u2JURBggjDP2qP+ugcEw bMV26WLjvwNbAslB/coPvI04ARV4rMmhKThKODy6nbCdC7UxhUgOrGSasZ9vNdoAaOfs AX2FVCJhTSsCKFWr8pApqKpDIO6Xk0BIdZAMTmMO/fw6fnjQdSMO1Tl58QyR4k1lw8n/ 4C0g== X-Gm-Message-State: AO0yUKVVoInWmei5GVQ8BmYprilBtksp4MBw2txhuJbzYdqJrpYJxPI9 GXaWLFE5rZ/KwvDIZR+SJIiWjwShEOYL X-Google-Smtp-Source: AK7set/qNl7v0DhqfD6Z5logJRcak5Yq2B6AAWQJB8MADi/RRnIgEzcYG7sfKvgy++dVM8wRwcRtoUNtjD4s X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:688:0:b0:aa9:bd2e:3744 with SMTP id j8-20020a5b0688000000b00aa9bd2e3744mr8322221ybq.9.1678263536785; Wed, 08 Mar 2023 00:18:56 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:29 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-10-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 09/11] perf evsel: Remove use_uncore_alias From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This flag used to be used when regrouping uncore events in particular due to wildcard matches. This is now handled by sorting evlist and so the flag is redundant. Signed-off-by: Ian Rogers --- tools/perf/util/evsel.c | 1 - tools/perf/util/evsel.h | 1 - tools/perf/util/parse-events.c | 12 +++--------- tools/perf/util/parse-events.h | 3 +-- tools/perf/util/parse-events.y | 11 +++++++---- 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 51d9650267d0..b9b05091bc8f 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -458,7 +458,6 @@ struct evsel *evsel__clone(struct evsel *orig) evsel->per_pkg =3D orig->per_pkg; evsel->percore =3D orig->percore; evsel->precise_max =3D orig->precise_max; - evsel->use_uncore_alias =3D orig->use_uncore_alias; evsel->is_libpfm_event =3D orig->is_libpfm_event; =20 evsel->exclude_GH =3D orig->exclude_GH; diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index d26745ca6147..c272c06565c0 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -89,7 +89,6 @@ struct evsel { bool per_pkg; bool percore; bool precise_max; - bool use_uncore_alias; bool is_libpfm_event; bool auto_merge_stats; bool collect_stat; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 394ab23089d0..93a90651266f 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1445,15 +1445,13 @@ static int parse_events__inside_hybrid_pmu(struct p= arse_events_state *parse_stat int parse_events_add_pmu(struct parse_events_state *parse_state, struct list_head *list, char *name, struct list_head *head_config, - bool auto_merge_stats, - bool use_alias) + bool auto_merge_stats) { struct perf_event_attr attr; struct perf_pmu_info info; struct perf_pmu *pmu; struct evsel *evsel; struct parse_events_error *err =3D parse_state->error; - bool use_uncore_alias; LIST_HEAD(config_terms); =20 pmu =3D parse_state->fake_pmu ?: perf_pmu__find(name); @@ -1488,8 +1486,6 @@ int parse_events_add_pmu(struct parse_events_state *p= arse_state, memset(&attr, 0, sizeof(attr)); } =20 - use_uncore_alias =3D (pmu->is_uncore && use_alias); - if (!head_config) { attr.type =3D pmu->type; evsel =3D __add_event(list, &parse_state->idx, &attr, @@ -1499,7 +1495,6 @@ int parse_events_add_pmu(struct parse_events_state *p= arse_state, /*cpu_list=3D*/NULL); if (evsel) { evsel->pmu_name =3D name ? strdup(name) : NULL; - evsel->use_uncore_alias =3D use_uncore_alias; return 0; } else { return -ENOMEM; @@ -1560,7 +1555,6 @@ int parse_events_add_pmu(struct parse_events_state *p= arse_state, evsel->use_config_name =3D true; =20 evsel->pmu_name =3D name ? strdup(name) : NULL; - evsel->use_uncore_alias =3D use_uncore_alias; evsel->percore =3D config_term_percore(&evsel->config_terms); =20 if (parse_state->fake_pmu) @@ -1622,7 +1616,7 @@ int parse_events_multi_pmu_add(struct parse_events_st= ate *parse_state, parse_events_copy_term_list(head, &orig_head); if (!parse_events_add_pmu(parse_state, list, pmu->name, orig_head, - true, true)) { + /*auto_merge_stats=3D*/true)) { pr_debug("%s -> %s/%s/\n", str, pmu->name, alias->str); ok++; @@ -1634,7 +1628,7 @@ int parse_events_multi_pmu_add(struct parse_events_st= ate *parse_state, =20 if (parse_state->fake_pmu) { if (!parse_events_add_pmu(parse_state, list, str, head, - true, true)) { + /*auto_merge_stats=3D*/true)) { pr_debug("%s -> %s/%s/\n", str, "fake_pmu", str); ok++; } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 22fc11b0bd59..fdac44dc696b 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -183,8 +183,7 @@ int parse_events_add_breakpoint(struct list_head *list,= int *idx, int parse_events_add_pmu(struct parse_events_state *parse_state, struct list_head *list, char *name, struct list_head *head_config, - bool auto_merge_stats, - bool use_alias); + bool auto_merge_stats); =20 struct evsel *parse_events__add_event(int idx, struct perf_event_attr *att= r, const char *name, const char *metric_id, diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 90d12f2bc8be..f1b153c72d67 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -313,7 +313,7 @@ event_pmu_name opt_pmu_config list =3D alloc_list(); if (!list) CLEANUP_YYABORT; - if (parse_events_add_pmu(_parse_state, list, $1, $2, false, false)) { + if (parse_events_add_pmu(_parse_state, list, $1, $2, /*auto_merge_stats= =3D*/false)) { struct perf_pmu *pmu =3D NULL; int ok =3D 0; =20 @@ -330,8 +330,10 @@ event_pmu_name opt_pmu_config !perf_pmu__match(pattern, pmu->alias_name, $1)) { if (parse_events_copy_term_list(orig_terms, &terms)) CLEANUP_YYABORT; - if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, true, = false)) + if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, + /*auto_merge_stats=3D*/true)) { ok++; + } parse_events_terms__delete(terms); } } @@ -407,7 +409,8 @@ PE_PMU_EVENT_FAKE sep_dc if (!list) YYABORT; =20 - err =3D parse_events_add_pmu(_parse_state, list, $1, NULL, false, false); + err =3D parse_events_add_pmu(_parse_state, list, $1, /*head_config=3D*/NU= LL, + /*auto_merge_stats=3D*/false); free($1); if (err < 0) { free(list); @@ -425,7 +428,7 @@ PE_PMU_EVENT_FAKE opt_pmu_config if (!list) YYABORT; =20 - err =3D parse_events_add_pmu(_parse_state, list, $1, $2, false, false); + err =3D parse_events_add_pmu(_parse_state, list, $1, $2, /*auto_merge_sta= ts=3D*/false); free($1); parse_events_terms__delete($2); if (err < 0) { --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85CE5C64EC4 for ; Wed, 8 Mar 2023 08:20:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230200AbjCHITy (ORCPT ); Wed, 8 Mar 2023 03:19:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37412 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230176AbjCHITV (ORCPT ); Wed, 8 Mar 2023 03:19:21 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E94775BC96 for ; Wed, 8 Mar 2023 00:19:03 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id w5-20020a253005000000b00aedd4305ff2so16448159ybw.13 for ; Wed, 08 Mar 2023 00:19:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263543; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=huz2Ht6P4TwFw8oK57dKDQvIxE0jztVkJlqgB+DUtPo=; b=orc+36DhYgX0tsj6dy0dQTsF1ujmh3J1bjerGhUfboYBtngOn4jLoo5+wxYloRwvAz QM/Y5q0tpkFmM9AnZVNqHIdGJvwxlr659RxamEjEHZHx8nvveSQIedIs6zHrMRYb6S65 XszuNiATld2ghcnBpOAf4NdJDrcSYPdBaqDpFd2OdKKNNIEXqcyPMSdcyM+pB4zRnyeP /4Xxrpx8U+HTXzYFdXqSnWLvM7P0/yUVs4MSCeCIOmjUK7obvtzdTO2tcXQCJep0DT82 03TcoXpVRIGLUQekvbQU1njbbyRCYeZlm/i6+OV0tnjzr2iU972mbblwo1yObDtOn379 hDTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263543; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=huz2Ht6P4TwFw8oK57dKDQvIxE0jztVkJlqgB+DUtPo=; b=q28lagW3URFcVht99j19elQFtN8GpmZr8/kyOj0eSwbcr6NQDEey8TdiiiRRo2T3ss sZ0yv/UOy6Q7HIcIrTno+OA95TcE/aBK9aTyDxkY/+dac7KvizavcMk04dH/S9aojT1a cm6uNsDA1Gq+dWmNHNlS8jFCQXb5j1UHY+I32t/3Cz7JNPXZsPYDjFLypxRm5BNyjBSX dqqdGne3IZJuz4GeaR/LYVaZlaGNQoSU7EcRPhqQ3BEarbvEPC1CCstOwXPZRJBumVy6 V9wQmGHbhP9pyTHOrOyXEM+QEY26ga78ymmZT7ytNFnBATb60PbNbLfAysoAVmXady3B IYAA== X-Gm-Message-State: AO0yUKUfQ0ERq3Yf3RnjYavznM1fMXFYCh5ujFzXmtMEyYY3aiJger99 MT4wpXKJ5USKE0xH61F15NGWraOXgCH+ X-Google-Smtp-Source: AK7set/H/oNiBNu1DPuEBGosVgyzC2Q9Pn6sauXbgP7xo597sStyPfT2R4/d7A5dNStE1dA+NCpTxYYAvXKx X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:8cd:0:b0:a00:1338:5cd4 with SMTP id w13-20020a5b08cd000000b00a0013385cd4mr2ybq.578.1678263543008; Wed, 08 Mar 2023 00:19:03 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:30 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-11-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 10/11] perf evlist: Remove nr_groups From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Maintaining the number of groups during event parsing is problematic and since changing to sort/regroup events can only be computed by a linear pass over the evlist. As the value is generally only used in tests, rather than hold it in a variable compute it by passing over the evlist when necessary. This change highlights that libpfm's counting of groups with a single entry disagreed with regular event parsing. The libpfm tests are updated accordingly. Signed-off-by: Ian Rogers --- tools/lib/perf/evlist.c | 18 +++++++++++++++++- tools/lib/perf/include/internal/evlist.h | 1 - tools/lib/perf/include/perf/evlist.h | 1 + tools/perf/builtin-record.c | 2 +- tools/perf/builtin-report.c | 2 +- tools/perf/tests/bpf.c | 1 - tools/perf/tests/parse-events.c | 22 +++++++++++----------- tools/perf/tests/pfm.c | 12 ++++++------ tools/perf/util/evlist.c | 2 +- tools/perf/util/evlist.h | 6 ++++++ tools/perf/util/header.c | 3 +-- tools/perf/util/parse-events.c | 1 - tools/perf/util/parse-events.h | 1 - tools/perf/util/parse-events.y | 10 ---------- tools/perf/util/pfm.c | 1 - 15 files changed, 45 insertions(+), 38 deletions(-) diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c index 2d6121e89ccb..81e8b5fcd8ba 100644 --- a/tools/lib/perf/evlist.c +++ b/tools/lib/perf/evlist.c @@ -703,7 +703,23 @@ void perf_evlist__set_leader(struct perf_evlist *evlis= t) struct perf_evsel *first =3D list_entry(evlist->entries.next, struct perf_evsel, node); =20 - evlist->nr_groups =3D evlist->nr_entries > 1 ? 1 : 0; __perf_evlist__set_leader(&evlist->entries, first); } } + +int perf_evlist__nr_groups(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel; + int nr_groups =3D 0; + + perf_evlist__for_each_evsel(evlist, evsel) { + /* + * evsels by default have a nr_members of 1, and they are their + * own leader. If the nr_members is >1 then this is an + * indication of a group. + */ + if (evsel->leader =3D=3D evsel && evsel->nr_members > 1) + nr_groups++; + } + return nr_groups; +} diff --git a/tools/lib/perf/include/internal/evlist.h b/tools/lib/perf/incl= ude/internal/evlist.h index 850f07070036..3339bc2f1765 100644 --- a/tools/lib/perf/include/internal/evlist.h +++ b/tools/lib/perf/include/internal/evlist.h @@ -17,7 +17,6 @@ struct perf_mmap_param; struct perf_evlist { struct list_head entries; int nr_entries; - int nr_groups; bool has_user_cpus; bool needs_map_propagation; /** diff --git a/tools/lib/perf/include/perf/evlist.h b/tools/lib/perf/include/= perf/evlist.h index 9ca399d49bb4..e894b770779e 100644 --- a/tools/lib/perf/include/perf/evlist.h +++ b/tools/lib/perf/include/perf/evlist.h @@ -47,4 +47,5 @@ LIBPERF_API struct perf_mmap *perf_evlist__next_mmap(stru= ct perf_evlist *evlist, (pos) =3D perf_evlist__next_mmap((evlist), (pos), overwrite)) =20 LIBPERF_API void perf_evlist__set_leader(struct perf_evlist *evlist); +LIBPERF_API int perf_evlist__nr_groups(struct perf_evlist *evlist); #endif /* __LIBPERF_EVLIST_H */ diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index a0870c076dc0..234b371b7b9f 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -2474,7 +2474,7 @@ static int __cmd_record(struct record *rec, int argc,= const char **argv) rec->tool.ordered_events =3D false; } =20 - if (!rec->evlist->core.nr_groups) + if (evlist__nr_groups(rec->evlist) =3D=3D 0) perf_header__clear_feat(&session->header, HEADER_GROUP_DESC); =20 if (data->is_pipe) { diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 2ee2ecca208e..6400615b5e98 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1481,7 +1481,7 @@ int cmd_report(int argc, const char **argv) =20 setup_forced_leader(&report, session->evlist); =20 - if (symbol_conf.group_sort_idx && !session->evlist->core.nr_groups) { + if (symbol_conf.group_sort_idx && evlist__nr_groups(session->evlist) =3D= =3D 0) { parse_options_usage(NULL, options, "group-sort-idx", 0); ret =3D -EINVAL; goto error; diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c index ae9223f27cfb..8beb46066034 100644 --- a/tools/perf/tests/bpf.c +++ b/tools/perf/tests/bpf.c @@ -153,7 +153,6 @@ static int do_test(struct bpf_object *obj, int (*func)(= void), } =20 evlist__splice_list_tail(evlist, &parse_state.list); - evlist->core.nr_groups =3D parse_state.nr_groups; =20 evlist__config(evlist, &opts, NULL); =20 diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-event= s.c index 71a5cb343311..ffa6f0a90741 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -53,7 +53,7 @@ static int test__checkevent_tracepoint(struct evlist *evl= ist) struct evsel *evsel =3D evlist__first(evlist); =20 TEST_ASSERT_VAL("wrong number of entries", 1 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 0 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 0 =3D=3D evlist__nr_groups(evli= st)); TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT =3D=3D evsel->core.att= r.type); TEST_ASSERT_VAL("wrong sample_type", PERF_TP_SAMPLE_TYPE =3D=3D evsel->core.attr.sample_type); @@ -66,7 +66,7 @@ static int test__checkevent_tracepoint_multi(struct evlis= t *evlist) struct evsel *evsel; =20 TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1); - TEST_ASSERT_VAL("wrong number of groups", 0 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 0 =3D=3D evlist__nr_groups(evli= st)); =20 evlist__for_each_entry(evlist, evsel) { TEST_ASSERT_VAL("wrong type", @@ -677,7 +677,7 @@ static int test__group1(struct evlist *evlist) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 2 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist__nr_groups(evli= st)); =20 /* instructions:k */ evsel =3D leader =3D evlist__first(evlist); @@ -719,7 +719,7 @@ static int test__group2(struct evlist *evlist) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 3 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist__nr_groups(evli= st)); =20 /* faults + :ku modifier */ evsel =3D leader =3D evlist__first(evlist); @@ -775,7 +775,7 @@ static int test__group3(struct evlist *evlist __maybe_u= nused) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 5 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 2 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 2 =3D=3D evlist__nr_groups(evli= st)); =20 /* group1 syscalls:sys_enter_openat:H */ evsel =3D leader =3D evlist__first(evlist); @@ -868,7 +868,7 @@ static int test__group4(struct evlist *evlist __maybe_u= nused) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 2 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist__nr_groups(evli= st)); =20 /* cycles:u + p */ evsel =3D leader =3D evlist__first(evlist); @@ -912,7 +912,7 @@ static int test__group5(struct evlist *evlist __maybe_u= nused) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 5 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 2 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 2 =3D=3D evlist__nr_groups(evli= st)); =20 /* cycles + G */ evsel =3D leader =3D evlist__first(evlist); @@ -998,7 +998,7 @@ static int test__group_gh1(struct evlist *evlist) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 2 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist__nr_groups(evli= st)); =20 /* cycles + :H group modifier */ evsel =3D leader =3D evlist__first(evlist); @@ -1038,7 +1038,7 @@ static int test__group_gh2(struct evlist *evlist) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 2 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist__nr_groups(evli= st)); =20 /* cycles + :G group modifier */ evsel =3D leader =3D evlist__first(evlist); @@ -1078,7 +1078,7 @@ static int test__group_gh3(struct evlist *evlist) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 2 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist__nr_groups(evli= st)); =20 /* cycles:G + :u group modifier */ evsel =3D leader =3D evlist__first(evlist); @@ -1118,7 +1118,7 @@ static int test__group_gh4(struct evlist *evlist) struct evsel *evsel, *leader; =20 TEST_ASSERT_VAL("wrong number of entries", 2 =3D=3D evlist->core.nr_entri= es); - TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist->core.nr_groups= ); + TEST_ASSERT_VAL("wrong number of groups", 1 =3D=3D evlist__nr_groups(evli= st)); =20 /* cycles:G + :uG group modifier */ evsel =3D leader =3D evlist__first(evlist); diff --git a/tools/perf/tests/pfm.c b/tools/perf/tests/pfm.c index 71b76deb1f92..2e38dfa34b6c 100644 --- a/tools/perf/tests/pfm.c +++ b/tools/perf/tests/pfm.c @@ -76,7 +76,7 @@ static int test__pfm_events(struct test_suite *test __may= be_unused, count_pfm_events(&evlist->core), table[i].nr_events); TEST_ASSERT_EQUAL(table[i].events, - evlist->core.nr_groups, + evlist__nr_groups(evlist), 0); =20 evlist__delete(evlist); @@ -103,22 +103,22 @@ static int test__pfm_group(struct test_suite *test __= maybe_unused, { .events =3D "{instructions}", .nr_events =3D 1, - .nr_groups =3D 1, + .nr_groups =3D 0, }, { .events =3D "{instructions},{}", .nr_events =3D 1, - .nr_groups =3D 1, + .nr_groups =3D 0, }, { .events =3D "{},{instructions}", .nr_events =3D 1, - .nr_groups =3D 1, + .nr_groups =3D 0, }, { .events =3D "{instructions},{instructions}", .nr_events =3D 2, - .nr_groups =3D 2, + .nr_groups =3D 0, }, { .events =3D "{instructions,cycles},{instructions,cycles}", @@ -161,7 +161,7 @@ static int test__pfm_group(struct test_suite *test __ma= ybe_unused, count_pfm_events(&evlist->core), table[i].nr_events); TEST_ASSERT_EQUAL(table[i].events, - evlist->core.nr_groups, + evlist__nr_groups(evlist), table[i].nr_groups); =20 evlist__delete(evlist); diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 817df2504a1e..a5f406c468f8 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -1777,7 +1777,7 @@ bool evlist__exclude_kernel(struct evlist *evlist) */ void evlist__force_leader(struct evlist *evlist) { - if (!evlist->core.nr_groups) { + if (evlist__nr_groups(evlist) =3D=3D 0) { struct evsel *leader =3D evlist__first(evlist); =20 evlist__set_leader(evlist); diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index d89d8f92802b..46cf402add93 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -9,6 +9,7 @@ #include #include #include +#include #include "events_stats.h" #include "evsel.h" #include @@ -255,6 +256,11 @@ static inline struct evsel *evlist__last(struct evlist= *evlist) return container_of(evsel, struct evsel, core); } =20 +static inline int evlist__nr_groups(struct evlist *evlist) +{ + return perf_evlist__nr_groups(&evlist->core); +} + int evlist__strerror_open(struct evlist *evlist, int err, char *buf, size_= t size); int evlist__strerror_mmap(struct evlist *evlist, int err, char *buf, size_= t size); =20 diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 404d816ca124..276870221ce0 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -786,7 +786,7 @@ static int write_pmu_mappings(struct feat_fd *ff, static int write_group_desc(struct feat_fd *ff, struct evlist *evlist) { - u32 nr_groups =3D evlist->core.nr_groups; + u32 nr_groups =3D evlist__nr_groups(evlist); struct evsel *evsel; int ret; =20 @@ -2807,7 +2807,6 @@ static int process_group_desc(struct feat_fd *ff, voi= d *data __maybe_unused) * Rebuild group relationship based on the group_desc */ session =3D container_of(ff->ph, struct perf_session, header); - session->evlist->core.nr_groups =3D nr_groups; =20 i =3D nr =3D 0; evlist__for_each_entry(session->evlist, evsel) { diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 93a90651266f..9ec3c1dc81e0 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -2260,7 +2260,6 @@ int __parse_events(struct evlist *evlist, const char = *str, if (!ret) { struct evsel *last; =20 - evlist->core.nr_groups +=3D parse_state.nr_groups; last =3D evlist__last(evlist); last->cmdline_group_boundary =3D true; =20 diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index fdac44dc696b..767ad1729228 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -122,7 +122,6 @@ struct parse_events_error { struct parse_events_state { struct list_head list; int idx; - int nr_groups; struct parse_events_error *error; struct evlist *evlist; struct list_head *terms; diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index f1b153c72d67..3a04602d2982 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -49,14 +49,6 @@ static void free_list_evsel(struct list_head* list_evsel) free(list_evsel); } =20 -static void inc_group_count(struct list_head *list, - struct parse_events_state *parse_state) -{ - /* Count groups only have more than 1 members */ - if (!list_is_last(list->next, list)) - parse_state->nr_groups++; -} - %} =20 %token PE_START_EVENTS PE_START_TERMS @@ -201,7 +193,6 @@ PE_NAME '{' events '}' { struct list_head *list =3D $3; =20 - inc_group_count(list, _parse_state); /* Takes ownership of $1. */ parse_events__set_leader($1, list); $$ =3D list; @@ -211,7 +202,6 @@ PE_NAME '{' events '}' { struct list_head *list =3D $2; =20 - inc_group_count(list, _parse_state); parse_events__set_leader(NULL, list); $$ =3D list; } diff --git a/tools/perf/util/pfm.c b/tools/perf/util/pfm.c index b59ba825ddc9..6c11914c179f 100644 --- a/tools/perf/util/pfm.c +++ b/tools/perf/util/pfm.c @@ -112,7 +112,6 @@ int parse_libpfm_events_option(const struct option *opt= , const char *str, "cannot close a non-existing event group\n"); goto error; } - evlist->core.nr_groups++; grp_leader =3D NULL; grp_evt =3D -1; } --=20 2.40.0.rc0.216.gc4246ad0f0-goog From nobody Wed Sep 10 01:59:49 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 32D34C678D5 for ; Wed, 8 Mar 2023 08:20:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229808AbjCHIUU (ORCPT ); Wed, 8 Mar 2023 03:20:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34882 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230183AbjCHIT0 (ORCPT ); Wed, 8 Mar 2023 03:19:26 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6801FAFB94 for ; Wed, 8 Mar 2023 00:19:11 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-536a5a0b6e3so164558287b3.10 for ; Wed, 08 Mar 2023 00:19:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678263550; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=x5MPo35xGT8I5no97e54JFoAV8IlgxfgBAbMEiQkE8U=; b=e4ESgZ8ToAIyqrq8dv/6NSbnKuVRTmohRuk7EygZNRLdy/dMiSTxYdYKvas6dsWze6 VHQFO/oAV/sZUgNJ5NatjUIu83tNhajiPfaMjzY5PIhlw5Xiggq3Q3EQ66K1A2OhNbw5 8ABZpeAslQ4uHqXddYwS4vN7+wuw0b+/z1CcZPIUMxTEdtBsnm3jePax3mkUtUkAZOu3 wd3p4dq70Nj/oCZ5hKY1OdBRb2SbtFjwwDpLq6WSfTrs5qWr7u8OJ9zmgY+hi56E+Lvy FQ7lj0RT0C10phT40hj3IrHy4vfRqK6ArEgQVEUXjPhGra33pfdasIoaYRfseS5roSzp 5P4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678263550; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=x5MPo35xGT8I5no97e54JFoAV8IlgxfgBAbMEiQkE8U=; b=6v1JZiZ1Zeet9jA95L2Xdvz6yfnQVNc6LPDU1ZlL+7bBfLvH72O+sFYfgDem0FmmyO VWl9Xo3Bql2DodD2kL78QY6XBoCDyFunqmHdiqge+vU97JYJjL1YQGQ0AtvNm/FXzXtl GbhWHuuehHHgvS4XauLfd5HuZN8PiGYsguaRl7MCWZhHIwoBU0oUQMA2LuOAPGyBuBIj TBr92KdVMnDZfhER/WgNEmB1/OMMujsdHymV7t06bS1AwK2mkX6V/qFiSwDiQmrqwosJ X7WhwaA9OTnLwx4s7IkYErBgcGTizYFqTVvjEURYO0fcYi51jw9ezX6FoplhpWNnM5Is xHpg== X-Gm-Message-State: AO0yUKXXbp0nB5+rinHGAND3CVZlkzBTVHMgD5FfRGtLG/dSSy2mPAAn OmSTKnrRThjGbIFgwsF7H0zGtNOHYiaW X-Google-Smtp-Source: AK7set8wR0JRCbOxXeyoYk1i7vpLK4VrAcyGzkcxx5TBYPyVU6eUjGqAbiFS0FlYYP2ABj6uyumbw0Ed0HOH X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:9a99:fbc4:7488:8b5f]) (user=irogers job=sendgmr) by 2002:a5b:c4e:0:b0:9f2:a1ba:6908 with SMTP id d14-20020a5b0c4e000000b009f2a1ba6908mr8377911ybr.12.1678263550648; Wed, 08 Mar 2023 00:19:10 -0800 (PST) Date: Wed, 8 Mar 2023 00:17:31 -0800 In-Reply-To: <20230308081731.1887278-1-irogers@google.com> Message-Id: <20230308081731.1887278-12-irogers@google.com> Mime-Version: 1.0 References: <20230308081731.1887278-1-irogers@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Subject: [PATCH v3 11/11] perf parse-events: Warn when events are regrouped From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Mark Rutland , Adrian Hunter , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Kan Liang , Zhengjun Xing , Ravi Bangoria , "Steinar H. Gunderson" , Qi Liu , Kim Phillips , Florian Fischer , James Clark , Suzuki Poulouse , Sean Christopherson , Leo Yan , John Garry , Kajol Jain , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use if an event is reordered or the number of groups increases to signal that regrouping has happened and warn about it. Disable the warning in the case wild card PMU names are used and for metrics. Signed-off-by: Ian Rogers --- tools/perf/tests/parse-events.c | 2 +- tools/perf/tests/pmu-events.c | 2 +- tools/perf/util/metricgroup.c | 3 ++- tools/perf/util/parse-events.c | 28 ++++++++++++++++++++-------- tools/perf/util/parse-events.h | 7 ++++--- tools/perf/util/parse-events.y | 1 + 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-event= s.c index ffa6f0a90741..b1c2f0a20306 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -2103,7 +2103,7 @@ static int test_event_fake_pmu(const char *str) =20 parse_events_error__init(&err); perf_pmu__test_parse_init(); - ret =3D __parse_events(evlist, str, &err, &perf_pmu__fake); + ret =3D __parse_events(evlist, str, &err, &perf_pmu__fake, /*warn_if_reor= dered=3D*/true); if (ret) { pr_debug("failed to parse event '%s', err %d, str '%s'\n", str, ret, err.str); diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c index 6ccd413b5983..7f8e86452527 100644 --- a/tools/perf/tests/pmu-events.c +++ b/tools/perf/tests/pmu-events.c @@ -785,7 +785,7 @@ static int check_parse_id(const char *id, struct parse_= events_error *error, */ perf_pmu__test_parse_init(); } - ret =3D __parse_events(evlist, dup, error, fake_pmu); + ret =3D __parse_events(evlist, dup, error, fake_pmu, /*warn_if_reordered= =3D*/true); free(dup); =20 evlist__delete(evlist); diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index de6dd527a2ba..5783f4c2d1ef 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -1441,7 +1441,8 @@ static int parse_ids(bool metric_no_merge, struct per= f_pmu *fake_pmu, } pr_debug("Parsing metric events '%s'\n", events.buf); parse_events_error__init(&parse_error); - ret =3D __parse_events(parsed_evlist, events.buf, &parse_error, fake_pmu); + ret =3D __parse_events(parsed_evlist, events.buf, &parse_error, fake_pmu, + /*warn_if_reordered=3D*/false); if (ret) { parse_events_error__print(&parse_error, events.buf); goto err_out; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 9ec3c1dc81e0..4bb28c32b511 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -2157,11 +2157,13 @@ static int evlist__cmp(void *state, const struct li= st_head *l, const struct list return arch_evlist__cmp(lhs, rhs); } =20 -static void parse_events__sort_events_and_fix_groups(struct list_head *lis= t) +static bool parse_events__sort_events_and_fix_groups(struct list_head *lis= t) { int idx =3D -1; struct evsel *pos, *cur_leader =3D NULL; struct perf_evsel *cur_leaders_grp =3D NULL; + bool idx_changed =3D false; + int orig_num_leaders =3D 0, num_leaders =3D 0; =20 /* * Compute index to insert ungrouped events at. Place them where the @@ -2170,11 +2172,11 @@ static void parse_events__sort_events_and_fix_group= s(struct list_head *list) list_for_each_entry(pos, list, core.node) { const struct evsel *pos_leader =3D evsel__leader(pos); =20 - if (pos !=3D pos_leader || pos->core.nr_members > 1) - continue; + if (pos =3D=3D pos_leader) + orig_num_leaders++; =20 - idx =3D pos->core.idx; - break; + if (idx =3D=3D -1 && pos =3D=3D pos_leader && pos->core.nr_members < 2) + idx =3D pos->core.idx; } =20 /* Sort events. */ @@ -2192,6 +2194,8 @@ static void parse_events__sort_events_and_fix_groups(= struct list_head *list) bool force_grouped =3D arch_evsel__must_be_in_group(pos); =20 /* Reset index and nr_members. */ + if (pos->core.idx !=3D idx) + idx_changed =3D true; pos->core.idx =3D idx++; pos->core.nr_members =3D 0; =20 @@ -2225,12 +2229,18 @@ static void parse_events__sort_events_and_fix_group= s(struct list_head *list) } } list_for_each_entry(pos, list, core.node) { - pos->core.leader->nr_members++; + struct evsel *pos_leader =3D evsel__leader(pos); + + if (pos =3D=3D pos_leader) + num_leaders++; + pos_leader->core.nr_members++; } + return idx_changed || num_leaders !=3D orig_num_leaders; } =20 int __parse_events(struct evlist *evlist, const char *str, - struct parse_events_error *err, struct perf_pmu *fake_pmu) + struct parse_events_error *err, struct perf_pmu *fake_pmu, + bool warn_if_reordered) { struct parse_events_state parse_state =3D { .list =3D LIST_HEAD_INIT(parse_state.list), @@ -2250,7 +2260,9 @@ int __parse_events(struct evlist *evlist, const char = *str, return -1; } =20 - parse_events__sort_events_and_fix_groups(&parse_state.list); + if (parse_events__sort_events_and_fix_groups(&parse_state.list) && + warn_if_reordered && !parse_state.wild_card_pmus) + pr_warning("WARNING: events were regrouped to match PMUs\n"); =20 /* * Add list to the evlist even with errors to allow callers to clean up. diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 767ad1729228..46204c1a7916 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -26,13 +26,13 @@ int parse_events_option(const struct option *opt, const= char *str, int unset); int parse_events_option_new_evlist(const struct option *opt, const char *s= tr, int unset); __attribute__((nonnull(1, 2, 3))) int __parse_events(struct evlist *evlist, const char *str, struct parse_ev= ents_error *error, - struct perf_pmu *fake_pmu); + struct perf_pmu *fake_pmu, bool warn_if_reordered); =20 -__attribute__((nonnull)) +__attribute__((nonnull(1, 2, 3))) static inline int parse_events(struct evlist *evlist, const char *str, struct parse_events_error *err) { - return __parse_events(evlist, str, err, NULL); + return __parse_events(evlist, str, err, /*fake_pmu=3D*/NULL, /*warn_if_re= ordered=3D*/true); } =20 int parse_event(struct evlist *evlist, const char *str); @@ -128,6 +128,7 @@ struct parse_events_state { int stoken; struct perf_pmu *fake_pmu; char *hybrid_pmu_name; + bool wild_card_pmus; }; =20 void parse_events__shrink_config_terms(void); diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 3a04602d2982..4488443e506e 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -323,6 +323,7 @@ event_pmu_name opt_pmu_config if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, /*auto_merge_stats=3D*/true)) { ok++; + parse_state->wild_card_pmus =3D true; } parse_events_terms__delete(terms); } --=20 2.40.0.rc0.216.gc4246ad0f0-goog