From nobody Tue Apr 7 01:53:20 2026 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 927B6C433F5 for ; Mon, 10 Oct 2022 05:36:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231274AbiJJFgN (ORCPT ); Mon, 10 Oct 2022 01:36:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54246 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231246AbiJJFgG (ORCPT ); Mon, 10 Oct 2022 01:36:06 -0400 Received: from mail-pf1-x42e.google.com (mail-pf1-x42e.google.com [IPv6:2607:f8b0:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2D15165C8; Sun, 9 Oct 2022 22:36:05 -0700 (PDT) Received: by mail-pf1-x42e.google.com with SMTP id y1so2733002pfr.3; Sun, 09 Oct 2022 22:36:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=IqmTs8/sjxR4VW7dikRv4ZzGywAqvgIN6RnXpX4I2Jo=; b=kQWkjIoRNTUVJrr5XxB2gmdd4cybLHh7z3juvacMMlcsuyald5iLs0qAh1oMKWF1ap 7At+CSNrHBVNVFGd6jGfiw6HdLHHRflhJMuUCf7ML6oDo+bo80be3IrlTEH5caHnNaJ6 e/kbG2CyRclKPQXRkcY7WJ5D+KLR16NIJ25O0w6LfEj49HXsZ+DMBNt0BUshf08GAIsA rmmqr+QjEDMp4qFZs2XRIuabq07AzoK9FlgFJ6Vb54xKidzlKnDNUPz8CVMGuPz7sISQ I1iOZPyglnSaRbRrSgIDspLdlP8xioyiRbNytT/XY6visyVByDD+BqpuZ7lCiU6rfC76 s2wQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IqmTs8/sjxR4VW7dikRv4ZzGywAqvgIN6RnXpX4I2Jo=; b=EadQnzDpuV/C6tN2hIZ7FsyxNI7atXWr10QqTqXf9V0UQQiKHsABjXE3fy1jYFfhNY xFNwugl3QB2o8nR6RnjNZxJ8zpkHIY+NmA1YEZ7/jb9cU574u5QglVPM9ayPmeWjp6vj C7soSLcylBB1Do7sff5j2srUwbrSHVomrT8tWUm2MQGGWEJSN9mNGrFkaO/w0CNH9Das CzTwQYlfeLX/hYnKLwNeNGub9LiTsZ8N0+2oShmU44dAm0xj0C2W6Nx+0pW9hDme7YE8 A+dp3djr+m1q7upkGg7Nf271jWd8XYvB7ckKKA2oPV9Z2CFIayYW+4aG63i3A6mu3aht Dz+w== X-Gm-Message-State: ACrzQf3+2fzLhWRDR+8iR0khMUztyKyrJQY6vP+73rHGgnlLEr5cfQq3 p+ixSJ11dxNPQzT8MzJb2R0= X-Google-Smtp-Source: AMsMyM5/cp0ZNFNqhjmDC3p1nAUrOCIVEUWfJoepRmT8AXe0HNFOL+b/NsGdB5vby8+KD/WEp/TsNA== X-Received: by 2002:a05:6a00:1a55:b0:557:b7a3:6738 with SMTP id h21-20020a056a001a5500b00557b7a36738mr17926206pfv.61.1665380164590; Sun, 09 Oct 2022 22:36:04 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:04 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 01/19] perf tools: Save evsel->pmu in parse_events() Date: Sun, 9 Oct 2022 22:35:42 -0700 Message-Id: <20221010053600.272854-2-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Now evsel has a pmu pointer, let's save the info and use it like in evsel__find_pmu(). Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/util/evsel.c | 1 + tools/perf/util/parse-events.c | 1 + tools/perf/util/pmu.c | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 76605fde3507..196f8e4859d7 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -467,6 +467,7 @@ struct evsel *evsel__clone(struct evsel *orig) evsel->collect_stat =3D orig->collect_stat; evsel->weak_group =3D orig->weak_group; evsel->use_config_name =3D orig->use_config_name; + evsel->pmu =3D orig->pmu; =20 if (evsel__copy_config_terms(evsel, orig) < 0) goto out_err; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 437389dacf48..9e704841273d 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -263,6 +263,7 @@ __add_event(struct list_head *list, int *idx, evsel->core.own_cpus =3D perf_cpu_map__get(cpus); evsel->core.requires_cpu =3D pmu ? pmu->is_uncore : false; evsel->auto_merge_stats =3D auto_merge_stats; + evsel->pmu =3D pmu; =20 if (name) evsel->name =3D strdup(name); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 74a2cafb4e8d..15bf5943083a 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1048,11 +1048,15 @@ struct perf_pmu *evsel__find_pmu(struct evsel *evse= l) { struct perf_pmu *pmu =3D NULL; =20 + if (evsel->pmu) + return evsel->pmu; + while ((pmu =3D perf_pmu__scan(pmu)) !=3D NULL) { if (pmu->type =3D=3D evsel->core.attr.type) break; } =20 + evsel->pmu =3D pmu; return pmu; } =20 --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 83198C433F5 for ; Mon, 10 Oct 2022 05:36:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231315AbiJJFgR (ORCPT ); Mon, 10 Oct 2022 01:36:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231173AbiJJFgH (ORCPT ); Mon, 10 Oct 2022 01:36:07 -0400 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 95A23DEE9; Sun, 9 Oct 2022 22:36:06 -0700 (PDT) Received: by mail-pj1-x1031.google.com with SMTP id gf8so8965460pjb.5; Sun, 09 Oct 2022 22:36:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=dMQ9Nr134jTsiGubldmik2SSGo5GiaQNz3NaNpTchwQ=; b=VRkFyJlBI5IZ1Et9MvJK2iqInmhfh7AoF/MlT7QEroFzWtAnIqRwqxkUZoW2ixzOIz ZDMrrTmBF9kJRdPlIP3v3ictLW7oqdkX6VQdbRpy9pKXwesfzzMR1FTmESuLUdneEya7 16+FhT4SBVCwLQV6hlHvSBEKqG7MXjyTZFQT5c88DzXt6dNSKwV/xnNWLtj2wvzVTwyu Ko6Ua6HQ54aITfo53Um8aUfw/svAUro1MTXO/OMgTG39yBXxC6jhnDDmmYozMUTO9Lp2 wzr3BO9t9QruOoLHp5HW/Pkc6/HBV3kNMhTGid/N14IlHVhsSn+/kClLiSAvPB9UUcde 04+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dMQ9Nr134jTsiGubldmik2SSGo5GiaQNz3NaNpTchwQ=; b=O9F7g13DJ4afVvdGyfRBCQPenh+m1DhoU5JW/Un75qcPU6K9YVlmnyJTZdaEZfhmyJ GcOO7MTUCxylziYanj6dpGe4k2qrc/QYWFBcpwRNnDRoIqcu5zUNAClg7VRt8eTN2qbx 4SsiJuf5LmVWR2gwsAok0jXQAKLnTc3eJnQ2DVxyEspN6E8xFCsWO41bGZZzKMR6C+Qo VpajHHaHCzTUVKTFyPdwcyA8u+3dlbK/5KV+7NZauTnToHxqaT7b3r5C0owKYwfVa87f 09Fb6GKZ9g2Hcwswi++SNAAoASI2boUBvpDtd87jICKXNMFF/zX40QPjCQO1tPEfVItI ccsw== X-Gm-Message-State: ACrzQf28VjVEKm+r/2f3fm+WaTWwsHADYxfIfhTXHumGY8bwW/QPZWME iZcNpH4YPTdnZpHufLu62Y4Om159CVk= X-Google-Smtp-Source: AMsMyM5iFsnTvLuvizpAJciGkx89svCIdMIVWr3MaIlqyjVda2kbJs00dSZY4Jqye98bczq+VgyQHA== X-Received: by 2002:a17:902:e88b:b0:17f:8514:cf5f with SMTP id w11-20020a170902e88b00b0017f8514cf5fmr17599210plg.163.1665380166013; Sun, 09 Oct 2022 22:36:06 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:05 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 02/19] perf tools: Use pmu info in evsel__is_hybrid() Date: Sun, 9 Oct 2022 22:35:43 -0700 Message-Id: <20221010053600.272854-3-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" If evsel has pmu, it can use pmu->is_hybrid directly. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/util/evsel.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 196f8e4859d7..a6ea91c72659 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -3132,6 +3132,9 @@ void evsel__zero_per_pkg(struct evsel *evsel) =20 bool evsel__is_hybrid(struct evsel *evsel) { + if (evsel->pmu) + return evsel->pmu->is_hybrid; + return evsel->pmu_name && perf_pmu__is_hybrid(evsel->pmu_name); } =20 --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 B8504C433F5 for ; Mon, 10 Oct 2022 05:36:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231322AbiJJFgT (ORCPT ); Mon, 10 Oct 2022 01:36:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54254 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231260AbiJJFgI (ORCPT ); Mon, 10 Oct 2022 01:36:08 -0400 Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 23FA7C2D; Sun, 9 Oct 2022 22:36:08 -0700 (PDT) Received: by mail-pj1-x102f.google.com with SMTP id x31-20020a17090a38a200b0020d2afec803so2401177pjb.2; Sun, 09 Oct 2022 22:36:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=nF8kS7IC9JmJWu9CYOcUcUJa+w2IlroRMDwbSXBYpmk=; b=Yc8pHoS+9/AC7UuJ/pmqRT8wRDxYpXIm/mBBrtek1R4uxS3iNwqlKwu1zHWW1Qu0CV Yq/gUBUOtklBxVI2zT+MWCz2apKJLZfLGDciPLGSjGm5RSlq1TkEC3Ef9PvJrJ7fhgqY 4KkmReo3mGiTMGxf9pUfahS04mxmZC4hrmms9X/yuWwJ7W1HngMEKNBTuVaK3rBgGBXw Y+RjAbosp8GJYpY0USrkDGfc6ocNBDs+WUPS9Oni6lgMuhdI9j8BIDlfH5ktepflbz5M W++eC12Z/13CeTGu/0acXueD6NI2VN1pvut+eSSBLutqXGv8c5ERnrLiDIZumx+kuEej i/GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=nF8kS7IC9JmJWu9CYOcUcUJa+w2IlroRMDwbSXBYpmk=; b=w1zeFDEEMpsxwq762K1u6y/tF/iy9j4ejJikwQ1Te65bmCmmsIDkvdP4IbxPpnPuQc 3Hnw9U5JWvkj5jiFNQa12aZJStGEc0+yAJ/8PpT44FUwzCWylM3+nptQCkNGduCmyuxa hVbVYYUE54ZNdP11eqxdNnRjESqxok2SDZ53WJUj06vFJFHOzFFMrlaGp8G21G6bG8LG xx9n4hsw92OG2CDRHQw+7FJhb90m7/iS4FRTmXiw3KW1RbH2f/fzzT2G+5BSnOdxWB2c tZ4W4awHq6EyqW4A0FdGzXIhxb7w9ohpmt+S/4vA3hBAgVBV2Sl+IuxBw4tWcTCOXPHL ek6w== X-Gm-Message-State: ACrzQf18CwZfT2ltAh/3QaZ1J3rRRbZbijtvOZ+fI1EGqqjhDbfVU3Cl dHeHuR72qNbpVZ5mHowhtlM= X-Google-Smtp-Source: AMsMyM7GovfJMFHHeCX8D2vgcYLfofnuje5OANpz82zMrTWJMMclqmfitALDMVe3Gvk2ZW7Cqf6/FA== X-Received: by 2002:a17:902:cf03:b0:179:b7fe:dc90 with SMTP id i3-20020a170902cf0300b00179b7fedc90mr17863467plg.112.1665380167525; Sun, 09 Oct 2022 22:36:07 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:07 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 03/19] perf stat: Use evsel__is_hybrid() more Date: Sun, 9 Oct 2022 22:35:44 -0700 Message-Id: <20221010053600.272854-4-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" In the stat-display code, it needs to check if the current evsel is hybrid but it uses perf_pmu__has_hybrid() which can return true for non-hybrid event too. I think it's better to use evsel__is_hybrid(). Also remove a NULL check for the 'config' parameter in the hybrid_merge() since it's called after config->no_merge check. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/util/stat-display.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index 5c47ee9963a7..4113aa86772f 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -704,7 +704,7 @@ static void uniquify_event_name(struct evsel *counter) counter->name =3D new_name; } } else { - if (perf_pmu__has_hybrid()) { + if (evsel__is_hybrid(counter)) { ret =3D asprintf(&new_name, "%s/%s/", counter->pmu_name, counter->name); } else { @@ -744,26 +744,14 @@ static void collect_all_aliases(struct perf_stat_conf= ig *config, struct evsel *c } } =20 -static bool is_uncore(struct evsel *evsel) -{ - struct perf_pmu *pmu =3D evsel__find_pmu(evsel); - - return pmu && pmu->is_uncore; -} - -static bool hybrid_uniquify(struct evsel *evsel) -{ - return perf_pmu__has_hybrid() && !is_uncore(evsel); -} - static bool hybrid_merge(struct evsel *counter, struct perf_stat_config *c= onfig, bool check) { - if (hybrid_uniquify(counter)) { + if (evsel__is_hybrid(counter)) { if (check) - return config && config->hybrid_merge; + return config->hybrid_merge; else - return config && !config->hybrid_merge; + return !config->hybrid_merge; } =20 return false; --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 D8E8CC433F5 for ; Mon, 10 Oct 2022 05:36:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231362AbiJJFgX (ORCPT ); Mon, 10 Oct 2022 01:36:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54282 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231277AbiJJFgK (ORCPT ); Mon, 10 Oct 2022 01:36:10 -0400 Received: from mail-pf1-x436.google.com (mail-pf1-x436.google.com [IPv6:2607:f8b0:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C064165C8; Sun, 9 Oct 2022 22:36:09 -0700 (PDT) Received: by mail-pf1-x436.google.com with SMTP id 67so9844720pfz.12; Sun, 09 Oct 2022 22:36:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=t8ZKVhWaIjuVaVfYj0CJ3e9zMlA2k2aSnXspmMO77sQ=; b=I0tB/bFds4UFrcssdMUyKIEqbRqQGTJwgFYNSDFBQ/RdNnPqo2EXRSS3ME3pEvDV/v 5Luf0FaKq59S2zEZjhPiCABZ56GgchlGVP84Xi+vCKi6XI8ONUdP4YVGTLFBL0MtWVA8 ZVgf4cej+dpu1XyH0rTvN1/WKlo5cHKfQdh2y4Z1sbd8AfyZCtQsHJjgsyTZOUAdel2n n4P/JsnrUBrZ4wEsiaNIeH13VdT5MxekCY+liCiUp+/25bDA/UpdWOxR2eDlQ+WZW330 e65eQQ+vK6tAuIO2k4f+I8g7zGoPkf2gojatVxcjdwo8qUr+ZyblaH1XyecssPQGKzUx HI+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=t8ZKVhWaIjuVaVfYj0CJ3e9zMlA2k2aSnXspmMO77sQ=; b=3MjGFwrQYq+ZvZOuuwJ9KNdh8l2KeiF6QGa5evu/2uwsuHKtn9tqMJwy4l/bA3yqxA Dj/6XKulO5UPhpiK3DpdDd+Fp+K7QaTlMXftUT48eScmkE3w4QQtH+DM0xoP5k+K6tP1 n8Jb/EIt4s/oIBpVSZhz6cTkWc0OcyGoTIGtWEuXnpzFrvfDKfz3chpywwKAfzqnajFI O2GJ7Jfl82q0gzgW5N9RD2BKNCArbsruCfXy5s7DDojZQ2Je4E8ZGYfztbpuMziQm+3V LXR06F3t5iBJCEVZuyrJFbMOfCKK6Fcina7vmuog8Cizf/xqePPa+cnbsYPj0v2WaKVa 1vtQ== X-Gm-Message-State: ACrzQf1VN7v6TJq7XVKN42ceQx64kMwugFNr2647ExiamHPFcr0Xo0kQ auLaqVIwX8s1XwMk3ROREzE= X-Google-Smtp-Source: AMsMyM61/X2CV2W4aPiQIW4rNOWGzMkamKLel+DW2oOBVnH5Bg5wOOfjTOhhoLbKGh+2QMefO9Hf1g== X-Received: by 2002:a05:6a00:1486:b0:557:f3c7:219f with SMTP id v6-20020a056a00148600b00557f3c7219fmr18414114pfu.0.1665380169122; Sun, 09 Oct 2022 22:36:09 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:08 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 04/19] perf stat: Add aggr id for global mode Date: Sun, 9 Oct 2022 22:35:45 -0700 Message-Id: <20221010053600.272854-5-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" To make the code simpler, I'd like to use the same aggregation code for the global mode. We can simply add an id function to return cpu 0 and use print_aggr(). No functional change intended. Signed-off-by: Namhyung Kim --- tools/perf/builtin-stat.c | 39 ++++++++++++++++++++++++++++++++-- tools/perf/util/cpumap.c | 10 +++++++++ tools/perf/util/cpumap.h | 6 +++++- tools/perf/util/stat-display.c | 9 ++------ 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 265b05157972..144bb3a657f2 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1330,6 +1330,15 @@ static struct aggr_cpu_id perf_stat__get_node(struct= perf_stat_config *config __ return aggr_cpu_id__node(cpu, /*data=3D*/NULL); } =20 +static struct aggr_cpu_id perf_stat__get_global(struct perf_stat_config *c= onfig __maybe_unused, + struct perf_cpu cpu __maybe_unused) +{ + struct aggr_cpu_id id =3D aggr_cpu_id__empty(); + + id.cpu =3D (struct perf_cpu){ .cpu =3D 0 }; + return id; +} + static struct aggr_cpu_id perf_stat__get_aggr(struct perf_stat_config *con= fig, aggr_get_id_t get_id, struct perf_cpu cpu) { @@ -1366,6 +1375,12 @@ static struct aggr_cpu_id perf_stat__get_node_cached= (struct perf_stat_config *co return perf_stat__get_aggr(config, perf_stat__get_node, cpu); } =20 +static struct aggr_cpu_id perf_stat__get_global_cached(struct perf_stat_co= nfig *config, + struct perf_cpu cpu) +{ + return perf_stat__get_aggr(config, perf_stat__get_global, cpu); +} + static bool term_percore_set(void) { struct evsel *counter; @@ -1395,6 +1410,7 @@ static aggr_cpu_id_get_t aggr_mode__get_aggr(enum agg= r_mode aggr_mode) =20 return NULL; case AGGR_GLOBAL: + return aggr_cpu_id__global; case AGGR_THREAD: case AGGR_UNSET: case AGGR_MAX: @@ -1420,6 +1436,7 @@ static aggr_get_id_t aggr_mode__get_id(enum aggr_mode= aggr_mode) } return NULL; case AGGR_GLOBAL: + return perf_stat__get_global_cached; case AGGR_THREAD: case AGGR_UNSET: case AGGR_MAX: @@ -1535,6 +1552,16 @@ static struct aggr_cpu_id perf_env__get_node_aggr_by= _cpu(struct perf_cpu cpu, vo return id; } =20 +static struct aggr_cpu_id perf_env__get_global_aggr_by_cpu(struct perf_cpu= cpu __maybe_unused, + void *data __maybe_unused) +{ + struct aggr_cpu_id id =3D aggr_cpu_id__empty(); + + /* it always aggregates to the cpu 0 */ + id.cpu =3D (struct perf_cpu){ .cpu =3D 0 }; + return id; +} + static struct aggr_cpu_id perf_stat__get_socket_file(struct perf_stat_conf= ig *config __maybe_unused, struct perf_cpu cpu) { @@ -1558,6 +1585,12 @@ static struct aggr_cpu_id perf_stat__get_node_file(s= truct perf_stat_config *conf return perf_env__get_node_aggr_by_cpu(cpu, &perf_stat.session->header.env= ); } =20 +static struct aggr_cpu_id perf_stat__get_global_file(struct perf_stat_conf= ig *config __maybe_unused, + struct perf_cpu cpu) +{ + return perf_env__get_global_aggr_by_cpu(cpu, &perf_stat.session->header.e= nv); +} + static aggr_cpu_id_get_t aggr_mode__get_aggr_file(enum aggr_mode aggr_mode) { switch (aggr_mode) { @@ -1569,8 +1602,9 @@ static aggr_cpu_id_get_t aggr_mode__get_aggr_file(enu= m aggr_mode aggr_mode) return perf_env__get_core_aggr_by_cpu; case AGGR_NODE: return perf_env__get_node_aggr_by_cpu; - case AGGR_NONE: case AGGR_GLOBAL: + return perf_env__get_global_aggr_by_cpu; + case AGGR_NONE: case AGGR_THREAD: case AGGR_UNSET: case AGGR_MAX: @@ -1590,8 +1624,9 @@ static aggr_get_id_t aggr_mode__get_id_file(enum aggr= _mode aggr_mode) return perf_stat__get_core_file; case AGGR_NODE: return perf_stat__get_node_file; - case AGGR_NONE: case AGGR_GLOBAL: + return perf_stat__get_global_file; + case AGGR_NONE: case AGGR_THREAD: case AGGR_UNSET: case AGGR_MAX: diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c index 8486ca3bec75..60209fe87456 100644 --- a/tools/perf/util/cpumap.c +++ b/tools/perf/util/cpumap.c @@ -354,6 +354,16 @@ struct aggr_cpu_id aggr_cpu_id__node(struct perf_cpu c= pu, void *data __maybe_unu return id; } =20 +struct aggr_cpu_id aggr_cpu_id__global(struct perf_cpu cpu, void *data __m= aybe_unused) +{ + struct aggr_cpu_id id =3D aggr_cpu_id__empty(); + + /* it always aggregates to the cpu 0 */ + cpu.cpu =3D 0; + id.cpu =3D cpu; + return id; +} + /* setup simple routines to easily access node numbers given a cpu number = */ static int get_max_num(char *path, int *max) { diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h index 4a6d029576ee..b2ff648bc417 100644 --- a/tools/perf/util/cpumap.h +++ b/tools/perf/util/cpumap.h @@ -133,5 +133,9 @@ struct aggr_cpu_id aggr_cpu_id__cpu(struct perf_cpu cpu= , void *data); * cpu. The function signature is compatible with aggr_cpu_id_get_t. */ struct aggr_cpu_id aggr_cpu_id__node(struct perf_cpu cpu, void *data); - +/** + * aggr_cpu_id__global - Create an aggr_cpu_id for global aggregation. + * The function signature is compatible with aggr_cpu_id_get_t. + */ +struct aggr_cpu_id aggr_cpu_id__global(struct perf_cpu cpu, void *data); #endif /* __PERF_CPUMAP_H */ diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index 4113aa86772f..1d8e585df4ad 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -1477,13 +1477,8 @@ void evlist__print_counters(struct evlist *evlist, s= truct perf_stat_config *conf if (config->iostat_run) iostat_print_counters(evlist, config, ts, prefix =3D buf, print_counter_aggr); - else { - evlist__for_each_entry(evlist, counter) { - print_counter_aggr(config, counter, prefix); - } - if (metric_only) - fputc('\n', config->output); - } + else + print_aggr(config, evlist, prefix); break; case AGGR_NONE: if (metric_only) --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 6FA25C433FE for ; Mon, 10 Oct 2022 05:36:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231400AbiJJFg2 (ORCPT ); Mon, 10 Oct 2022 01:36:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231287AbiJJFgM (ORCPT ); Mon, 10 Oct 2022 01:36:12 -0400 Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1DD951CB2C; Sun, 9 Oct 2022 22:36:11 -0700 (PDT) Received: by mail-pl1-x633.google.com with SMTP id l1so9407913pld.13; Sun, 09 Oct 2022 22:36:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=NPBgQNqRZtpAbQmaSkms1iOgPMJfmf2295vWcO4HGdg=; b=ApLJlc+Ix3qfcppeuD1PJdh2HOPpBlJxyvKb9/8rSwlQY/gaSWDcqLZifueX7kdAPN mAh1NPi+i+8YkPNF/fA+8eW13IZ/Sz1iSrYft/t55PIcYjwtD7yGD8c///ZPPYmf74Fm GsEt2ZPA1YSc7c06AJRZ12OarKTsyhDD5aDIcfR1Y7/5lFKRP8jznDof7SCW8HwWOSfb wpMAfbwngVdlARdRRj/+dy9e6/MZ0+LAZE+w6dI+Mi1dWIJTeimOT+1INTvv1r9H718K +inWassOkK1/lhOXNJ6XSNzsLOqPQvEZw8USUr/HK6LsvkD4PZhXGF5oMaXHErQ+RiSx dOXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NPBgQNqRZtpAbQmaSkms1iOgPMJfmf2295vWcO4HGdg=; b=AUvr6ot3owT3qkAvsImvYIJpDW0Gg5y8Gw1fXIEV3EFFssc+vfeZPF9uQ0YZJ8qFst 93X+m0OPPYXvxO1MF0ERRb3mXsrBd2BIP6IA3MUmM8CqjoXKmHbiEltMQ78r0zegCrQw 0LuMl3DswFX15YJgRaf93zo9x+aXllnahSXwHYHNdzJpgn5fvgde0KDkERt/uho1Qf8Y tOpJ+nqNHcVieYF5J9mgDRa2qP/Gkujsmmi5RswXl3hAf/F4T3dqrxKQnDF+nUDWhnIh ffJBZ681yK2LUgyFT7qWmZXv7DM9dc4enQOEE8sPAw2OlMoAikySPDqE8uezkxo2UKMa mcCA== X-Gm-Message-State: ACrzQf2ikdroolmwDpDQPIOeUTxIBgWf7eUSKQ+QdSz9zzySCuywdAvl Aqs2llbO/5mY0lKGmXnP7n4= X-Google-Smtp-Source: AMsMyM4G0Hdg4n7vniUkPHdmg2pwQ2u4cXhoXPU7Ky0/3Zsn6qsl50EE/4LMkU4Wk8QLHn/ZmFefSQ== X-Received: by 2002:a17:902:db12:b0:178:1f91:74e6 with SMTP id m18-20020a170902db1200b001781f9174e6mr18073255plx.100.1665380170545; Sun, 09 Oct 2022 22:36:10 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:10 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 05/19] perf stat: Add cpu aggr id for no aggregation mode Date: Sun, 9 Oct 2022 22:35:46 -0700 Message-Id: <20221010053600.272854-6-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Likewise, add an aggr_id for cpu for none aggregation mode. This is not used actually yet but later code will use to unify the aggregation code. No functional change intended. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/builtin-stat.c | 48 +++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 144bb3a657f2..b00ef20aef5b 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1339,6 +1339,12 @@ static struct aggr_cpu_id perf_stat__get_global(stru= ct perf_stat_config *config return id; } =20 +static struct aggr_cpu_id perf_stat__get_cpu(struct perf_stat_config *conf= ig __maybe_unused, + struct perf_cpu cpu) +{ + return aggr_cpu_id__cpu(cpu, /*data=3D*/NULL); +} + static struct aggr_cpu_id perf_stat__get_aggr(struct perf_stat_config *con= fig, aggr_get_id_t get_id, struct perf_cpu cpu) { @@ -1381,6 +1387,12 @@ static struct aggr_cpu_id perf_stat__get_global_cach= ed(struct perf_stat_config * return perf_stat__get_aggr(config, perf_stat__get_global, cpu); } =20 +static struct aggr_cpu_id perf_stat__get_cpu_cached(struct perf_stat_confi= g *config, + struct perf_cpu cpu) +{ + return perf_stat__get_aggr(config, perf_stat__get_cpu, cpu); +} + static bool term_percore_set(void) { struct evsel *counter; @@ -1407,8 +1419,7 @@ static aggr_cpu_id_get_t aggr_mode__get_aggr(enum agg= r_mode aggr_mode) case AGGR_NONE: if (term_percore_set()) return aggr_cpu_id__core; - - return NULL; + return aggr_cpu_id__cpu;; case AGGR_GLOBAL: return aggr_cpu_id__global; case AGGR_THREAD: @@ -1431,10 +1442,9 @@ static aggr_get_id_t aggr_mode__get_id(enum aggr_mod= e aggr_mode) case AGGR_NODE: return perf_stat__get_node_cached; case AGGR_NONE: - if (term_percore_set()) { + if (term_percore_set()) return perf_stat__get_core_cached; - } - return NULL; + return perf_stat__get_cpu_cached; case AGGR_GLOBAL: return perf_stat__get_global_cached; case AGGR_THREAD: @@ -1544,6 +1554,26 @@ static struct aggr_cpu_id perf_env__get_core_aggr_by= _cpu(struct perf_cpu cpu, vo return id; } =20 +static struct aggr_cpu_id perf_env__get_cpu_aggr_by_cpu(struct perf_cpu cp= u, void *data) +{ + struct perf_env *env =3D data; + struct aggr_cpu_id id =3D aggr_cpu_id__empty(); + + if (cpu.cpu !=3D -1) { + /* + * core_id is relative to socket and die, + * we need a global id. So we set + * socket, die id and core id + */ + id.socket =3D env->cpu[cpu.cpu].socket_id; + id.die =3D env->cpu[cpu.cpu].die_id; + id.core =3D env->cpu[cpu.cpu].core_id; + id.cpu =3D cpu; + } + + return id; +} + static struct aggr_cpu_id perf_env__get_node_aggr_by_cpu(struct perf_cpu c= pu, void *data) { struct aggr_cpu_id id =3D aggr_cpu_id__empty(); @@ -1579,6 +1609,12 @@ static struct aggr_cpu_id perf_stat__get_core_file(s= truct perf_stat_config *conf return perf_env__get_core_aggr_by_cpu(cpu, &perf_stat.session->header.env= ); } =20 +static struct aggr_cpu_id perf_stat__get_cpu_file(struct perf_stat_config = *config __maybe_unused, + struct perf_cpu cpu) +{ + return perf_env__get_cpu_aggr_by_cpu(cpu, &perf_stat.session->header.env); +} + static struct aggr_cpu_id perf_stat__get_node_file(struct perf_stat_config= *config __maybe_unused, struct perf_cpu cpu) { @@ -1605,6 +1641,7 @@ static aggr_cpu_id_get_t aggr_mode__get_aggr_file(enu= m aggr_mode aggr_mode) case AGGR_GLOBAL: return perf_env__get_global_aggr_by_cpu; case AGGR_NONE: + return perf_env__get_cpu_aggr_by_cpu; case AGGR_THREAD: case AGGR_UNSET: case AGGR_MAX: @@ -1627,6 +1664,7 @@ static aggr_get_id_t aggr_mode__get_id_file(enum aggr= _mode aggr_mode) case AGGR_GLOBAL: return perf_stat__get_global_file; case AGGR_NONE: + return perf_stat__get_cpu_file; case AGGR_THREAD: case AGGR_UNSET: case AGGR_MAX: --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 45A07C433FE for ; Mon, 10 Oct 2022 05:36:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231416AbiJJFgb (ORCPT ); Mon, 10 Oct 2022 01:36:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231294AbiJJFgP (ORCPT ); Mon, 10 Oct 2022 01:36:15 -0400 Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CCB511D0E7; Sun, 9 Oct 2022 22:36:12 -0700 (PDT) Received: by mail-pj1-x1029.google.com with SMTP id h12so3249024pjk.0; Sun, 09 Oct 2022 22:36:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=5DXTY41ddKxdcq29BADTCjhKr9aBOk2Cqelh2Y8ODfo=; b=Dqk6DD9wo5nb3PE+BcSytODfcs2WlweFTK8+DoMDvemAlT8uHjolY3M6l2JK4SLqr9 ypP+Bbx2x+WdOvugY+LeMN7vU1Aupw7EHH4cci8PYkgdZ++l7Agf8fzPwlBmfwOTq2R9 bWHf8ufgBoA3Ol5DErGH0vlj9tfI/KLJUCDS4m8tMbxv6ITCF9fnlT5AqRDYTVXWVdc6 gY9yHpA6wWSyQnTv7iqkZA3OssJh0QVWh82dIFa+/SmBYFX3LdCR4djot/WL74cCY+vc Lk9yJh17LiOJSL438ABrMEHWzQ1ukTEaXAPs4DI2UIpLhqSu8IoFjO4uox6Nr61KucwU zMrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5DXTY41ddKxdcq29BADTCjhKr9aBOk2Cqelh2Y8ODfo=; b=0MdXiq3ZVYxN9ZQLHcNePX39aSUZYHgSqGdj8/hDsTEGTbO+AgPf4ocedtDRkP7rSS lFEUn+EUdgTbLy/5F88+fbyi+8vNy5hCGnDItipNMFAFFyVflNrsuXOIAKBMNB/UwXXY rsgCBpTbudW0AVKJSZXqyhJda2Vec6d4IzSxEhNBAZeQSSQznGCBFtfvZtHxBrljEp/r 636l9sb5gWNlF5fv6kvD73SxBk5tWXdbnEVw9gepz9+74bzTgCRsrfIEOjTI3fkkD0o6 htSGoOVUZAvln+jb/pKxKFB+gOJ9fC6xfxveO+N18jYyuf5ZGgftdJJMhv0aoo5orVaK OXgA== X-Gm-Message-State: ACrzQf0Wy8BpS6NlxjHtG0tHVPrgH1B7JqE8gU2ZS1rZ1kDa6/bDukqy xCEFuJFvn25XAZdWeYJXkI8= X-Google-Smtp-Source: AMsMyM7gsllDbY5t2sT339PolgW0VloOjokCqTz41Wvhz02R2kIlGgQ4o06oFcgBOTAyDOsJkx3F6g== X-Received: by 2002:a17:90b:1e0f:b0:203:2308:2ae6 with SMTP id pg15-20020a17090b1e0f00b0020323082ae6mr18844414pjb.187.1665380172002; Sun, 09 Oct 2022 22:36:12 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:11 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 06/19] perf stat: Add 'needs_sort' argument to cpu_aggr_map__new() Date: Sun, 9 Oct 2022 22:35:47 -0700 Message-Id: <20221010053600.272854-7-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" In case of no aggregation, it needs to keep the original (cpu) ordering in the aggr_map so that it can be in sync with the cpu map. This will make the code easier to handle AGGR_NONE similar to others. Signed-off-by: Namhyung Kim --- tools/perf/builtin-stat.c | 7 +++++-- tools/perf/util/cpumap.c | 6 ++++-- tools/perf/util/cpumap.h | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index b00ef20aef5b..e5ddf60ab31d 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1461,8 +1461,9 @@ static int perf_stat_init_aggr_mode(void) aggr_cpu_id_get_t get_id =3D aggr_mode__get_aggr(stat_config.aggr_mode); =20 if (get_id) { + bool needs_sort =3D stat_config.aggr_mode !=3D AGGR_NONE; stat_config.aggr_map =3D cpu_aggr_map__new(evsel_list->core.user_request= ed_cpus, - get_id, /*data=3D*/NULL); + get_id, /*data=3D*/NULL, needs_sort); if (!stat_config.aggr_map) { pr_err("cannot build %s map", aggr_mode__string[stat_config.aggr_mode]); return -1; @@ -1677,11 +1678,13 @@ static int perf_stat_init_aggr_mode_file(struct per= f_stat *st) { struct perf_env *env =3D &st->session->header.env; aggr_cpu_id_get_t get_id =3D aggr_mode__get_aggr_file(stat_config.aggr_mo= de); + bool needs_sort =3D stat_config.aggr_mode !=3D AGGR_NONE; =20 if (!get_id) return 0; =20 - stat_config.aggr_map =3D cpu_aggr_map__new(evsel_list->core.user_requeste= d_cpus, get_id, env); + stat_config.aggr_map =3D cpu_aggr_map__new(evsel_list->core.user_requeste= d_cpus, + get_id, env, needs_sort); if (!stat_config.aggr_map) { pr_err("cannot build %s map", aggr_mode__string[stat_config.aggr_mode]); return -1; diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c index 60209fe87456..6e3fcf523de9 100644 --- a/tools/perf/util/cpumap.c +++ b/tools/perf/util/cpumap.c @@ -234,7 +234,7 @@ static int aggr_cpu_id__cmp(const void *a_pointer, cons= t void *b_pointer) =20 struct cpu_aggr_map *cpu_aggr_map__new(const struct perf_cpu_map *cpus, aggr_cpu_id_get_t get_id, - void *data) + void *data, bool needs_sort) { int idx; struct perf_cpu cpu; @@ -270,8 +270,10 @@ struct cpu_aggr_map *cpu_aggr_map__new(const struct pe= rf_cpu_map *cpus, if (trimmed_c) c =3D trimmed_c; } + /* ensure we process id in increasing order */ - qsort(c->map, c->nr, sizeof(struct aggr_cpu_id), aggr_cpu_id__cmp); + if (needs_sort) + qsort(c->map, c->nr, sizeof(struct aggr_cpu_id), aggr_cpu_id__cmp); =20 return c; =20 diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h index b2ff648bc417..da28b3146ef9 100644 --- a/tools/perf/util/cpumap.h +++ b/tools/perf/util/cpumap.h @@ -97,7 +97,7 @@ typedef struct aggr_cpu_id (*aggr_cpu_id_get_t)(struct pe= rf_cpu cpu, void *data) */ struct cpu_aggr_map *cpu_aggr_map__new(const struct perf_cpu_map *cpus, aggr_cpu_id_get_t get_id, - void *data); + void *data, bool needs_sort); =20 bool aggr_cpu_id__equal(const struct aggr_cpu_id *a, const struct aggr_cpu= _id *b); bool aggr_cpu_id__is_empty(const struct aggr_cpu_id *a); --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 F1DCBC433F5 for ; Mon, 10 Oct 2022 05:36:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231430AbiJJFge (ORCPT ); Mon, 10 Oct 2022 01:36:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231283AbiJJFgP (ORCPT ); Mon, 10 Oct 2022 01:36:15 -0400 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4367D32DA0; Sun, 9 Oct 2022 22:36:14 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id z20so9429005plb.10; Sun, 09 Oct 2022 22:36:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=82fdBXEXmwLSz+/ZriZh/JUm9OSuSmvUd7c6dWjnfLE=; b=glK54UMYibgzSu3OSDWgJA8I7assPSVRp98H2g5yk8gOYfTQEXwmdeb7E6nkcE/VV9 qgoQ/zPL3ww6Q/bboMc1pus+5RL8ZYC0nQsb6GrU9EjBvitToWD5xCowio3slnf0sr3g OiWAsSRiIa1KwX+w5pF1BW+91W8QnXHeYXBq7Bi7603OD3BJBk1Ed2AEKmMI+ezB6XpE sTYqkB7YfV570O5eCXejjtN+JpyxkyazTSeafhvajaErSrkX7tVTaP8/XG4QpqK7Org2 /5z9YG5PoxrUPWf2t60gJNl5M+4gG5JkTsaYil3Xkh+T+AcBQxgJiLH/rC51+HQafi5V jS+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=82fdBXEXmwLSz+/ZriZh/JUm9OSuSmvUd7c6dWjnfLE=; b=4MIDTjs00yf5XzPdKrBRIAUrTvEJ4l5WhGYbmvmT880hQbV2uD1m0Z1TbK3I4wWjjJ XQQibakd37w9/mVOo2Q97OqI9Onn96TpjAk12rrq5yf6fH7nN3pwS2FA24C6AqF4K+e9 rkfUOzLMOFjv8sN8vK5PgWKGmkhnzbkQxJmoThozbdpIUQWkdHowOPfqU5OQ+7g6bNaq aOMYRuvdtvXWJIzc6pe9yKQRBZpCBe/+dsz//2/6j6dirH9ozsWQjiPleQ4DOQt0rSd8 afA/FBAFK3pRuQjAwdYVtr08/Mb6MikAfrnuZbJ99R2YuUnEZoOapQQhSKzv2lc5QGEv UrNQ== X-Gm-Message-State: ACrzQf1eAqfjKuapGC6WluPysR+LUgJ93MBwmRsn/YQaiI5NC1XDdzUI wGCacJlyLaR/HRUeKC/ZthI= X-Google-Smtp-Source: AMsMyM4YIWFUnJgLC1+sbps0q1gbqRBYjGTH6meomF/QqMOUMT/HF2HMRL6pEX+Kj1e79y4I1JWJOQ== X-Received: by 2002:a17:903:11c7:b0:178:af17:e93e with SMTP id q7-20020a17090311c700b00178af17e93emr17192088plh.78.1665380173613; Sun, 09 Oct 2022 22:36:13 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:13 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 07/19] perf stat: Add struct perf_stat_aggr to perf_stat_evsel Date: Sun, 9 Oct 2022 22:35:48 -0700 Message-Id: <20221010053600.272854-8-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The perf_stat_aggr struct is to keep aggregated counter values and the states according to the aggregation mode. The number of entries is depends on the mode and this is a preparation for the later use. Signed-off-by: Namhyung Kim --- tools/perf/util/stat.c | 34 +++++++++++++++++++++++++++------- tools/perf/util/stat.h | 9 +++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 8ec8bb4a9912..c9d5aa295b54 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -133,15 +133,33 @@ static void perf_stat_evsel_id_init(struct evsel *evs= el) static void evsel__reset_stat_priv(struct evsel *evsel) { struct perf_stat_evsel *ps =3D evsel->stats; + struct perf_stat_aggr *aggr =3D ps->aggr; =20 init_stats(&ps->res_stats); + + if (aggr) + memset(aggr, 0, sizeof(*aggr) * ps->nr_aggr); } =20 -static int evsel__alloc_stat_priv(struct evsel *evsel) + +static int evsel__alloc_stat_priv(struct evsel *evsel, int nr_aggr) { - evsel->stats =3D zalloc(sizeof(struct perf_stat_evsel)); - if (evsel->stats =3D=3D NULL) + struct perf_stat_evsel *ps; + + ps =3D zalloc(sizeof(*ps)); + if (ps =3D=3D NULL) return -ENOMEM; + + if (nr_aggr) { + ps->nr_aggr =3D nr_aggr; + ps->aggr =3D calloc(nr_aggr, sizeof(*ps->aggr)); + if (ps->aggr =3D=3D NULL) { + free(ps); + return -ENOMEM; + } + } + + evsel->stats =3D ps; perf_stat_evsel_id_init(evsel); evsel__reset_stat_priv(evsel); return 0; @@ -151,8 +169,10 @@ static void evsel__free_stat_priv(struct evsel *evsel) { struct perf_stat_evsel *ps =3D evsel->stats; =20 - if (ps) + if (ps) { + zfree(&ps->aggr); zfree(&ps->group_data); + } zfree(&evsel->stats); } =20 @@ -181,9 +201,9 @@ static void evsel__reset_prev_raw_counts(struct evsel *= evsel) perf_counts__reset(evsel->prev_raw_counts); } =20 -static int evsel__alloc_stats(struct evsel *evsel, bool alloc_raw) +static int evsel__alloc_stats(struct evsel *evsel, int nr_aggr, bool alloc= _raw) { - if (evsel__alloc_stat_priv(evsel) < 0 || + if (evsel__alloc_stat_priv(evsel, nr_aggr) < 0 || evsel__alloc_counts(evsel) < 0 || (alloc_raw && evsel__alloc_prev_raw_counts(evsel) < 0)) return -ENOMEM; @@ -196,7 +216,7 @@ int evlist__alloc_stats(struct evlist *evlist, bool all= oc_raw) struct evsel *evsel; =20 evlist__for_each_entry(evlist, evsel) { - if (evsel__alloc_stats(evsel, alloc_raw)) + if (evsel__alloc_stats(evsel, 0, alloc_raw)) goto out_free; } =20 diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index b0899c6e002f..ea356e5aa351 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -8,6 +8,7 @@ #include #include "cpumap.h" #include "rblist.h" +#include "counts.h" =20 struct perf_cpu_map; struct perf_stat_config; @@ -42,9 +43,17 @@ enum perf_stat_evsel_id { PERF_STAT_EVSEL_ID__MAX, }; =20 +struct perf_stat_aggr { + struct perf_counts_values counts; + int nr; + bool failed; +}; + struct perf_stat_evsel { struct stats res_stats; enum perf_stat_evsel_id id; + int nr_aggr; + struct perf_stat_aggr *aggr; u64 *group_data; }; =20 --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 DCC98C433F5 for ; Mon, 10 Oct 2022 05:36:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231443AbiJJFgh (ORCPT ); Mon, 10 Oct 2022 01:36:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54524 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231327AbiJJFgT (ORCPT ); Mon, 10 Oct 2022 01:36:19 -0400 Received: from mail-pj1-x102b.google.com (mail-pj1-x102b.google.com [IPv6:2607:f8b0:4864:20::102b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DFEAD3ED4A; Sun, 9 Oct 2022 22:36:15 -0700 (PDT) Received: by mail-pj1-x102b.google.com with SMTP id v10-20020a17090a634a00b00205e48cf845so12133157pjs.4; Sun, 09 Oct 2022 22:36:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=dBGwGb+l6It1yeeb0G/Y3FEabn+39BCUm7zik0b+zE4=; b=YcvamKp2nIa3Tv+g7gzWVX79EHVDtslkhQmizDk5UvfiuV0FL204S/pCCjm8rFK7S5 hKIiTT3C5XWbOE8gB3PN5oM9dkxWNXIfGS0McD5ZOcsfwUUJcwY6DtTJugqejbX2yqlp E0N0AeN/HlZhS2qP2m6ubwiK63ou7wf0CeKd3LKdQp1pesN1wSdSGP6fOvu2/9Nt5zzQ pDd6FFfjy2zx2Hh9+MJ4Kji4Dpg0mPA0E9oBjpQy0vNptC3iA35ISBkEH9ZIhDgWFtrJ R50x3QjCiaCwXmp93HeWY/1pkTTlPVjCJ5y3opqc9kj1LvGCcfHIb5iKakdpMjWi9k93 nTvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dBGwGb+l6It1yeeb0G/Y3FEabn+39BCUm7zik0b+zE4=; b=fmxXocylobeBTfyQVUiVu2oN9jY1q8eemTTkADstKgyOOihv6k/YMCo0aXkGRPo6nn g0eDVilYdDnPug3IuJ/aUTUtLA1HWa/vXt9+I9QzLrYljdfsulEJ6l3Nn+ajNZUVb9VB 57ati486epNh82NjRyqfPYfM1WiXBEegeiwZchdC7wEg7ZMXVoqjiSm38TBBvFStpcLv WjyvfZp7mlIwSYj3uE0xMCiRJiu6+oXrbh9j7/dNRJoeYs+4EdlTHZVbB32tFJMk1D3l /UKn74xGC8lD8kj25eIiI4fIsUnrlG52XwfG7bIPKjFvdGR+IjWpGoyDKDHyMEehJ1jl cShQ== X-Gm-Message-State: ACrzQf1MYDCDUj6MKvrU533kONiKgDfEl1GQcBXVSV71Mn2td6rIrkQr a8jgp1xiatk50098wOu+W8E= X-Google-Smtp-Source: AMsMyM43yBwUJHGnq1zJK87ABn9Bh90AkbUYOiP59/vFVS9LFnljNCT7VUJRLj0LDmM7VDVRFTK49A== X-Received: by 2002:a17:90b:384f:b0:20d:4761:3394 with SMTP id nl15-20020a17090b384f00b0020d47613394mr2989008pjb.144.1665380175078; Sun, 09 Oct 2022 22:36:15 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:14 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 08/19] perf stat: Allocate evsel->stats->aggr properly Date: Sun, 9 Oct 2022 22:35:49 -0700 Message-Id: <20221010053600.272854-9-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The perf_stat_config.aggr_map should have a correct size of the aggregation map. Use it to allocate aggr_counts. Also AGGR_NONE with per-core events can be tricky because it doesn't aggreate basically but it needs to do so for per-core events only. So only per-core evsels will have stats->aggr data. Note that other caller of evlist__alloc_stat() might not have stat_config or aggr_map. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/builtin-script.c | 4 ++-- tools/perf/builtin-stat.c | 6 +++--- tools/perf/tests/parse-metric.c | 2 +- tools/perf/tests/pmu-events.c | 2 +- tools/perf/util/stat.c | 9 +++++++-- tools/perf/util/stat.h | 3 ++- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 7ca238277d83..691915a71c86 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2049,7 +2049,7 @@ static void perf_sample__fprint_metric(struct perf_sc= ript *script, u64 val; =20 if (!evsel->stats) - evlist__alloc_stats(script->session->evlist, false); + evlist__alloc_stats(&stat_config, script->session->evlist, false); if (evsel_script(leader)->gnum++ =3D=3D 0) perf_stat__reset_shadow_stats(); val =3D sample->period * evsel->scale; @@ -3632,7 +3632,7 @@ static int set_maps(struct perf_script *script) =20 perf_evlist__set_maps(&evlist->core, script->cpus, script->threads); =20 - if (evlist__alloc_stats(evlist, true)) + if (evlist__alloc_stats(&stat_config, evlist, true)) return -ENOMEM; =20 script->allocated =3D true; diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index e5ddf60ab31d..eaddafbd7ff2 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -2124,7 +2124,7 @@ static int set_maps(struct perf_stat *st) =20 perf_evlist__set_maps(&evsel_list->core, st->cpus, st->threads); =20 - if (evlist__alloc_stats(evsel_list, true)) + if (evlist__alloc_stats(&stat_config, evsel_list, true)) return -ENOMEM; =20 st->maps_allocated =3D true; @@ -2571,10 +2571,10 @@ int cmd_stat(int argc, const char **argv) goto out; } =20 - if (evlist__alloc_stats(evsel_list, interval)) + if (perf_stat_init_aggr_mode()) goto out; =20 - if (perf_stat_init_aggr_mode()) + if (evlist__alloc_stats(&stat_config, evsel_list, interval)) goto out; =20 /* diff --git a/tools/perf/tests/parse-metric.c b/tools/perf/tests/parse-metri= c.c index 68f5a2a03242..cb3a9b795c0f 100644 --- a/tools/perf/tests/parse-metric.c +++ b/tools/perf/tests/parse-metric.c @@ -103,7 +103,7 @@ static int __compute_metric(const char *name, struct va= lue *vals, if (err) goto out; =20 - err =3D evlist__alloc_stats(evlist, false); + err =3D evlist__alloc_stats(NULL, evlist, false); if (err) goto out; =20 diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c index 097e05c796ab..a5e1028dacfc 100644 --- a/tools/perf/tests/pmu-events.c +++ b/tools/perf/tests/pmu-events.c @@ -889,7 +889,7 @@ static int test__parsing_callback(const struct pmu_even= t *pe, const struct pmu_e goto out_err; } =20 - err =3D evlist__alloc_stats(evlist, false); + err =3D evlist__alloc_stats(NULL, evlist, false); if (err) goto out_err; /* diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index c9d5aa295b54..374149628507 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -211,12 +211,17 @@ static int evsel__alloc_stats(struct evsel *evsel, in= t nr_aggr, bool alloc_raw) return 0; } =20 -int evlist__alloc_stats(struct evlist *evlist, bool alloc_raw) +int evlist__alloc_stats(struct perf_stat_config *config, + struct evlist *evlist, bool alloc_raw) { struct evsel *evsel; + int nr_aggr =3D 0; + + if (config && config->aggr_map) + nr_aggr =3D config->aggr_map->nr; =20 evlist__for_each_entry(evlist, evsel) { - if (evsel__alloc_stats(evsel, 0, alloc_raw)) + if (evsel__alloc_stats(evsel, nr_aggr, alloc_raw)) goto out_free; } =20 diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index ea356e5aa351..74bd51a3cb36 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -257,7 +257,8 @@ void perf_stat__print_shadow_stats(struct perf_stat_con= fig *config, struct runtime_stat *st); void perf_stat__collect_metric_expr(struct evlist *); =20 -int evlist__alloc_stats(struct evlist *evlist, bool alloc_raw); +int evlist__alloc_stats(struct perf_stat_config *config, + struct evlist *evlist, bool alloc_raw); void evlist__free_stats(struct evlist *evlist); void evlist__reset_stats(struct evlist *evlist); void evlist__reset_prev_raw_counts(struct evlist *evlist); --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 B2CE1C433F5 for ; Mon, 10 Oct 2022 05:36:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231486AbiJJFgu (ORCPT ); Mon, 10 Oct 2022 01:36:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54380 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231360AbiJJFgX (ORCPT ); Mon, 10 Oct 2022 01:36:23 -0400 Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2376F3FD79; Sun, 9 Oct 2022 22:36:17 -0700 (PDT) Received: by mail-pl1-x62e.google.com with SMTP id i6so4387008pli.12; Sun, 09 Oct 2022 22:36:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=OJaczI01tyhdsGxfV4ZkIGHj2qd4LfWM2bLmZxZZHts=; b=nk3X740jKAZbMf+AR5jkaRRjDsadWtSrq20Al665qy1uS2mBc1qKSDeHBbiKyIz+F7 3zo11JUKxWcCEn6PVuojgZS1p5zzyXtsHkRinbX05N2qh080eaEnEwzoIiuCbuIKc4J8 ckJxYmNQWZY5mlJn1vHUE7QPHsc0V/nukHD7ND/5nP2CIx4HqeKU9V9Nu/brBCF8px91 i6okCsOco2G2/IJdTC0d4BjKNrSpvKBs0u1+oCEtGtdTTb3WUwk71KzfSu/0iPxbcpfn X89PHrsyrfncV1kYPEs48Lu+kSi49lrn/EeMrlrGWKthp5e4rYR/Lx3mMjqYSP6lJdp+ e/bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=OJaczI01tyhdsGxfV4ZkIGHj2qd4LfWM2bLmZxZZHts=; b=F+ru6+OPGu+JhmiD1q9q3qaN+sSlM0qxzEmCIi1Pltwad6OttYfG4CfGxDUEIcVIBv YcIHecJs4oPRvJPwGS3ZUKcSIVPRZqewdyF1MeE0tSMneL6MlViPrrBB8eEReINOdOUD rcYU4yLFx1lQfrNSn7ntJKiMQBCR4LvmuOuPWq52i8PutkS1JUnzoe/s7FONDb16Zpsg YgUJKApleuqFWT6bEEuUhENnUl3sHBbkiMSl1fj8Yl7k7GmXBChWV+uNoO5M1cIM32s7 bKFTkDdemXMJXnbBeWZOlnG17c1EfBVnhZj7XhnU3BNNWTNQGwwXOQzEhaCUFs4GVxjb wlUg== X-Gm-Message-State: ACrzQf14g/M14mWP/klqKZrzZE5DN54n/x4rUuJNtD5GYBtocl8p5KJB LIno6nK+ti+MNUAEi2duIms= X-Google-Smtp-Source: AMsMyM5svQlZr2RkMAU9666Asp1XQlAel36qJdXTH7aWxlc18XZP0OhoEAXMjmt4nSih1Co0XcAXkQ== X-Received: by 2002:a17:90b:3b47:b0:202:a81f:4059 with SMTP id ot7-20020a17090b3b4700b00202a81f4059mr30292837pjb.150.1665380176544; Sun, 09 Oct 2022 22:36:16 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:16 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 09/19] perf stat: Aggregate events using evsel->stats->aggr Date: Sun, 9 Oct 2022 22:35:50 -0700 Message-Id: <20221010053600.272854-10-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add a logic to aggregate counter values to the new evsel->stats->aggr. This is not used yet so shadow stats are not updated. But later patch will convert the existing code to use it. With that, we don't need to handle AGGR_GLOBAL specially anymore. It can use the same logic with counts, prev_counts and aggr_counts. Signed-off-by: Namhyung Kim --- tools/perf/builtin-stat.c | 3 -- tools/perf/util/evsel.c | 9 +--- .../scripting-engines/trace-event-python.c | 6 --- tools/perf/util/stat.c | 46 ++++++++++++++++--- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index eaddafbd7ff2..139e35ed68d3 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -963,9 +963,6 @@ static int __run_perf_stat(int argc, const char **argv,= int run_idx) init_stats(&walltime_nsecs_stats); update_stats(&walltime_nsecs_stats, t1 - t0); =20 - if (stat_config.aggr_mode =3D=3D AGGR_GLOBAL) - evlist__save_aggr_prev_raw_counts(evsel_list); - evlist__copy_prev_raw_counts(evsel_list); evlist__reset_prev_raw_counts(evsel_list); perf_stat__reset_shadow_per_stat(&rt_stat); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index a6ea91c72659..a1fcb3166149 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1526,13 +1526,8 @@ void evsel__compute_deltas(struct evsel *evsel, int = cpu_map_idx, int thread, if (!evsel->prev_raw_counts) return; =20 - if (cpu_map_idx =3D=3D -1) { - tmp =3D evsel->prev_raw_counts->aggr; - evsel->prev_raw_counts->aggr =3D *count; - } else { - tmp =3D *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread); - *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread) =3D *count; - } + tmp =3D *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread); + *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread) =3D *count; =20 count->val =3D count->val - tmp.val; count->ena =3D count->ena - tmp.ena; diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools= /perf/util/scripting-engines/trace-event-python.c index 1f2040f36d4e..7bc8559dce6a 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -1653,12 +1653,6 @@ static void python_process_stat(struct perf_stat_con= fig *config, struct perf_cpu_map *cpus =3D counter->core.cpus; int cpu, thread; =20 - if (config->aggr_mode =3D=3D AGGR_GLOBAL) { - process_stat(counter, (struct perf_cpu){ .cpu =3D -1 }, -1, tstamp, - &counter->counts->aggr); - return; - } - for (thread =3D 0; thread < threads->nr; thread++) { for (cpu =3D 0; cpu < perf_cpu_map__nr(cpus); cpu++) { process_stat(counter, perf_cpu_map__cpu(cpus, cpu), diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 374149628507..99874254809d 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -387,6 +387,7 @@ process_counter_values(struct perf_stat_config *config,= struct evsel *evsel, struct perf_counts_values *count) { struct perf_counts_values *aggr =3D &evsel->counts->aggr; + struct perf_stat_evsel *ps =3D evsel->stats; static struct perf_counts_values zero; bool skip =3D false; =20 @@ -398,6 +399,44 @@ process_counter_values(struct perf_stat_config *config= , struct evsel *evsel, if (skip) count =3D &zero; =20 + if (!evsel->snapshot) + evsel__compute_deltas(evsel, cpu_map_idx, thread, count); + perf_counts_values__scale(count, config->scale, NULL); + + if (ps->aggr) { + struct perf_cpu cpu =3D perf_cpu_map__cpu(evsel->core.cpus, cpu_map_idx); + struct aggr_cpu_id aggr_id =3D config->aggr_get_id(config, cpu); + struct perf_stat_aggr *ps_aggr; + int i; + + for (i =3D 0; i < ps->nr_aggr; i++) { + if (!aggr_cpu_id__equal(&aggr_id, &config->aggr_map->map[i])) + continue; + + ps_aggr =3D &ps->aggr[i]; + ps_aggr->nr++; + + /* + * When any result is bad, make them all to give + * consistent output in interval mode. + */ + if (count->ena =3D=3D 0 || count->run =3D=3D 0 || + evsel->counts->scaled =3D=3D -1) { + ps_aggr->counts.val =3D 0; + ps_aggr->counts.ena =3D 0; + ps_aggr->counts.run =3D 0; + ps_aggr->failed =3D true; + } + + if (!ps_aggr->failed) { + ps_aggr->counts.val +=3D count->val; + ps_aggr->counts.ena +=3D count->ena; + ps_aggr->counts.run +=3D count->run; + } + break; + } + } + switch (config->aggr_mode) { case AGGR_THREAD: case AGGR_CORE: @@ -405,9 +444,6 @@ process_counter_values(struct perf_stat_config *config,= struct evsel *evsel, case AGGR_SOCKET: case AGGR_NODE: case AGGR_NONE: - if (!evsel->snapshot) - evsel__compute_deltas(evsel, cpu_map_idx, thread, count); - perf_counts_values__scale(count, config->scale, NULL); if ((config->aggr_mode =3D=3D AGGR_NONE) && (!evsel->percore)) { perf_stat__update_shadow_stats(evsel, count->val, cpu_map_idx, &rt_stat); @@ -469,10 +505,6 @@ int perf_stat_process_counter(struct perf_stat_config = *config, if (config->aggr_mode !=3D AGGR_GLOBAL) return 0; =20 - if (!counter->snapshot) - evsel__compute_deltas(counter, -1, -1, aggr); - perf_counts_values__scale(aggr, config->scale, &counter->counts->scaled); - update_stats(&ps->res_stats, *count); =20 if (verbose > 0) { --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 B061AC433FE for ; Mon, 10 Oct 2022 05:36:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231526AbiJJFg5 (ORCPT ); Mon, 10 Oct 2022 01:36:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231313AbiJJFg1 (ORCPT ); Mon, 10 Oct 2022 01:36:27 -0400 Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30E4347BB9; Sun, 9 Oct 2022 22:36:19 -0700 (PDT) Received: by mail-pj1-x1035.google.com with SMTP id l1-20020a17090a72c100b0020a6949a66aso9480952pjk.1; Sun, 09 Oct 2022 22:36:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=vDi/57raCXYe0+xq0dxaV0OWm/rYl//UJ8wGRO2PpNQ=; b=oEaSErh+j674k/rte/i+WHl0RoLrfAp1Jg4Ws1Cm7Dz3+N4HWrwI+YlfWzSFIVZZmB dctrL+VdCzR+7t782QJUJ5SGIjegsZi4JZPDB4tYAp98yYRdUqoct42lJ5J3IfZcVivu 1oWHyPGP5kriZVTz3BNPSu+6r34yPSIKfgUFpIZBEp2KW8o4LPTJoqT+67mazYyBA8t9 Hwe1zN5VYTMVbo2r4xHqIWIOx1ZlZZuHlxdYaB4G0sW5TMNpszQMdPzcapbDKVOcX5dW h2EBFaqMNwga7nHEVMvygzzBzsW7eUa74lMOWOpkNX61mHPqAzbUZ5lz+g5vQFjFIeWL Ggrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vDi/57raCXYe0+xq0dxaV0OWm/rYl//UJ8wGRO2PpNQ=; b=5PSATEXvF6EZFVn6Z2Lx12vSCN80Kwkjw6B5Zj5Nl3M2WcvNXJS3PKM0QYegYbNvje 0qiRDb4YRStcR6iggXx+RzNDa5ivp1FerAWSbsIGS4jkZ9o40MohDjlaC6jnF2jkrDDp KbqzYSjOEI+IFKmALFX99VxmWqfOJA/AZsb4co4HnUbNJmf1W16smASfJF5lgffWEWFS u23VIjbZVkp8vvJULCDLzYOC7YTQ8nunfRvpTuiyY2ZlEym9k6GfUi0cEvQBy7vpU1QT 38bSthX14VRxPDLVHe+lfOE4rawuFd7u7Rx6nCyQWFLrllos1KVQ3sVsYZKglnJBjoiW 5StA== X-Gm-Message-State: ACrzQf2oytf/tByhb6IsOMaOUBpH0b913vnYLDeLUOdCpIS9hYm9dw7i XXt+Rn+63OJhwON4Hsjt9Hg= X-Google-Smtp-Source: AMsMyM4CoaWeqeeMqQlLoAcK3Z0ireY7ck28FFrkVOBk7HoLFEtPUNUJ9JUY61S0+Fa9DuwQqNg+DQ== X-Received: by 2002:a17:90b:17c9:b0:20d:489b:55c0 with SMTP id me9-20020a17090b17c900b0020d489b55c0mr2831732pjb.232.1665380177959; Sun, 09 Oct 2022 22:36:17 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:17 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 10/19] perf stat: Aggregate per-thread stats using evsel->stats->aggr Date: Sun, 9 Oct 2022 22:35:51 -0700 Message-Id: <20221010053600.272854-11-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Per-thread aggregation doesn't use the CPU numbers but the logic should be the same. Initialize cpu_aggr_map separately for AGGR_THREAD and use thread map idx to aggregate counter values. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/builtin-stat.c | 31 +++++++++++++++++++++++++++++++ tools/perf/util/stat.c | 19 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 139e35ed68d3..c76240cfc635 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1468,6 +1468,21 @@ static int perf_stat_init_aggr_mode(void) stat_config.aggr_get_id =3D aggr_mode__get_id(stat_config.aggr_mode); } =20 + if (stat_config.aggr_mode =3D=3D AGGR_THREAD) { + nr =3D perf_thread_map__nr(evsel_list->core.threads); + stat_config.aggr_map =3D cpu_aggr_map__empty_new(nr); + if (stat_config.aggr_map =3D=3D NULL) + return -ENOMEM; + + for (int s =3D 0; s < nr; s++) { + struct aggr_cpu_id id =3D aggr_cpu_id__empty(); + + id.thread_idx =3D s; + stat_config.aggr_map->map[s] =3D id; + } + return 0; + } + /* * The evsel_list->cpus is the base we operate on, * taking the highest cpu number to be the size of @@ -1677,6 +1692,22 @@ static int perf_stat_init_aggr_mode_file(struct perf= _stat *st) aggr_cpu_id_get_t get_id =3D aggr_mode__get_aggr_file(stat_config.aggr_mo= de); bool needs_sort =3D stat_config.aggr_mode !=3D AGGR_NONE; =20 + if (stat_config.aggr_mode =3D=3D AGGR_THREAD) { + int nr =3D perf_thread_map__nr(evsel_list->core.threads); + + stat_config.aggr_map =3D cpu_aggr_map__empty_new(nr); + if (stat_config.aggr_map =3D=3D NULL) + return -ENOMEM; + + for (int s =3D 0; s < nr; s++) { + struct aggr_cpu_id id =3D aggr_cpu_id__empty(); + + id.thread_idx =3D s; + stat_config.aggr_map->map[s] =3D id; + } + return 0; + } + if (!get_id) return 0; =20 diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 99874254809d..013dbe1c5d28 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -403,6 +403,24 @@ process_counter_values(struct perf_stat_config *config= , struct evsel *evsel, evsel__compute_deltas(evsel, cpu_map_idx, thread, count); perf_counts_values__scale(count, config->scale, NULL); =20 + if (config->aggr_mode =3D=3D AGGR_THREAD) { + struct perf_counts_values *aggr_counts =3D &ps->aggr[thread].counts; + + /* + * Skip value 0 when enabling --per-thread globally, + * otherwise too many 0 output. + */ + if (count->val =3D=3D 0 && config->system_wide) + return 0; + + ps->aggr[thread].nr++; + + aggr_counts->val +=3D count->val; + aggr_counts->ena +=3D count->ena; + aggr_counts->run +=3D count->run; + goto update; + } + if (ps->aggr) { struct perf_cpu cpu =3D perf_cpu_map__cpu(evsel->core.cpus, cpu_map_idx); struct aggr_cpu_id aggr_id =3D config->aggr_get_id(config, cpu); @@ -437,6 +455,7 @@ process_counter_values(struct perf_stat_config *config,= struct evsel *evsel, } } =20 +update: switch (config->aggr_mode) { case AGGR_THREAD: case AGGR_CORE: --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 46E82C433F5 for ; Mon, 10 Oct 2022 05:37:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231531AbiJJFhB (ORCPT ); Mon, 10 Oct 2022 01:37:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54764 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231398AbiJJFg2 (ORCPT ); Mon, 10 Oct 2022 01:36:28 -0400 Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0B0211C901; Sun, 9 Oct 2022 22:36:19 -0700 (PDT) Received: by mail-pl1-x633.google.com with SMTP id l1so9408129pld.13; Sun, 09 Oct 2022 22:36:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=NTw0uZaEmiJ8khO64LdMRhY5Te3L66NJGNmxBf93CO8=; b=E9XDvhH88MS3xy/V83BIMqCWAzB8TGk7+Q0pKTXtyd0TsKNoGz+nchVu/PBVgKuaap jMrgElIoW/HxqSLHIU22nQZ2Z/qqTW7qKdHhqEe1k8j8KH/YqaSGIu10R9sD4QiF211r StVe9gg+pj2gZkRx8jlJpvyVu9spzCw5i2PCOXGGpIyH21OicOS0Wuh7WyDL6JS8AU5q rgjLfqSUIrWKo87NyF3hNIoV7H+c3iR1zd0HTGBRZbuR5ePebEVyrh/5IbZT6Nfr2Ukb aj9gXKarna6BZJtmCcG3qeMI1ibJ9kpCE9Hyw6le5RkmUQ0Owb4d0ObEKW10JhWUEiEj bViA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NTw0uZaEmiJ8khO64LdMRhY5Te3L66NJGNmxBf93CO8=; b=5/A3KOhasy58jG9DtRTOeM8tTWIqzQbJgkdIqYaeFmoEkxivKVl1b4Hug6Ky7Be+RE E42XYwrbSZMba30jxG7Iq5W8Fv412QmjesqiguVncuajH0lp2BA8bzJx0RlcXK9LqTrL CXKTsLv6Qbw85csAKPu7YU6J9yh7/sAsQU+k+VviItun6N5bV2mjPDRf77bGvMvxNPyS PyT1UT0k+kNKjCtAWZLZZARzVl/3XmkmGWVvq50PF2jPJV+FJxxP7wp0wO3KsuAr+2+t 1VqZc3AKjYKmirQVa2MMJi9VNgxWBIM2cEPTH89KvZIYS0zFwCT1vih+Vh96ciyu5W6V hplw== X-Gm-Message-State: ACrzQf2+odNY2yNNn6tldHwBb314hrrfeAK6AbqeRbLD81liuv6y476N KPJuO3jKWgP0zJcz8DR6ezA= X-Google-Smtp-Source: AMsMyM4IrCfUbWQLfLDDLD4yiZA1jKkyPTm3idAra1LnA7KGtAEIkXrBJH2Jy9fsDniNnUK0Yxqedw== X-Received: by 2002:a17:90a:e00a:b0:209:1545:74a7 with SMTP id u10-20020a17090ae00a00b00209154574a7mr19099946pjy.72.1665380179399; Sun, 09 Oct 2022 22:36:19 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:19 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 11/19] perf stat: Allocate aggr counts for recorded data Date: Sun, 9 Oct 2022 22:35:52 -0700 Message-Id: <20221010053600.272854-12-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" In the process_stat_config_event() it sets the aggr_mode that means the earlier evlist__alloc_stats() cannot allocate the aggr counts due to the missing aggr_mode. Do it after setting the aggr_map using evlist__alloc_aggr_stats(). Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/builtin-stat.c | 8 ++++++++ tools/perf/util/stat.c | 39 +++++++++++++++++++++++++++++++-------- tools/perf/util/stat.h | 2 ++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index c76240cfc635..983f38cd4caa 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -2139,6 +2139,14 @@ int process_stat_config_event(struct perf_session *s= ession, else perf_stat_init_aggr_mode_file(st); =20 + if (stat_config.aggr_map) { + int nr_aggr =3D stat_config.aggr_map->nr; + + if (evlist__alloc_aggr_stats(session->evlist, nr_aggr) < 0) { + pr_err("cannot allocate aggr counts\n"); + return -1; + } + } return 0; } =20 diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 013dbe1c5d28..279aa4ea342d 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -141,6 +141,31 @@ static void evsel__reset_stat_priv(struct evsel *evsel) memset(aggr, 0, sizeof(*aggr) * ps->nr_aggr); } =20 +static int evsel__alloc_aggr_stats(struct evsel *evsel, int nr_aggr) +{ + struct perf_stat_evsel *ps =3D evsel->stats; + + if (ps =3D=3D NULL) + return 0; + + ps->nr_aggr =3D nr_aggr; + ps->aggr =3D calloc(nr_aggr, sizeof(*ps->aggr)); + if (ps->aggr =3D=3D NULL) + return -ENOMEM; + + return 0; +} + +int evlist__alloc_aggr_stats(struct evlist *evlist, int nr_aggr) +{ + struct evsel *evsel; + + evlist__for_each_entry(evlist, evsel) { + if (evsel__alloc_aggr_stats(evsel, nr_aggr) < 0) + return -1; + } + return 0; +} =20 static int evsel__alloc_stat_priv(struct evsel *evsel, int nr_aggr) { @@ -150,16 +175,14 @@ static int evsel__alloc_stat_priv(struct evsel *evsel= , int nr_aggr) if (ps =3D=3D NULL) return -ENOMEM; =20 - if (nr_aggr) { - ps->nr_aggr =3D nr_aggr; - ps->aggr =3D calloc(nr_aggr, sizeof(*ps->aggr)); - if (ps->aggr =3D=3D NULL) { - free(ps); - return -ENOMEM; - } + evsel->stats =3D ps; + + if (nr_aggr && evsel__alloc_aggr_stats(evsel, nr_aggr) < 0) { + evsel->stats =3D NULL; + free(ps); + return -ENOMEM; } =20 - evsel->stats =3D ps; perf_stat_evsel_id_init(evsel); evsel__reset_stat_priv(evsel); return 0; diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 74bd51a3cb36..936c0709ce0d 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -265,6 +265,8 @@ void evlist__reset_prev_raw_counts(struct evlist *evlis= t); void evlist__copy_prev_raw_counts(struct evlist *evlist); void evlist__save_aggr_prev_raw_counts(struct evlist *evlist); =20 +int evlist__alloc_aggr_stats(struct evlist *evlist, int nr_aggr); + int perf_stat_process_counter(struct perf_stat_config *config, struct evsel *counter); struct perf_tool; --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 A6457C433FE for ; Mon, 10 Oct 2022 05:37:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231588AbiJJFhI (ORCPT ); Mon, 10 Oct 2022 01:37:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54778 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231408AbiJJFg2 (ORCPT ); Mon, 10 Oct 2022 01:36:28 -0400 Received: from mail-pg1-x532.google.com (mail-pg1-x532.google.com [IPv6:2607:f8b0:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9CA9051A20; Sun, 9 Oct 2022 22:36:21 -0700 (PDT) Received: by mail-pg1-x532.google.com with SMTP id 78so9423293pgb.13; Sun, 09 Oct 2022 22:36:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=RBycnqrUFJrsOi/+zdHGgl1vFz+CiORWzGfom+ATHAE=; b=CLMpSTKdpy1WyMIwY3QU3fNnrnsVhqEB904fAVVosG/uMq0eGb2jO2bc1o2gUo1I+D pNN3/QFEDjf9cYEN1+61LZ+hRsMkNOM0cKF33JGpKusEVnXqRZIHIPioenxWiktfqOyW m6YCa3jYgbzxNNC5c8YgE+LaOSdaiEViMPLvTanfVP+5EQw4BrMf8r8Cncr/TpMTm5TU 7Vc90MxOLCMauQQDMg/d+Nlqkr1Qs2na3CCENmTI2T9haxESvCX/dA5qCrZmJRT7nYDv m5P933Y1k2mnQRrUOwg/UwwasJMt9a9WNUIGuBj0MtjQXhBbrgFpaCEeqaCHEIA4pc83 QBhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=RBycnqrUFJrsOi/+zdHGgl1vFz+CiORWzGfom+ATHAE=; b=LCDy3Mfs11ftLgKGUe4JAj05pe8GmDkbghPAOyNlmITWjeFAMTNsxM595S5WLEj4Ci E0As/J9MQQnpet3h6OTwKGgPfMXpx7eSyrU/a3hm1ux+JRWvKp5sFyjkMTdNjQQGfMeO FHLGG/0vpq26zFal7zN4/OZchvhsbSPC5W5LrgtOPIKLQILI/5IlTxQgJp18InxawEf/ cELL0Xa1TKnVHX4tAPHKFL9ppH7lK0h9gQWpJt6HHNDoljxFEosb+POX2F1GodoaXLRg ULZpsZhocd9P9PXM5d1m9LAEuTD+HvLMTDtejqOAgXAKhP04/m+YpBB5ipqEK5GU2MTh njlw== X-Gm-Message-State: ACrzQf2GRbcsdet8lsFtRKu7oax8s/TYJX2xkTO9P/f2tnCpHr/kaKEE BsSaS+k+kJSLhOfPYCryb90= X-Google-Smtp-Source: AMsMyM5G3UyEJB4rCeVqTmbBgPe/chnCVANUMQuKbURDWEqvaPaqpALT0HF9KJkXbccQXq16x7nExQ== X-Received: by 2002:a63:d1b:0:b0:42b:828b:f14a with SMTP id c27-20020a630d1b000000b0042b828bf14amr15427387pgl.235.1665380180775; Sun, 09 Oct 2022 22:36:20 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:20 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 12/19] perf stat: Reset aggr counts for each interval Date: Sun, 9 Oct 2022 22:35:53 -0700 Message-Id: <20221010053600.272854-13-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The evsel->stats->aggr->count should be reset for interval processing since we want to use the values directly for display. Signed-off-by: Namhyung Kim --- tools/perf/builtin-stat.c | 3 +++ tools/perf/util/stat.c | 13 +++++++++++++ tools/perf/util/stat.h | 1 + 3 files changed, 17 insertions(+) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 983f38cd4caa..38036f40e993 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -492,6 +492,8 @@ static void process_interval(void) diff_timespec(&rs, &ts, &ref_time); =20 perf_stat__reset_shadow_per_stat(&rt_stat); + evlist__reset_aggr_stats(evsel_list); + read_counters(&rs); =20 if (STAT_RECORD) { @@ -965,6 +967,7 @@ static int __run_perf_stat(int argc, const char **argv,= int run_idx) =20 evlist__copy_prev_raw_counts(evsel_list); evlist__reset_prev_raw_counts(evsel_list); + evlist__reset_aggr_stats(evsel_list); perf_stat__reset_shadow_per_stat(&rt_stat); } else { update_stats(&walltime_nsecs_stats, t1 - t0); diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 279aa4ea342d..4edfc1c5dc07 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -276,6 +276,19 @@ void evlist__reset_stats(struct evlist *evlist) } } =20 +void evlist__reset_aggr_stats(struct evlist *evlist) +{ + struct evsel *evsel; + + evlist__for_each_entry(evlist, evsel) { + struct perf_stat_evsel *ps =3D evsel->stats; + struct perf_stat_aggr *aggr =3D ps->aggr; + + if (aggr) + memset(aggr, 0, sizeof(*aggr) * ps->nr_aggr); + } +} + void evlist__reset_prev_raw_counts(struct evlist *evlist) { struct evsel *evsel; diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 936c0709ce0d..3a876ad2870b 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -266,6 +266,7 @@ void evlist__copy_prev_raw_counts(struct evlist *evlist= ); void evlist__save_aggr_prev_raw_counts(struct evlist *evlist); =20 int evlist__alloc_aggr_stats(struct evlist *evlist, int nr_aggr); +void evlist__reset_aggr_stats(struct evlist *evlist); =20 int perf_stat_process_counter(struct perf_stat_config *config, struct evsel *counter); --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 914A2C4332F for ; Mon, 10 Oct 2022 05:37:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231617AbiJJFhN (ORCPT ); Mon, 10 Oct 2022 01:37:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54542 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231450AbiJJFgh (ORCPT ); Mon, 10 Oct 2022 01:36:37 -0400 Received: from mail-pl1-x62d.google.com (mail-pl1-x62d.google.com [IPv6:2607:f8b0:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CE75751A36; Sun, 9 Oct 2022 22:36:22 -0700 (PDT) Received: by mail-pl1-x62d.google.com with SMTP id x6so9426496pll.11; Sun, 09 Oct 2022 22:36:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=IVp7QO5gScJA8AxQSNpgBWJ7D8KPtvuVD0QAyAFrK9k=; b=pgSUYrhUsHdMphQ2ELS8NgtgoQwE17K+FELU1Gul8g23xltkGaenWl85mWB/PXcetp aQSIFit/CcNr60DZHtPok4yIF51qJCwMzKKZCTg+aJvWfS0hPlPSgPoGicuxjK6RlMC2 cnlJaCufUtfobqF1lh/tVq3Nj0kueP56xWU3U7MZXEmKVylU7TPrH1X+hoiEeVvzxofY KhwsIgOnqpxG9Rj1wyTEa9Qq7AwB1kPkLmrBuTzRSPgUeGu5YbERIE3TUS+PRdAogAVH msT8HrDaySwnjuZ+Z1/FUJNJivK8ID9+xgWvlafyCR9Ew2KTV2QjnfXkyDRCZqrgbFkf 1W/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IVp7QO5gScJA8AxQSNpgBWJ7D8KPtvuVD0QAyAFrK9k=; b=XceIsm8MDp3nU3oGumxsfMJ62UTpHJtjJOvwMiaOCwmLmBoJnnuxa1tE/NBRjDZ6W2 O1NNFxl1o1APfMkd5uj4UT/zMqjNNC5iH14znps+VWoSOl/8HWUlI4+qbNJfN82LIT8E jJyI4k1wcnP/B78PBVKOZSByYhCpW4PraRUvNhhtB03ctZ+r8aloyh/73a8JpACbCwHx LXvpN6h7JdR15Arkqvhfv76U5WKrnrgynCDvNl2vDW3vnfmPvsgSUWOPoffFKwKAJvDj tqQ0dasFhsjotz0ajbEWEH3n5ndf4R+CktBE5MW6cQhwoGGSmqBUF5bmmtkirujvH/a7 rnLw== X-Gm-Message-State: ACrzQf0k8EhgCO7gZ5g+O6Wc5Wc+oxv47+tjSq2bASW50gZcc0zG/hrZ +rXOagvEu9kQ1Hvh/6vf/XA= X-Google-Smtp-Source: AMsMyM7w6jDKcYFzMgtGxHebXMX1mCzNtzlWwgvrGNMy8+yl606mCRN5M6pYVp1P3SIdWjKVuHDW3Q== X-Received: by 2002:a17:90b:1b10:b0:20d:30a5:49a9 with SMTP id nu16-20020a17090b1b1000b0020d30a549a9mr6670303pjb.77.1665380182237; Sun, 09 Oct 2022 22:36:22 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:21 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 13/19] perf stat: Split process_counters() Date: Sun, 9 Oct 2022 22:35:54 -0700 Message-Id: <20221010053600.272854-14-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" It'd do more processing with aggregation. Let's split the function so that= it can be shared with by process_stat_round_event() too. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/builtin-stat.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 38036f40e993..49a7e290d778 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -465,15 +465,19 @@ static int read_bpf_map_counters(void) return 0; } =20 -static void read_counters(struct timespec *rs) +static int read_counters(struct timespec *rs) { - struct evsel *counter; - if (!stat_config.stop_read_counter) { if (read_bpf_map_counters() || read_affinity_counters(rs)) - return; + return -1; } + return 0; +} + +static void process_counters(void) +{ + struct evsel *counter; =20 evlist__for_each_entry(evsel_list, counter) { if (counter->err) @@ -494,7 +498,8 @@ static void process_interval(void) perf_stat__reset_shadow_per_stat(&rt_stat); evlist__reset_aggr_stats(evsel_list); =20 - read_counters(&rs); + if (read_counters(&rs) =3D=3D 0) + process_counters(); =20 if (STAT_RECORD) { if (WRITE_STAT_ROUND_EVENT(rs.tv_sec * NSEC_PER_SEC + rs.tv_nsec, INTERV= AL)) @@ -980,7 +985,8 @@ static int __run_perf_stat(int argc, const char **argv,= int run_idx) * avoid arbitrary skew, we must read all counters before closing any * group leaders. */ - read_counters(&(struct timespec) { .tv_nsec =3D t1-t0 }); + if (read_counters(&(struct timespec) { .tv_nsec =3D t1-t0 }) =3D=3D 0) + process_counters(); =20 /* * We need to keep evsel_list alive, because it's processed @@ -2098,13 +2104,11 @@ static int process_stat_round_event(struct perf_ses= sion *session, union perf_event *event) { struct perf_record_stat_round *stat_round =3D &event->stat_round; - struct evsel *counter; struct timespec tsh, *ts =3D NULL; const char **argv =3D session->header.env.cmdline_argv; int argc =3D session->header.env.nr_cmdline; =20 - evlist__for_each_entry(evsel_list, counter) - perf_stat_process_counter(&stat_config, counter); + process_counters(); =20 if (stat_round->type =3D=3D PERF_STAT_ROUND_TYPE__FINAL) update_stats(&walltime_nsecs_stats, stat_round->time); --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 B0A2FC433FE for ; Mon, 10 Oct 2022 05:37:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231621AbiJJFhW (ORCPT ); Mon, 10 Oct 2022 01:37:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55212 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231465AbiJJFgr (ORCPT ); Mon, 10 Oct 2022 01:36:47 -0400 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5BD6752DE4; Sun, 9 Oct 2022 22:36:24 -0700 (PDT) Received: by mail-pl1-x632.google.com with SMTP id n7so9475861plp.1; Sun, 09 Oct 2022 22:36:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=EBjLzWT4H/vt1QWp8fOXfPXN2QfGxxbM4NV5HB9FiQk=; b=bVubwEWTfdZTa5pkj5Gr5K1Qhl1TwPXotTcXc4H6Nr9JvJuZr1NhaqVPl8e0jGq+Tn CiGLDe7BgkFt7UXhJII5A1crkqXjXwaT8JhWkPZl41oCRDksvB89Eb7H1XxSr685KgVf OYdHBVgGfrrpKOmDTOYz5QioeIJ1k63JgWlthpQwHsBwemM+ULBkPfnDEPB/MfKn3YYb iFg5kwj4ehOAYvtMTPjo9u7PyqLN2a+0mj6/4PVzkiZk0Or/Sm62aDRHwImdnqUpXIPG LoRppq7QLk8w1ATJG25iy2H4z7eb3+N86WqdCRVMDyT30tUBzoWXUU3SOhzq7hegKpgy WqUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=EBjLzWT4H/vt1QWp8fOXfPXN2QfGxxbM4NV5HB9FiQk=; b=G2YP3hz3gpDsKVkSJr3ypUAq0/8+mj+8GFS6UdAJeYDYOGKhTJK65TIyPtsec4XB3J Xbqk51fEtxHzCRWrVlYeW/vu1Hq5XCrXR6rB++U81j/bUeFWD9BwO17OwX1BDZEIsElg 1dTBYaKFj+DQ61B7/2nUqEx/KktQzDDzd4d5uwshEPtheGL2qUqKkI4g5f9tpJKsBv72 FLYcYDDZDeE2Hgn/moaKTnUxs/Jz80D8ABvUAYLpMoebIx789Kk3zfJMk4ISf+UKoKyg opDBj1xtWv/AQWwedMUiPJf5CG8HgX1zSnVanUbMksWf2JP9oeAufLVmTS7KDhwMT8AT x/cQ== X-Gm-Message-State: ACrzQf1NFr+CVIl32P3ZEo4/unoYu7p1TLmTnxVT088KHV6pADBx3b52 OkHueVqRH/FGCWk8qeFOnHM= X-Google-Smtp-Source: AMsMyM7/+oFP6IGDgIkzPiI50CR1aOxv9nOUDzYIMxyKofU1vUrK5drs+jiEru6x5U4uFa1irFQKMA== X-Received: by 2002:a17:903:509:b0:179:ffcf:d275 with SMTP id jn9-20020a170903050900b00179ffcfd275mr17235764plb.150.1665380183687; Sun, 09 Oct 2022 22:36:23 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:23 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 14/19] perf stat: Add perf_stat_merge_counters() Date: Sun, 9 Oct 2022 22:35:55 -0700 Message-Id: <20221010053600.272854-15-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The perf_stat_merge_counters() is to aggregate the same events in different PMUs like in case of uncore or hybrid. The same logic is in the stat-displ= ay routines but I think it should be handled when it processes the event count= ers. As it works on the aggr_counters, it doesn't change the output yet. Signed-off-by: Namhyung Kim --- tools/perf/builtin-stat.c | 2 + tools/perf/util/stat.c | 96 +++++++++++++++++++++++++++++++++++++++ tools/perf/util/stat.h | 2 + 3 files changed, 100 insertions(+) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 49a7e290d778..f90e8f29cb23 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -486,6 +486,8 @@ static void process_counters(void) pr_warning("failed to process counter %s\n", counter->name); counter->err =3D 0; } + + perf_stat_merge_counters(&stat_config, evsel_list); } =20 static void process_interval(void) diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 4edfc1c5dc07..1bb197782a34 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -575,6 +575,102 @@ int perf_stat_process_counter(struct perf_stat_config= *config, return 0; } =20 +static int evsel__merge_aggr_counters(struct evsel *evsel, struct evsel *a= lias) +{ + struct perf_stat_evsel *ps_a =3D evsel->stats; + struct perf_stat_evsel *ps_b =3D alias->stats; + int i; + + if (ps_a->aggr =3D=3D NULL && ps_b->aggr =3D=3D NULL) + return 0; + + if (ps_a->nr_aggr !=3D ps_b->nr_aggr) { + pr_err("Unmatched aggregation mode between aliases\n"); + return -1; + } + + for (i =3D 0; i < ps_a->nr_aggr; i++) { + struct perf_counts_values *aggr_counts_a =3D &ps_a->aggr[i].counts; + struct perf_counts_values *aggr_counts_b =3D &ps_b->aggr[i].counts; + + /* NB: don't increase aggr.nr for aliases */ + + aggr_counts_a->val +=3D aggr_counts_b->val; + aggr_counts_a->ena +=3D aggr_counts_b->ena; + aggr_counts_a->run +=3D aggr_counts_b->run; + } + + return 0; +} +/* events should have the same name, scale, unit, cgroup but on different = PMUs */ +static bool evsel__is_alias(struct evsel *evsel_a, struct evsel *evsel_b) +{ + if (strcmp(evsel__name(evsel_a), evsel__name(evsel_b))) + return false; + + if (evsel_a->scale !=3D evsel_b->scale) + return false; + + if (evsel_a->cgrp !=3D evsel_b->cgrp) + return false; + + if (strcmp(evsel_a->unit, evsel_b->unit)) + return false; + + if (evsel__is_clock(evsel_a) !=3D evsel__is_clock(evsel_b)) + return false; + + return !!strcmp(evsel_a->pmu_name, evsel_b->pmu_name); +} + +static void evsel__merge_aliases(struct evsel *evsel) +{ + struct evlist *evlist =3D evsel->evlist; + struct evsel *alias; + + alias =3D list_prepare_entry(evsel, &(evlist->core.entries), core.node); + list_for_each_entry_continue(alias, &evlist->core.entries, core.node) { + /* Merge the same events on different PMUs. */ + if (evsel__is_alias(evsel, alias)) { + evsel__merge_aggr_counters(evsel, alias); + alias->merged_stat =3D true; + } + } +} + +static bool evsel__should_merge_hybrid(struct evsel *evsel, struct perf_st= at_config *config) +{ + struct perf_pmu *pmu; + + if (!config->hybrid_merge) + return false; + + pmu =3D evsel__find_pmu(evsel); + return pmu && pmu->is_hybrid; +} + +static void evsel__merge_stats(struct evsel *evsel, struct perf_stat_confi= g *config) +{ + /* this evsel is already merged */ + if (evsel->merged_stat) + return; + + if (evsel->auto_merge_stats || evsel__should_merge_hybrid(evsel, config)) + evsel__merge_aliases(evsel); +} + +/* merge the same uncore and hybrid events if requested */ +void perf_stat_merge_counters(struct perf_stat_config *config, struct evli= st *evlist) +{ + struct evsel *evsel; + + if (config->no_merge) + return; + + evlist__for_each_entry(evlist, evsel) + evsel__merge_stats(evsel, config); +} + int perf_event__process_stat_event(struct perf_session *session, union perf_event *event) { diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 3a876ad2870b..12cc60ab04e4 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -270,6 +270,8 @@ void evlist__reset_aggr_stats(struct evlist *evlist); =20 int perf_stat_process_counter(struct perf_stat_config *config, struct evsel *counter); +void perf_stat_merge_counters(struct perf_stat_config *config, struct evli= st *evlist); + struct perf_tool; union perf_event; struct perf_session; --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 F23FAC433FE for ; Mon, 10 Oct 2022 05:37:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231636AbiJJFh3 (ORCPT ); Mon, 10 Oct 2022 01:37:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231477AbiJJFgt (ORCPT ); Mon, 10 Oct 2022 01:36:49 -0400 Received: from mail-pj1-x1034.google.com (mail-pj1-x1034.google.com [IPv6:2607:f8b0:4864:20::1034]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2DE1D52DF9; Sun, 9 Oct 2022 22:36:25 -0700 (PDT) Received: by mail-pj1-x1034.google.com with SMTP id b15so9002596pje.1; Sun, 09 Oct 2022 22:36:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=jzN3/Jp27IGH3bxP/WkyQ0M8l72rBBWZ6h1uVvahk+o=; b=CP5oxA2RWTij7e34DbaOUGkn4omtv8fr3lW8sMvpUAe2Vp3i3Kmhfd2J+qcTFZK6Qs eMBy2Ix6GgW59/p4qLfClzN88adPjr1bulgDgUw3Hwd/5XhcNZMoRboS02h08P016xeA 5o9bjMqWC+ESVoRm1Ww2eJiE3gaVCsiAzLVkLlTNTKqWdsW7s2wsp++Fs+xLAlJkm35q qk1Hfqzzla5HbQ/P+1tliJl5cG/TxFZ4qvWj7VLsbTsUReRQAqRVQbMUOqtvvIFLrgFG RbsU8uzLZFEjONQAadJmMeBCFG4k60eiF2Qovjl9dbqyTm7iMxYFuoCslkG9QYrTFDTm Uz6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=jzN3/Jp27IGH3bxP/WkyQ0M8l72rBBWZ6h1uVvahk+o=; b=EXaNa46VyR6wpOSCjq5yltQLUCr/qPVBnVDTFy9p3Y36uC6DGCG8NqEAUE3/xff7Qd +u3oCLR755URTPVTad1sdDXnfnKlSIIAbFC1cn6Snt25J8iV0/JzJXKN+rxpSrj79dJX twdPHDbywtMVmaka1ojH6xFT/Knl53+dpmyTE4mZnAz2Xb7pSw6Zo27a+AFKkwLDz/Ib BfNXhTN8eDq/63ynrXIT9mOLvKW1JaymxpCzhP6sZrxpUuqkSkeAjjSx0jIc12lJgRuo ZwUpUXeIocBoJklVPLJxQFugnLBPHbAIQySE7fligrzNmyzMiTQChI9GtiulZAhDI1hf 4IHQ== X-Gm-Message-State: ACrzQf3lXW3q1YKX7sh9Q4UcCgv4bx55Jru3Rr2TXsn/5FuUirayGthc 0CwMNj6Kyw0rJ3hfK9vKRFE= X-Google-Smtp-Source: AMsMyM4rt0TzEwk2ymxCYoKDTBhfbS2Y7a23wkgcd6zdka/Tc9I4es8nBHu3ExC8Ai8h1mUm65t7Cg== X-Received: by 2002:a17:902:dac4:b0:178:2a6f:bc7f with SMTP id q4-20020a170902dac400b001782a6fbc7fmr18225612plx.129.1665380185137; Sun, 09 Oct 2022 22:36:25 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:24 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 15/19] perf stat: Add perf_stat_process_percore() Date: Sun, 9 Oct 2022 22:35:56 -0700 Message-Id: <20221010053600.272854-16-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The perf_stat_process_percore() is to aggregate counts for an event per-core even if the aggr_mode is AGGR_NONE. This is enabled when user requested it on the command line. To handle that, it keeps the per-cpu counts at first. And then it aggregat= es the counts that have the same core id in the aggr->counts and updates the values for each cpu back. Later, per-core events will skip one of the CPUs unless percore-show-thread option is given. In that case, it can simply print all cpu stats with the updated (per-core) values. Signed-off-by: Namhyung Kim --- tools/perf/builtin-stat.c | 1 + tools/perf/util/stat.c | 71 +++++++++++++++++++++++++++++++++++++++ tools/perf/util/stat.h | 2 ++ 3 files changed, 74 insertions(+) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index f90e8f29cb23..c127e784a7be 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -488,6 +488,7 @@ static void process_counters(void) } =20 perf_stat_merge_counters(&stat_config, evsel_list); + perf_stat_process_percore(&stat_config, evsel_list); } =20 static void process_interval(void) diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 1bb197782a34..d788d0e85204 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -671,6 +671,77 @@ void perf_stat_merge_counters(struct perf_stat_config = *config, struct evlist *ev evsel__merge_stats(evsel, config); } =20 +static void evsel__update_percore_stats(struct evsel *evsel, struct aggr_c= pu_id *core_id) +{ + struct perf_stat_evsel *ps =3D evsel->stats; + struct perf_counts_values counts =3D { 0, }; + struct aggr_cpu_id id; + struct perf_cpu cpu; + int idx; + + /* collect per-core counts */ + perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { + struct perf_stat_aggr *aggr =3D &ps->aggr[idx]; + + id =3D aggr_cpu_id__core(cpu, NULL); + if (!aggr_cpu_id__equal(core_id, &id)) + continue; + + counts.val +=3D aggr->counts.val; + counts.ena +=3D aggr->counts.ena; + counts.run +=3D aggr->counts.run; + } + + /* update aggregated per-core counts for each CPU */ + perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { + struct perf_stat_aggr *aggr =3D &ps->aggr[idx]; + + id =3D aggr_cpu_id__core(cpu, NULL); + if (!aggr_cpu_id__equal(core_id, &id)) + continue; + + aggr->counts.val =3D counts.val; + aggr->counts.ena =3D counts.ena; + aggr->counts.run =3D counts.run; + + aggr->used =3D true; + } +} + +/* we have an aggr_map for cpu, but want to aggregate the counters per-cor= e */ +static void evsel__process_percore(struct evsel *evsel) +{ + struct perf_stat_evsel *ps =3D evsel->stats; + struct aggr_cpu_id core_id; + struct perf_cpu cpu; + int idx; + + if (!evsel->percore) + return; + + perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) { + struct perf_stat_aggr *aggr =3D &ps->aggr[idx]; + + if (aggr->used) + continue; + + core_id =3D aggr_cpu_id__core(cpu, NULL); + evsel__update_percore_stats(evsel, &core_id); + } +} + +/* process cpu stats on per-core events */ +void perf_stat_process_percore(struct perf_stat_config *config, struct evl= ist *evlist) +{ + struct evsel *evsel; + + if (config->aggr_mode !=3D AGGR_NONE) + return; + + evlist__for_each_entry(evlist, evsel) + evsel__process_percore(evsel); +} + int perf_event__process_stat_event(struct perf_session *session, union perf_event *event) { diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index 12cc60ab04e4..ac85ed46aa59 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -46,6 +46,7 @@ enum perf_stat_evsel_id { struct perf_stat_aggr { struct perf_counts_values counts; int nr; + bool used; bool failed; }; =20 @@ -271,6 +272,7 @@ void evlist__reset_aggr_stats(struct evlist *evlist); int perf_stat_process_counter(struct perf_stat_config *config, struct evsel *counter); void perf_stat_merge_counters(struct perf_stat_config *config, struct evli= st *evlist); +void perf_stat_process_percore(struct perf_stat_config *config, struct evl= ist *evlist); =20 struct perf_tool; union perf_event; --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 04B87C433FE for ; Mon, 10 Oct 2022 05:37:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231501AbiJJFhY (ORCPT ); Mon, 10 Oct 2022 01:37:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54690 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231478AbiJJFgt (ORCPT ); Mon, 10 Oct 2022 01:36:49 -0400 Received: from mail-pj1-x1036.google.com (mail-pj1-x1036.google.com [IPv6:2607:f8b0:4864:20::1036]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38ACE52DFE; Sun, 9 Oct 2022 22:36:27 -0700 (PDT) Received: by mail-pj1-x1036.google.com with SMTP id 70so8971006pjo.4; Sun, 09 Oct 2022 22:36:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=GX5y0ikZAYW5Bpjhz7zWhzB3ocG6z5CCRYX/NNZXFqk=; b=de8NgJKNG/Yczz2o4tiR66Sxg+06ca7DvGQmJdRKNDSJbwxLsuhDJhvT7w07OUaBPz tQmWiFZydGyeVSCHzhi9SJc1FepW4k5RkRJqp6vTdeivVewZCZfdSXpPSnSfOaqWluoS m1z5zBXb7KoRlnrSdZ9ibrNXRw4ttLRMLaR6IrbIbb8sTLw0X5ZgCEMKvokM4k7G+6C8 VoFus8JOTB99kVJGmbqSwDalpMmGJBvtO3REYV1RhYwX7PD3jo7lWZkp0JG9Dj6WarUP BXeat8uFWv2E3+qkzRI0Xfk4Au31E7QCe1lXvjtyb610p3+8RmRnBDJW3DENk6ePoA1r joUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=GX5y0ikZAYW5Bpjhz7zWhzB3ocG6z5CCRYX/NNZXFqk=; b=48AoEFXz7ntEeT18IhlWDpPXsWMErdtqkeeUTLCWHEEfsgCYzgC2/zsIHL3zs5iu5a +cj6zJ6IMLsjISxt62ucZU+0QQXNVIAn0jEEz/PMle/LezI9SD9gc1dnZP208DH4Ji0W /4nkMnO+AqM632wBJX7vknGykZ+tASganYD9J7R+hzQCymzC85c/lE5Mh9wFPmsMi1L6 uZ6lNQDldTp7NVI5f6NO3EFLJdwKa5E7KiznQD3FLZqlaABo0t9mBARBxUgGr79xBqjp kqzwuczqSEVsuSy8Ly6Xg70vqLsAOfJWWz9zBGWHtNYuaboT5Nhfheae0TEbAtnnbJNQ zFyg== X-Gm-Message-State: ACrzQf2fPfnmGPa91OuSJbBXcjQ1ilx9Nsw5wRUOqcUTlTrFeECbgxHh 7NNWRBCoI9qxbG7iSnFD6cE= X-Google-Smtp-Source: AMsMyM7a6E0TCpDTolR9sp2x19rqP9jSbj4S5/lwASDJ4HpGNcoNR7JTk0YVInFSqvb7luUXOH1OIA== X-Received: by 2002:a17:90a:8b93:b0:20a:bd84:5182 with SMTP id z19-20020a17090a8b9300b0020abd845182mr30706631pjn.161.1665380186549; Sun, 09 Oct 2022 22:36:26 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:26 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 16/19] perf stat: Add perf_stat_process_shadow_stats() Date: Sun, 9 Oct 2022 22:35:57 -0700 Message-Id: <20221010053600.272854-17-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This function updates the shadow stats using the aggregated counts uniformly since it uses the aggr_counts for the every aggr mode. It'd have duplicate shadow stats for each items for now since the display routines will update them once again. But that'd be fine as it shows the average values and it'd be gone eventually. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/builtin-stat.c | 1 + tools/perf/util/stat.c | 50 ++++++++++++++++++++------------------- tools/perf/util/stat.h | 1 + 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index c127e784a7be..d92815f4eae0 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -489,6 +489,7 @@ static void process_counters(void) =20 perf_stat_merge_counters(&stat_config, evsel_list); perf_stat_process_percore(&stat_config, evsel_list); + perf_stat_process_shadow_stats(&stat_config, evsel_list); } =20 static void process_interval(void) diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index d788d0e85204..f2a3761dacff 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -454,7 +454,7 @@ process_counter_values(struct perf_stat_config *config,= struct evsel *evsel, aggr_counts->val +=3D count->val; aggr_counts->ena +=3D count->ena; aggr_counts->run +=3D count->run; - goto update; + return 0; } =20 if (ps->aggr) { @@ -491,32 +491,10 @@ process_counter_values(struct perf_stat_config *confi= g, struct evsel *evsel, } } =20 -update: - switch (config->aggr_mode) { - case AGGR_THREAD: - case AGGR_CORE: - case AGGR_DIE: - case AGGR_SOCKET: - case AGGR_NODE: - case AGGR_NONE: - if ((config->aggr_mode =3D=3D AGGR_NONE) && (!evsel->percore)) { - perf_stat__update_shadow_stats(evsel, count->val, - cpu_map_idx, &rt_stat); - } - - if (config->aggr_mode =3D=3D AGGR_THREAD) { - perf_stat__update_shadow_stats(evsel, count->val, - thread, &rt_stat); - } - break; - case AGGR_GLOBAL: + if (config->aggr_mode =3D=3D AGGR_GLOBAL) { aggr->val +=3D count->val; aggr->ena +=3D count->ena; aggr->run +=3D count->run; - case AGGR_UNSET: - case AGGR_MAX: - default: - break; } =20 return 0; @@ -742,6 +720,30 @@ void perf_stat_process_percore(struct perf_stat_config= *config, struct evlist *e evsel__process_percore(evsel); } =20 +static void evsel__update_shadow_stats(struct evsel *evsel) +{ + struct perf_stat_evsel *ps =3D evsel->stats; + int i; + + if (ps->aggr =3D=3D NULL) + return; + + for (i =3D 0; i < ps->nr_aggr; i++) { + struct perf_counts_values *aggr_counts =3D &ps->aggr[i].counts; + + perf_stat__update_shadow_stats(evsel, aggr_counts->val, i, &rt_stat); + } +} + +void perf_stat_process_shadow_stats(struct perf_stat_config *config __mayb= e_unused, + struct evlist *evlist) +{ + struct evsel *evsel; + + evlist__for_each_entry(evlist, evsel) + evsel__update_shadow_stats(evsel); +} + int perf_event__process_stat_event(struct perf_session *session, union perf_event *event) { diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index ac85ed46aa59..e51214918c7f 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -273,6 +273,7 @@ int perf_stat_process_counter(struct perf_stat_config *= config, struct evsel *counter); void perf_stat_merge_counters(struct perf_stat_config *config, struct evli= st *evlist); void perf_stat_process_percore(struct perf_stat_config *config, struct evl= ist *evlist); +void perf_stat_process_shadow_stats(struct perf_stat_config *config, struc= t evlist *evlist); =20 struct perf_tool; union perf_event; --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 2A148C43217 for ; Mon, 10 Oct 2022 05:37:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231660AbiJJFhl (ORCPT ); Mon, 10 Oct 2022 01:37:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55280 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231512AbiJJFgv (ORCPT ); Mon, 10 Oct 2022 01:36:51 -0400 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DCA0452E68; Sun, 9 Oct 2022 22:36:29 -0700 (PDT) Received: by mail-pj1-x102a.google.com with SMTP id n18-20020a17090ade9200b0020b0012097cso7831432pjv.0; Sun, 09 Oct 2022 22:36:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=vR1aom5QZgWUOIlibgtLDaYmSl+p+H8Gk1U99FTJ2gw=; b=Snm/+2m7cM6n0CP9h0f6+uADbOwbZKD7OvPfZ9Lj2CL6OHuTD1PDIS/ZX/rMqTW10W OZW/zY8Pq7K6nz+AyRU06T+2FxBEzFoi052rioxrl/8Ccx1LMsnmLBlyhLGrZF693DGZ m3Dzj8S/fe7EafOJPZef4/RfUeZlIRqemiB/yaT1old5rA+lZHt4TcS/w5cqtsT/RsBn jmbW+ze95pKADTHhj3gi+dHf+4lxZXiG/n289BLj2LF8/0GIYk2vSSUxL7Fh1ssfhyGc 1EDyjBdH3bqldaVviVWQfzvpFGwUMbilgaHhhAWzQF1kkwUXL0sBRIWRB0uZtB3yN2wq 0PQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vR1aom5QZgWUOIlibgtLDaYmSl+p+H8Gk1U99FTJ2gw=; b=Wi/fyHyAx0n3ZEQatLxYQylk+x78sMz2H1bIBINAD4/15Lrsd/dImadebPQ0/bsV5c k+fl3CxY+Pglm5yXJX51p60dtnZTEC0VwikufWz84v5vu4+OEsFfDBpv049pzbNEXcdo Q6LRNBv91nbdGWQthd9bv/KnxA9gf/F5V3ssBjSlLhoFvadTnNp2l26OJXle3/IKl11T d/TsDNMUeL4baYbTUlJaU70gpmiwIBM4/ocYDu6QpqfXm3vfw3iDY4CwWSlbwmy9+fjm B/7Pmzi7Q33r9xZKhIXF4/dCCzZZzS6SjN9Tql0dXgM9HL1uGj4hmoutLxfkMuAWZ2aN 0ALw== X-Gm-Message-State: ACrzQf3YX/YbLUZgx2PxDmVBc4XLUlAtDtCSHoeV0o2ZDrf9nZ5iUA2L ca+8iyV7j3b/ueHX0szQUBM= X-Google-Smtp-Source: AMsMyM6HMDAdQsySgkm9ChuMA9VVLCnWoV6Eyus36AK2KVM0cGl+8z6+QsGJ11RPIcV4+q2LuVGRNg== X-Received: by 2002:a17:902:f142:b0:17f:749f:ba27 with SMTP id d2-20020a170902f14200b0017f749fba27mr17577992plb.144.1665380188345; Sun, 09 Oct 2022 22:36:28 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:28 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 17/19] perf stat: Display event stats using aggr counts Date: Sun, 9 Oct 2022 22:35:58 -0700 Message-Id: <20221010053600.272854-18-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Now aggr counts are ready for use. Convert the display routines to use the aggr counts and update the shadow stat with them. It doesn't need to aggregate counts or collect aliases anymore during the display. Get rid of now unused struct perf_aggr_thread_value. Note that there's a difference in the display order among the aggr mode. For per-core/die/socket/node aggregation, it shows relevant events in the same unit together, whereas global/thread/no aggregation it shows the same events for different units together. So it still uses separate codes to display them due to the ordering. One more thing to note is that it breaks per-core event display for now. The next patch will fix it to have identical output as of now. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/util/stat-display.c | 428 +++++---------------------------- tools/perf/util/stat.c | 5 - tools/perf/util/stat.h | 9 - 3 files changed, 55 insertions(+), 387 deletions(-) diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index 1d8e585df4ad..0c0e22c175a1 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -442,31 +442,6 @@ static void print_metric_header(struct perf_stat_confi= g *config, fprintf(os->fh, "%*s ", config->metric_only_len, unit); } =20 -static int first_shadow_map_idx(struct perf_stat_config *config, - struct evsel *evsel, const struct aggr_cpu_id *id) -{ - struct perf_cpu_map *cpus =3D evsel__cpus(evsel); - struct perf_cpu cpu; - int idx; - - if (config->aggr_mode =3D=3D AGGR_NONE) - return perf_cpu_map__idx(cpus, id->cpu); - - if (config->aggr_mode =3D=3D AGGR_THREAD) - return id->thread_idx; - - if (!config->aggr_get_id) - return 0; - - perf_cpu_map__for_each_cpu(cpu, idx, cpus) { - struct aggr_cpu_id cpu_id =3D config->aggr_get_id(config, cpu); - - if (aggr_cpu_id__equal(&cpu_id, id)) - return idx; - } - return 0; -} - static void abs_printout(struct perf_stat_config *config, struct aggr_cpu_id id, int nr, struct evsel *evsel, double avg) { @@ -537,7 +512,7 @@ static bool is_mixed_hw_group(struct evsel *counter) static void printout(struct perf_stat_config *config, struct aggr_cpu_id i= d, int nr, struct evsel *counter, double uval, char *prefix, u64 run, u64 ena, double noise, - struct runtime_stat *st) + struct runtime_stat *st, int map_idx) { struct perf_stat_output_ctx out; struct outstate os =3D { @@ -648,8 +623,7 @@ static void printout(struct perf_stat_config *config, s= truct aggr_cpu_id id, int print_running(config, run, ena); } =20 - perf_stat__print_shadow_stats(config, counter, uval, - first_shadow_map_idx(config, counter, &id), + perf_stat__print_shadow_stats(config, counter, uval, map_idx, &out, &config->metric_events, st); if (!config->csv_output && !config->metric_only && !config->json_output) { print_noise(config, counter, noise); @@ -657,34 +631,6 @@ static void printout(struct perf_stat_config *config, = struct aggr_cpu_id id, int } } =20 -static void aggr_update_shadow(struct perf_stat_config *config, - struct evlist *evlist) -{ - int idx, s; - struct perf_cpu cpu; - struct aggr_cpu_id s2, id; - u64 val; - struct evsel *counter; - struct perf_cpu_map *cpus; - - for (s =3D 0; s < config->aggr_map->nr; s++) { - id =3D config->aggr_map->map[s]; - evlist__for_each_entry(evlist, counter) { - cpus =3D evsel__cpus(counter); - val =3D 0; - perf_cpu_map__for_each_cpu(cpu, idx, cpus) { - s2 =3D config->aggr_get_id(config, cpu); - if (!aggr_cpu_id__equal(&s2, &id)) - continue; - val +=3D perf_counts(counter->counts, idx, 0)->val; - } - perf_stat__update_shadow_stats(counter, val, - first_shadow_map_idx(config, counter, &id), - &rt_stat); - } - } -} - static void uniquify_event_name(struct evsel *counter) { char *new_name; @@ -721,137 +667,51 @@ static void uniquify_event_name(struct evsel *counte= r) counter->uniquified_name =3D true; } =20 -static void collect_all_aliases(struct perf_stat_config *config, struct ev= sel *counter, - void (*cb)(struct perf_stat_config *config, struct evsel *counter, = void *data, - bool first), - void *data) -{ - struct evlist *evlist =3D counter->evlist; - struct evsel *alias; - - alias =3D list_prepare_entry(counter, &(evlist->core.entries), core.node); - list_for_each_entry_continue (alias, &evlist->core.entries, core.node) { - /* Merge events with the same name, etc. but on different PMUs. */ - if (!strcmp(evsel__name(alias), evsel__name(counter)) && - alias->scale =3D=3D counter->scale && - alias->cgrp =3D=3D counter->cgrp && - !strcmp(alias->unit, counter->unit) && - evsel__is_clock(alias) =3D=3D evsel__is_clock(counter) && - strcmp(alias->pmu_name, counter->pmu_name)) { - alias->merged_stat =3D true; - cb(config, alias, data, false); - } - } -} - -static bool hybrid_merge(struct evsel *counter, struct perf_stat_config *c= onfig, - bool check) +static bool hybrid_uniquify(struct evsel *evsel, struct perf_stat_config *= config) { - if (evsel__is_hybrid(counter)) { - if (check) - return config->hybrid_merge; - else - return !config->hybrid_merge; - } - - return false; + return evsel__is_hybrid(evsel) && !config->hybrid_merge; } =20 -static bool collect_data(struct perf_stat_config *config, struct evsel *co= unter, - void (*cb)(struct perf_stat_config *config, struct evsel *counter, = void *data, - bool first), - void *data) +static void uniquify_counter(struct perf_stat_config *config, struct evsel= *counter) { - if (counter->merged_stat) - return false; - cb(config, counter, data, true); - if (config->no_merge || hybrid_merge(counter, config, false)) + if (config->no_merge || hybrid_uniquify(counter, config)) uniquify_event_name(counter); - else if (counter->auto_merge_stats || hybrid_merge(counter, config, true)) - collect_all_aliases(config, counter, cb, data); - return true; -} - -struct aggr_data { - u64 ena, run, val; - struct aggr_cpu_id id; - int nr; - int cpu_map_idx; -}; - -static void aggr_cb(struct perf_stat_config *config, - struct evsel *counter, void *data, bool first) -{ - struct aggr_data *ad =3D data; - int idx; - struct perf_cpu cpu; - struct perf_cpu_map *cpus; - struct aggr_cpu_id s2; - - cpus =3D evsel__cpus(counter); - perf_cpu_map__for_each_cpu(cpu, idx, cpus) { - struct perf_counts_values *counts; - - s2 =3D config->aggr_get_id(config, cpu); - if (!aggr_cpu_id__equal(&s2, &ad->id)) - continue; - if (first) - ad->nr++; - counts =3D perf_counts(counter->counts, idx, 0); - /* - * When any result is bad, make them all to give - * consistent output in interval mode. - */ - if (counts->ena =3D=3D 0 || counts->run =3D=3D 0 || - counter->counts->scaled =3D=3D -1) { - ad->ena =3D 0; - ad->run =3D 0; - break; - } - ad->val +=3D counts->val; - ad->ena +=3D counts->ena; - ad->run +=3D counts->run; - } } =20 static void print_counter_aggrdata(struct perf_stat_config *config, struct evsel *counter, int s, char *prefix, bool metric_only, - bool *first, struct perf_cpu cpu) + bool *first) { - struct aggr_data ad; FILE *output =3D config->output; u64 ena, run, val; - int nr; - struct aggr_cpu_id id; double uval; + struct perf_stat_evsel *ps =3D counter->stats; + struct perf_stat_aggr *aggr =3D &ps->aggr[s]; + struct aggr_cpu_id id =3D config->aggr_map->map[s]; + double avg =3D aggr->counts.val; =20 - ad.id =3D id =3D config->aggr_map->map[s]; - ad.val =3D ad.ena =3D ad.run =3D 0; - ad.nr =3D 0; - if (!collect_data(config, counter, aggr_cb, &ad)) + if (aggr->nr =3D=3D 0) return; =20 - if (perf_pmu__has_hybrid() && ad.ena =3D=3D 0) - return; + uniquify_counter(config, counter); + + val =3D aggr->counts.val; + ena =3D aggr->counts.ena; + run =3D aggr->counts.run; =20 - nr =3D ad.nr; - ena =3D ad.ena; - run =3D ad.run; - val =3D ad.val; if (*first && metric_only) { *first =3D false; - aggr_printout(config, counter, id, nr); + aggr_printout(config, counter, id, aggr->nr); } if (prefix && !metric_only) fprintf(output, "%s", prefix); =20 uval =3D val * counter->scale; - if (cpu.cpu !=3D -1) - id =3D aggr_cpu_id__cpu(cpu, /*data=3D*/NULL); =20 - printout(config, id, nr, counter, uval, - prefix, run, ena, 1.0, &rt_stat); + printout(config, id, aggr->nr, counter, uval, + prefix, run, ena, avg, &rt_stat, s); + if (!metric_only) fputc('\n', output); } @@ -869,8 +729,6 @@ static void print_aggr(struct perf_stat_config *config, if (!config->aggr_map || !config->aggr_get_id) return; =20 - aggr_update_shadow(config, evlist); - /* * With metric_only everything is on a single line. * Without each counter has its own line. @@ -881,188 +739,39 @@ static void print_aggr(struct perf_stat_config *conf= ig, =20 first =3D true; evlist__for_each_entry(evlist, counter) { + if (counter->merged_stat) + continue; + print_counter_aggrdata(config, counter, s, - prefix, metric_only, - &first, (struct perf_cpu){ .cpu =3D -1 }); + prefix, metric_only, + &first); } if (metric_only) fputc('\n', output); } } =20 -static int cmp_val(const void *a, const void *b) -{ - return ((struct perf_aggr_thread_value *)b)->val - - ((struct perf_aggr_thread_value *)a)->val; -} - -static struct perf_aggr_thread_value *sort_aggr_thread( - struct evsel *counter, - int *ret, - struct target *_target) -{ - int nthreads =3D perf_thread_map__nr(counter->core.threads); - int i =3D 0; - double uval; - struct perf_aggr_thread_value *buf; - - buf =3D calloc(nthreads, sizeof(struct perf_aggr_thread_value)); - if (!buf) - return NULL; - - for (int thread =3D 0; thread < nthreads; thread++) { - int idx; - u64 ena =3D 0, run =3D 0, val =3D 0; - - perf_cpu_map__for_each_idx(idx, evsel__cpus(counter)) { - struct perf_counts_values *counts =3D - perf_counts(counter->counts, idx, thread); - - val +=3D counts->val; - ena +=3D counts->ena; - run +=3D counts->run; - } - - uval =3D val * counter->scale; - - /* - * Skip value 0 when enabling --per-thread globally, - * otherwise too many 0 output. - */ - if (uval =3D=3D 0.0 && target__has_per_thread(_target)) - continue; - - buf[i].counter =3D counter; - buf[i].id =3D aggr_cpu_id__empty(); - buf[i].id.thread_idx =3D thread; - buf[i].uval =3D uval; - buf[i].val =3D val; - buf[i].run =3D run; - buf[i].ena =3D ena; - i++; - } - - qsort(buf, i, sizeof(struct perf_aggr_thread_value), cmp_val); - - if (ret) - *ret =3D i; - - return buf; -} - -static void print_aggr_thread(struct perf_stat_config *config, - struct target *_target, - struct evsel *counter, char *prefix) -{ - FILE *output =3D config->output; - int thread, sorted_threads; - struct aggr_cpu_id id; - struct perf_aggr_thread_value *buf; - - buf =3D sort_aggr_thread(counter, &sorted_threads, _target); - if (!buf) { - perror("cannot sort aggr thread"); - return; - } - - for (thread =3D 0; thread < sorted_threads; thread++) { - if (prefix) - fprintf(output, "%s", prefix); - - id =3D buf[thread].id; - printout(config, id, 0, buf[thread].counter, buf[thread].uval, - prefix, buf[thread].run, buf[thread].ena, 1.0, - &rt_stat); - fputc('\n', output); - } - - free(buf); -} - -struct caggr_data { - double avg, avg_enabled, avg_running; -}; - -static void counter_aggr_cb(struct perf_stat_config *config __maybe_unused, - struct evsel *counter, void *data, - bool first __maybe_unused) -{ - struct caggr_data *cd =3D data; - struct perf_counts_values *aggr =3D &counter->counts->aggr; - - cd->avg +=3D aggr->val; - cd->avg_enabled +=3D aggr->ena; - cd->avg_running +=3D aggr->run; -} - -/* - * Print out the results of a single counter: - * aggregated counts in system-wide mode - */ -static void print_counter_aggr(struct perf_stat_config *config, - struct evsel *counter, char *prefix) -{ - bool metric_only =3D config->metric_only; - FILE *output =3D config->output; - double uval; - struct caggr_data cd =3D { .avg =3D 0.0 }; - - if (!collect_data(config, counter, counter_aggr_cb, &cd)) - return; - - if (prefix && !metric_only) - fprintf(output, "%s", prefix); - - uval =3D cd.avg * counter->scale; - printout(config, aggr_cpu_id__empty(), 0, counter, uval, prefix, cd.avg_r= unning, - cd.avg_enabled, cd.avg, &rt_stat); - if (!metric_only) - fprintf(output, "\n"); -} - -static void counter_cb(struct perf_stat_config *config __maybe_unused, - struct evsel *counter, void *data, - bool first __maybe_unused) -{ - struct aggr_data *ad =3D data; - - ad->val +=3D perf_counts(counter->counts, ad->cpu_map_idx, 0)->val; - ad->ena +=3D perf_counts(counter->counts, ad->cpu_map_idx, 0)->ena; - ad->run +=3D perf_counts(counter->counts, ad->cpu_map_idx, 0)->run; -} - -/* - * Print out the results of a single counter: - * does not use aggregated count in system-wide - */ static void print_counter(struct perf_stat_config *config, struct evsel *counter, char *prefix) { + bool metric_only =3D config->metric_only; FILE *output =3D config->output; - u64 ena, run, val; - double uval; - int idx; - struct perf_cpu cpu; - struct aggr_cpu_id id; - - perf_cpu_map__for_each_cpu(cpu, idx, evsel__cpus(counter)) { - struct aggr_data ad =3D { .cpu_map_idx =3D idx }; - - if (!collect_data(config, counter, counter_cb, &ad)) - return; - val =3D ad.val; - ena =3D ad.ena; - run =3D ad.run; + bool first =3D false; + int s; =20 - if (prefix) - fprintf(output, "%s", prefix); + /* AGGR_THREAD doesn't have config->aggr_get_id */ + if (!config->aggr_map) + return; =20 - uval =3D val * counter->scale; - id =3D aggr_cpu_id__cpu(cpu, /*data=3D*/NULL); - printout(config, id, 0, counter, uval, prefix, - run, ena, 1.0, &rt_stat); + if (counter->merged_stat) + return; =20 - fputc('\n', output); + for (s =3D 0; s < config->aggr_map->nr; s++) { + print_counter_aggrdata(config, counter, s, + prefix, metric_only, + &first); + if (metric_only) + fputc('\n', output); } } =20 @@ -1081,6 +790,7 @@ static void print_no_aggr_metric(struct perf_stat_conf= ig *config, u64 ena, run, val; double uval; struct aggr_cpu_id id; + struct perf_stat_evsel *ps =3D counter->stats; int counter_idx =3D perf_cpu_map__idx(evsel__cpus(counter), cpu); =20 if (counter_idx < 0) @@ -1093,13 +803,13 @@ static void print_no_aggr_metric(struct perf_stat_co= nfig *config, aggr_printout(config, counter, id, 0); first =3D false; } - val =3D perf_counts(counter->counts, counter_idx, 0)->val; - ena =3D perf_counts(counter->counts, counter_idx, 0)->ena; - run =3D perf_counts(counter->counts, counter_idx, 0)->run; + val =3D ps->aggr[counter_idx].counts.val; + ena =3D ps->aggr[counter_idx].counts.ena; + run =3D ps->aggr[counter_idx].counts.run; =20 uval =3D val * counter->scale; printout(config, id, 0, counter, uval, prefix, - run, ena, 1.0, &rt_stat); + run, ena, 1.0, &rt_stat, counter_idx); } if (!first) fputc('\n', config->output); @@ -1135,8 +845,8 @@ static void print_metric_headers(struct perf_stat_conf= ig *config, }; bool first =3D true; =20 - if (config->json_output && !config->interval) - fprintf(config->output, "{"); + if (config->json_output && !config->interval) + fprintf(config->output, "{"); =20 if (prefix && !config->json_output) fprintf(config->output, "%s", prefix); @@ -1379,31 +1089,6 @@ static void print_footer(struct perf_stat_config *co= nfig) "the same PMU. Try reorganizing the group.\n"); } =20 -static void print_percore_thread(struct perf_stat_config *config, - struct evsel *counter, char *prefix) -{ - int s; - struct aggr_cpu_id s2, id; - struct perf_cpu_map *cpus; - bool first =3D true; - int idx; - struct perf_cpu cpu; - - cpus =3D evsel__cpus(counter); - perf_cpu_map__for_each_cpu(cpu, idx, cpus) { - s2 =3D config->aggr_get_id(config, cpu); - for (s =3D 0; s < config->aggr_map->nr; s++) { - id =3D config->aggr_map->map[s]; - if (aggr_cpu_id__equal(&s2, &id)) - break; - } - - print_counter_aggrdata(config, counter, s, - prefix, false, - &first, cpu); - } -} - static void print_percore(struct perf_stat_config *config, struct evsel *counter, char *prefix) { @@ -1416,15 +1101,14 @@ static void print_percore(struct perf_stat_config *= config, return; =20 if (config->percore_show_thread) - return print_percore_thread(config, counter, prefix); + return print_counter(config, counter, prefix); =20 for (s =3D 0; s < config->aggr_map->nr; s++) { if (prefix && metric_only) fprintf(output, "%s", prefix); =20 print_counter_aggrdata(config, counter, s, - prefix, metric_only, - &first, (struct perf_cpu){ .cpu =3D -1 }); + prefix, metric_only, &first); } =20 if (metric_only) @@ -1469,16 +1153,14 @@ void evlist__print_counters(struct evlist *evlist, = struct perf_stat_config *conf print_aggr(config, evlist, prefix); break; case AGGR_THREAD: - evlist__for_each_entry(evlist, counter) { - print_aggr_thread(config, _target, counter, prefix); - } - break; case AGGR_GLOBAL: - if (config->iostat_run) + if (config->iostat_run) { iostat_print_counters(evlist, config, ts, prefix =3D buf, - print_counter_aggr); - else - print_aggr(config, evlist, prefix); + print_counter); + break; + } + evlist__for_each_entry(evlist, counter) + print_counter(config, counter, prefix); break; case AGGR_NONE: if (metric_only) diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index f2a3761dacff..1652586a4925 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -545,11 +545,6 @@ int perf_stat_process_counter(struct perf_stat_config = *config, evsel__name(counter), count[0], count[1], count[2]); } =20 - /* - * Save the full runtime - to allow normalization during printout: - */ - perf_stat__update_shadow_stats(counter, *count, 0, &rt_stat); - return 0; } =20 diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h index e51214918c7f..b02d8a4ffabf 100644 --- a/tools/perf/util/stat.h +++ b/tools/perf/util/stat.h @@ -213,15 +213,6 @@ static inline void update_rusage_stats(struct rusage_s= tats *ru_stats, struct rus struct evsel; struct evlist; =20 -struct perf_aggr_thread_value { - struct evsel *counter; - struct aggr_cpu_id id; - double uval; - u64 val; - u64 run; - u64 ena; -}; - bool __perf_stat_evsel__is(struct evsel *evsel, enum perf_stat_evsel_id id= ); =20 #define perf_stat_evsel__is(evsel, id) \ --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 EC4C2C433FE for ; Mon, 10 Oct 2022 05:37:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231563AbiJJFho (ORCPT ); Mon, 10 Oct 2022 01:37:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54524 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231397AbiJJFgw (ORCPT ); Mon, 10 Oct 2022 01:36:52 -0400 Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E224652E76; Sun, 9 Oct 2022 22:36:30 -0700 (PDT) Received: by mail-pl1-x636.google.com with SMTP id 10so9519250pli.0; Sun, 09 Oct 2022 22:36:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=4mgckiuZT4A5S64HSxdgHY7ssWz/sSATAtHWII5EHdg=; b=Vy7s3LMBzsCQi1pvo1KCGVbtQixJ6/DV0AR6Ho4xfI9lMn+I4Mnosps8acKkdwj0bV HJaTe3JgFtgrDp/XtY1OhZKKfPghIOl3r3NgOZmfa9bZsqf3av1v+GqJ2IN+O8kVKjZy MDW+IpovNwmstHT2QPboonSMA7SlmwvZhDRQq36UM8JNL9rct6+2yZews+F9CMhX2zXH mR+eqPgsWvxXPA1HxO5YI+rfodWoFoRnFEC0LzI+7IHESTinV1HzKGih9S3R5G57WU6B JYscyhDEhn7R+sHy0EjW1KpOsBhnev4IH3OQenFa3SpxSD9LpoGjDt59WQnGm6tz6mIi b9Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4mgckiuZT4A5S64HSxdgHY7ssWz/sSATAtHWII5EHdg=; b=mHJltm88aW+HjHHbZpAm33BEUwXV9vLtX4EAGa7Dr7f2vJIo1CVRVVtRiYeDtDuxUQ iiwa0b5spgSR3EYuU+Sv8SEM7/si7il4cQfxPvqAxMBjqGUmNOMRUiVbnGDkIjjJzA/B vh5pt6mWYrM0Lw3fxlxy9OUIhK4SonM2+ty10mMF9zQfefQVhahsGkqtprmuFJ+zqGa9 r+HOb725gS8HUF/f5G7twmiwe5uFQOjWFlVFDB0aRwNLJa9l+VhVsCrdrSiCRcvV9f6x g13W2HumGfVhvA0oC2A6laqT9mrFUsdwsrPaIATqyj7r3RqIEtY6AdBKolOFQFhVkOQV pbAQ== X-Gm-Message-State: ACrzQf2m+0Tz95CEBjBo3zMMJd8Ro9uiDjlNJMb7U+GdRYIpH2E1K15R p+VB8AjAqxzXNgDRbbzj03Q= X-Google-Smtp-Source: AMsMyM6KwCbUS9PDxMSrCENO26i0cdMxC0eSlCpmiStV4WMFZjAjJvAnGulkoJ4XUD/pzgr/eOKxKQ== X-Received: by 2002:a17:90a:4607:b0:202:e22d:489c with SMTP id w7-20020a17090a460700b00202e22d489cmr30248410pjg.80.1665380189868; Sun, 09 Oct 2022 22:36:29 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:29 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 18/19] perf stat: Display percore events properly Date: Sun, 9 Oct 2022 22:35:59 -0700 Message-Id: <20221010053600.272854-19-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The recent change in the perf stat broke the percore event display. Note that the aggr counts are already processed so that the every sibling thread in the same core will get the per-core counter values. Check percore evsels and skip the sibling threads in the display. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/builtin-stat.c | 16 ---------------- tools/perf/util/stat-display.c | 27 +++++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index d92815f4eae0..b3a39d4c86a7 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1403,18 +1403,6 @@ static struct aggr_cpu_id perf_stat__get_cpu_cached(= struct perf_stat_config *con return perf_stat__get_aggr(config, perf_stat__get_cpu, cpu); } =20 -static bool term_percore_set(void) -{ - struct evsel *counter; - - evlist__for_each_entry(evsel_list, counter) { - if (counter->percore) - return true; - } - - return false; -} - static aggr_cpu_id_get_t aggr_mode__get_aggr(enum aggr_mode aggr_mode) { switch (aggr_mode) { @@ -1427,8 +1415,6 @@ static aggr_cpu_id_get_t aggr_mode__get_aggr(enum agg= r_mode aggr_mode) case AGGR_NODE: return aggr_cpu_id__node; case AGGR_NONE: - if (term_percore_set()) - return aggr_cpu_id__core; return aggr_cpu_id__cpu;; case AGGR_GLOBAL: return aggr_cpu_id__global; @@ -1452,8 +1438,6 @@ static aggr_get_id_t aggr_mode__get_id(enum aggr_mode= aggr_mode) case AGGR_NODE: return perf_stat__get_node_cached; case AGGR_NONE: - if (term_percore_set()) - return perf_stat__get_core_cached; return perf_stat__get_cpu_cached; case AGGR_GLOBAL: return perf_stat__get_global_cached; diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index 0c0e22c175a1..e0c0df99d40d 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -1094,7 +1094,8 @@ static void print_percore(struct perf_stat_config *co= nfig, { bool metric_only =3D config->metric_only; FILE *output =3D config->output; - int s; + struct cpu_aggr_map *core_map; + int s, c, i; bool first =3D true; =20 if (!config->aggr_map || !config->aggr_get_id) @@ -1103,13 +1104,35 @@ static void print_percore(struct perf_stat_config *= config, if (config->percore_show_thread) return print_counter(config, counter, prefix); =20 - for (s =3D 0; s < config->aggr_map->nr; s++) { + core_map =3D cpu_aggr_map__empty_new(config->aggr_map->nr); + if (core_map =3D=3D NULL) { + fprintf(output, "Cannot allocate per-core aggr map for display\n"); + return; + } + + for (s =3D 0, c =3D 0; s < config->aggr_map->nr; s++) { + struct perf_cpu curr_cpu =3D config->aggr_map->map[s].cpu; + struct aggr_cpu_id core_id =3D aggr_cpu_id__core(curr_cpu, NULL); + bool found =3D false; + + for (i =3D 0; i < c; i++) { + if (aggr_cpu_id__equal(&core_map->map[i], &core_id)) { + found =3D true; + break; + } + } + if (found) + continue; + if (prefix && metric_only) fprintf(output, "%s", prefix); =20 print_counter_aggrdata(config, counter, s, prefix, metric_only, &first); + + core_map->map[c++] =3D core_id; } + free(core_map); =20 if (metric_only) fputc('\n', output); --=20 2.38.0.rc1.362.ged0d419d3c-goog From nobody Tue Apr 7 01:53:20 2026 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 A95E8C433FE for ; Mon, 10 Oct 2022 05:37:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231674AbiJJFht (ORCPT ); Mon, 10 Oct 2022 01:37:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55528 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231532AbiJJFhC (ORCPT ); Mon, 10 Oct 2022 01:37:02 -0400 Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DF52D52FCF; Sun, 9 Oct 2022 22:36:32 -0700 (PDT) Received: by mail-pl1-x62e.google.com with SMTP id 10so9519297pli.0; Sun, 09 Oct 2022 22:36:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=4ZRfNgpH8+QQskCftYrV3a1L7cFwkrDDjN2C/btv0xM=; b=CrjTwzbv9QdU2O7HOgqcbEbr5SNOMwRCiDybfIdwVA3jgqwRcXmdSXWb0DQCBW/Sxe eqTYvbHUsVnKe/L8fhHLAFZw8fwhA6S6JhuSNC27IHjtLrNqBeqJjd9u7p1+NOrQCBvT IpxYeteOBkWsC5We+9IZnybLpUppKes+ly0ctN9jyknoDHFAOa+qpGlC8IWkeDk7X+V4 YTTjJPIYHr1ybPw6YmMCzIulCk10lu6ZO8MdbG7iMPRhhbA/uz0dGbTPkjMuxOd5dbTL BoVHwynWGBk4fVfLqLUAZZpu2kNFdtHBppPd3i1djVKhJ6obWbGJnCvpPKEtZ/bh3MIw q2FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4ZRfNgpH8+QQskCftYrV3a1L7cFwkrDDjN2C/btv0xM=; b=dFxORnZ4XMGhflqFMSOrCD/ZHQvpeTpxSZL+dPquDpdXD2vZ5zetwuCe5hAt6iZGyI q5njF7CMbWhKQtv0aaT3P4Jm2M8UF/V9RhuyF2pPjIXgu8ylybHEJa9SiqbYVkqutkcM VQXxFeDjq4PqFizxXvPz/j5ndUwTKBYYAW7rVB1bfuAgLh3La3ZL53R8OprJxIgqBhGw PahTiSAHeXA3Uiz/Go+OeFZEBe7UYahB5Nr3/7wgmK1oeYhJzenqHNah2SQ7NWTSUcv8 42oACwY/Wcs7sOVBE1sj1zAw8vIc8k4kWhjj0tJ6Kboi5YwWWtHGnPgNZs7JuOeepkl4 MiKA== X-Gm-Message-State: ACrzQf1WH9W28DFdKFKqGqCKmmp+ZtMhT58mQiJWbYXA73G39MzQBDSQ szdn5Q5UB961I2EU766jpV0= X-Google-Smtp-Source: AMsMyM4tcmbSFEYk6C7wDIQIZtfrOgXnBkkUnsAPW/oelNBgiQNT6rPdzE+wyVgY/YothJXFb72nvw== X-Received: by 2002:a17:902:8bc3:b0:178:8563:8e42 with SMTP id r3-20020a1709028bc300b0017885638e42mr17096014plo.0.1665380191303; Sun, 09 Oct 2022 22:36:31 -0700 (PDT) Received: from balhae.hsd1.ca.comcast.net ([2601:647:6780:1040:862f:cd0e:bf30:6d69]) by smtp.gmail.com with ESMTPSA id u13-20020a170902e80d00b0017f7e0f4a4esm5667594plg.35.2022.10.09.22.36.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 22:36:30 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, Kan Liang , Leo Yan , Andi Kleen , Athira Rajeev , James Clark , Xing Zhengjun Subject: [PATCH 19/19] perf stat: Remove unused perf_counts.aggr field Date: Sun, 9 Oct 2022 22:36:00 -0700 Message-Id: <20221010053600.272854-20-namhyung@kernel.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221010053600.272854-1-namhyung@kernel.org> References: <20221010053600.272854-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The aggr field in the struct perf_counts is to keep the aggregated value in the AGGR_GLOBAL for the old code. But it's not used anymore. Signed-off-by: Namhyung Kim Acked-by: Ian Rogers --- tools/perf/util/counts.c | 1 - tools/perf/util/counts.h | 1 - tools/perf/util/stat.c | 35 ++--------------------------------- 3 files changed, 2 insertions(+), 35 deletions(-) diff --git a/tools/perf/util/counts.c b/tools/perf/util/counts.c index 7a447d918458..11cd85b278a6 100644 --- a/tools/perf/util/counts.c +++ b/tools/perf/util/counts.c @@ -48,7 +48,6 @@ void perf_counts__reset(struct perf_counts *counts) { xyarray__reset(counts->loaded); xyarray__reset(counts->values); - memset(&counts->aggr, 0, sizeof(struct perf_counts_values)); } =20 void evsel__reset_counts(struct evsel *evsel) diff --git a/tools/perf/util/counts.h b/tools/perf/util/counts.h index 5de275194f2b..42760242e0df 100644 --- a/tools/perf/util/counts.h +++ b/tools/perf/util/counts.h @@ -11,7 +11,6 @@ struct evsel; =20 struct perf_counts { s8 scaled; - struct perf_counts_values aggr; struct xyarray *values; struct xyarray *loaded; }; diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 1652586a4925..0dccfa273fa7 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -307,8 +307,6 @@ static void evsel__copy_prev_raw_counts(struct evsel *e= vsel) *perf_counts(evsel->prev_raw_counts, idx, thread); } } - - evsel->counts->aggr =3D evsel->prev_raw_counts->aggr; } =20 void evlist__copy_prev_raw_counts(struct evlist *evlist) @@ -319,26 +317,6 @@ void evlist__copy_prev_raw_counts(struct evlist *evlis= t) evsel__copy_prev_raw_counts(evsel); } =20 -void evlist__save_aggr_prev_raw_counts(struct evlist *evlist) -{ - struct evsel *evsel; - - /* - * To collect the overall statistics for interval mode, - * we copy the counts from evsel->prev_raw_counts to - * evsel->counts. The perf_stat_process_counter creates - * aggr values from per cpu values, but the per cpu values - * are 0 for AGGR_GLOBAL. So we use a trick that saves the - * previous aggr value to the first member of perf_counts, - * then aggr calculation in process_counter_values can work - * correctly. - */ - evlist__for_each_entry(evlist, evsel) { - *perf_counts(evsel->prev_raw_counts, 0, 0) =3D - evsel->prev_raw_counts->aggr; - } -} - static size_t pkg_id_hash(const void *__key, void *ctx __maybe_unused) { uint64_t *key =3D (uint64_t *) __key; @@ -422,7 +400,6 @@ process_counter_values(struct perf_stat_config *config,= struct evsel *evsel, int cpu_map_idx, int thread, struct perf_counts_values *count) { - struct perf_counts_values *aggr =3D &evsel->counts->aggr; struct perf_stat_evsel *ps =3D evsel->stats; static struct perf_counts_values zero; bool skip =3D false; @@ -491,12 +468,6 @@ process_counter_values(struct perf_stat_config *config= , struct evsel *evsel, } } =20 - if (config->aggr_mode =3D=3D AGGR_GLOBAL) { - aggr->val +=3D count->val; - aggr->ena +=3D count->ena; - aggr->run +=3D count->run; - } - return 0; } =20 @@ -521,13 +492,10 @@ static int process_counter_maps(struct perf_stat_conf= ig *config, int perf_stat_process_counter(struct perf_stat_config *config, struct evsel *counter) { - struct perf_counts_values *aggr =3D &counter->counts->aggr; struct perf_stat_evsel *ps =3D counter->stats; - u64 *count =3D counter->counts->aggr.values; + u64 *count; int ret; =20 - aggr->val =3D aggr->ena =3D aggr->run =3D 0; - if (counter->per_pkg) evsel__zero_per_pkg(counter); =20 @@ -538,6 +506,7 @@ int perf_stat_process_counter(struct perf_stat_config *= config, if (config->aggr_mode !=3D AGGR_GLOBAL) return 0; =20 + count =3D ps->aggr[0].counts.values; update_stats(&ps->res_stats, *count); =20 if (verbose > 0) { --=20 2.38.0.rc1.362.ged0d419d3c-goog