From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE939C27C7C for ; Fri, 20 Jan 2023 17:22:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229967AbjATRWJ (ORCPT ); Fri, 20 Jan 2023 12:22:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34408 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229491AbjATRWH (ORCPT ); Fri, 20 Jan 2023 12:22:07 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 72EA2AA7F5; Fri, 20 Jan 2023 09:22:00 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DBF8361FD0; Fri, 20 Jan 2023 17:21:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E6FDCC433D2; Fri, 20 Jan 2023 17:21:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1674235319; bh=aOWrIzoVktGpfYehvAOwo66W8UYD3v3uShD7W+37SkQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=fl1M6r+8nm7kVpvmvlLo7D52eAx8jv03B0opPD4vqI6RfrKiz8qcDi1MX0RaQr2ce Y1rcXTlUvgj00/rIIeWsrRkKA4JKAOXcn3yD2cRU2qy+W+VRySek0WRD6/PGtevzty ZpviaUbdn6Vibc/MulAbYQbFcTfTths5/hiAC/+7Q+p0DBLMgGVcCR9eO3iSy5Insg 1AHoVlpeYY89Q7hVKrpIC/dOdSa50SJCBTDgFRAnZy84uCQt6EAT1WWBGp8FRkg1oP cm8iNK0hO7+79xtUYZyXSdGOC4H8LkNB5jVAIAuJkVAMSH4v+d0Y4erTKeY7fI9i8B 4qEtiSzEjilXw== Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id 7F06B405BE; Fri, 20 Jan 2023 14:21:56 -0300 (-03) Date: Fri, 20 Jan 2023 14:21:56 -0300 From: Arnaldo Carvalho de Melo To: James Clark Cc: linux-perf-users@vger.kernel.org, tanmay@marvell.com, leo.yan@linaro.org, mike.leach@linaro.org, sgoutham@marvell.com, gcherian@marvell.com, lcherian@marvell.com, bbhushan2@marvell.com, Mathieu Poirier , Suzuki K Poulose , John Garry , Will Deacon , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 2/8] perf: Use perf_pmu__open_file() and perf_pmu__scan_file() Message-ID: References: <20230120143702.4035046-1-james.clark@arm.com> <20230120143702.4035046-3-james.clark@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230120143702.4035046-3-james.clark@arm.com> X-Url: http://acmel.wordpress.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Fri, Jan 20, 2023 at 02:36:55PM +0000, James Clark escreveu: > Remove some code that duplicates existing methods. Copy strings where > const strings are required. > > No functional changes. Have you used 'perf test'? [acme@quaco perf]$ perf test -v python Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc 19: 'import perf' in python : --- start --- test child forked, pid 232379 python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' " Traceback (most recent call last): File "", line 1, in ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: perf_pmu__scan_file test child finished with -1 ---- end ---- 'import perf' in python: FAILED! [acme@quaco perf]$ > Reviewed-by: Leo Yan > Signed-off-by: James Clark > --- > tools/perf/util/cputopo.c | 9 +------- > tools/perf/util/pmu-hybrid.c | 27 +++++------------------- > tools/perf/util/pmu.c | 40 +++++++++++------------------------- > tools/perf/util/pmu.h | 3 ++- > 4 files changed, 20 insertions(+), 59 deletions(-) > > diff --git a/tools/perf/util/cputopo.c b/tools/perf/util/cputopo.c > index 1a3ff6449158..e08797c3cdbc 100644 > --- a/tools/perf/util/cputopo.c > +++ b/tools/perf/util/cputopo.c > @@ -422,8 +422,6 @@ void numa_topology__delete(struct numa_topology *tp) > static int load_hybrid_node(struct hybrid_topology_node *node, > struct perf_pmu *pmu) > { > - const char *sysfs; > - char path[PATH_MAX]; > char *buf = NULL, *p; > FILE *fp; > size_t len = 0; > @@ -432,12 +430,7 @@ static int load_hybrid_node(struct hybrid_topology_node *node, > if (!node->pmu_name) > return -1; > > - sysfs = sysfs__mountpoint(); > - if (!sysfs) > - goto err; > - > - snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, pmu->name); > - fp = fopen(path, "r"); > + fp = perf_pmu__open_file(pmu, "cpus"); > if (!fp) > goto err; > > diff --git a/tools/perf/util/pmu-hybrid.c b/tools/perf/util/pmu-hybrid.c > index f51ccaac60ee..38628805a952 100644 > --- a/tools/perf/util/pmu-hybrid.c > +++ b/tools/perf/util/pmu-hybrid.c > @@ -20,32 +20,15 @@ LIST_HEAD(perf_pmu__hybrid_pmus); > > bool perf_pmu__hybrid_mounted(const char *name) > { > - char path[PATH_MAX]; > - const char *sysfs; > - FILE *file; > - int n, cpu; > + int cpu; > + char pmu_name[PATH_MAX]; > + struct perf_pmu pmu = {.name = pmu_name}; > > if (strncmp(name, "cpu_", 4)) > return false; > > - sysfs = sysfs__mountpoint(); > - if (!sysfs) > - return false; > - > - snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, name); > - if (!file_available(path)) > - return false; > - > - file = fopen(path, "r"); > - if (!file) > - return false; > - > - n = fscanf(file, "%u", &cpu); > - fclose(file); > - if (n <= 0) > - return false; > - > - return true; > + strlcpy(pmu_name, name, sizeof(pmu_name)); > + return perf_pmu__scan_file(&pmu, "cpus", "%u", &cpu) > 0; > } > > struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name) > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c > index 1edbb714ff32..a771a5972fc5 100644 > --- a/tools/perf/util/pmu.c > +++ b/tools/perf/util/pmu.c > @@ -571,45 +571,31 @@ static void pmu_read_sysfs(void) > closedir(dir); > } > > -static struct perf_cpu_map *__pmu_cpumask(const char *path) > -{ > - FILE *file; > - struct perf_cpu_map *cpus; > - > - file = fopen(path, "r"); > - if (!file) > - return NULL; > - > - cpus = perf_cpu_map__read(file); > - fclose(file); > - return cpus; > -} > - > /* > * Uncore PMUs have a "cpumask" file under sysfs. CPU PMUs (e.g. on arm/arm64) > * may have a "cpus" file. > */ > #define SYS_TEMPLATE_ID "./bus/event_source/devices/%s/identifier" > -#define CPUS_TEMPLATE_UNCORE "%s/bus/event_source/devices/%s/cpumask" > > static struct perf_cpu_map *pmu_cpumask(const char *name) > { > - char path[PATH_MAX]; > struct perf_cpu_map *cpus; > - const char *sysfs = sysfs__mountpoint(); > const char *templates[] = { > - CPUS_TEMPLATE_UNCORE, > - CPUS_TEMPLATE_CPU, > + "cpumask", > + "cpus", > NULL > }; > const char **template; > + char pmu_name[PATH_MAX]; > + struct perf_pmu pmu = {.name = pmu_name}; > + FILE *file; > > - if (!sysfs) > - return NULL; > - > + strlcpy(pmu_name, name, sizeof(pmu_name)); > for (template = templates; *template; template++) { > - snprintf(path, PATH_MAX, *template, sysfs, name); > - cpus = __pmu_cpumask(path); > + file = perf_pmu__open_file(&pmu, *template); > + if (!file) > + continue; > + cpus = perf_cpu_map__read(file); > if (cpus) > return cpus; > } > @@ -620,13 +606,11 @@ static struct perf_cpu_map *pmu_cpumask(const char *name) > static bool pmu_is_uncore(const char *name) > { > char path[PATH_MAX]; > - const char *sysfs; > > if (perf_pmu__hybrid_mounted(name)) > return false; > > - sysfs = sysfs__mountpoint(); > - snprintf(path, PATH_MAX, CPUS_TEMPLATE_UNCORE, sysfs, name); > + perf_pmu__pathname_scnprintf(path, sizeof(path), name, "cpumask"); > return file_available(path); > } > > @@ -1737,7 +1721,7 @@ bool pmu_have_event(const char *pname, const char *name) > return false; > } > > -static FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name) > +FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name) > { > char path[PATH_MAX]; > > diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h > index 96d030c8b3b3..742d4db319a0 100644 > --- a/tools/perf/util/pmu.h > +++ b/tools/perf/util/pmu.h > @@ -7,6 +7,7 @@ > #include > #include > #include > +#include > #include "parse-events.h" > #include "pmu-events/pmu-events.h" > > @@ -22,7 +23,6 @@ enum { > }; > > #define PERF_PMU_FORMAT_BITS 64 > -#define CPUS_TEMPLATE_CPU "%s/bus/event_source/devices/%s/cpus" > #define MAX_PMU_NAME_LEN 128 > > struct perf_event_attr; > @@ -262,5 +262,6 @@ double perf_pmu__cpu_slots_per_cycle(void); > int perf_pmu__event_source_devices_scnprintf(char *pathname, size_t size); > int perf_pmu__pathname_scnprintf(char *buf, size_t size, > const char *pmu_name, const char *filename); > +FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name); > > #endif /* __PMU_H */ > -- > 2.25.1 > -- - Arnaldo