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 822F3C27C7C for ; Fri, 20 Jan 2023 17:33:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230231AbjATRdc (ORCPT ); Fri, 20 Jan 2023 12:33:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49940 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230222AbjATRdb (ORCPT ); Fri, 20 Jan 2023 12:33:31 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 52E2FDA10B; Fri, 20 Jan 2023 09:33: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 8E70F6202E; Fri, 20 Jan 2023 17:32:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 959C3C433EF; Fri, 20 Jan 2023 17:32:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1674235954; bh=IdUYMSt3wTGv2diJCAcwKvFCfNaWHFQmpW/zxgBkcx8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=sEUTACJCTrqLyFYdY9iGjjURfV8/9YXDIqx013dd83fYyf5Oyx9e7UvZjgXdt2o8m BDRDB4otAl0Mm9y2G9qfVtywTfJjw5SMe88gn2fmaYe4zFe+CBOO/hh4aPQVOAvfIH +/5ZLn2fpcQK6tsh7v5tlh1zNDXJY2FKPBtIqit8e9TUoImkbDG+ROw6CI7s2ECoZF fBxz39uBBTVl7Km4GD7SkKFOsnLLaydjy6tmMhXGCxudFHPrNX9kW3MaSGPmDGq54A mpO5T+aLjG39w0UrNIc6sBsf5GOWNlkbMDUJHQh90HaVTYPaQH/lfsyrtGFK3TuD2/ HgIqX0+65+iSQ== Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id EA224405BE; Fri, 20 Jan 2023 14:32:30 -0300 (-03) Date: Fri, 20 Jan 2023 14:32:30 -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: X-Url: http://acmel.wordpress.com Precedence: bulk List-ID: X-Mailing-List: linux-perf-users@vger.kernel.org Em Fri, Jan 20, 2023 at 02:21:56PM -0300, Arnaldo Carvalho de Melo escreveu: > 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]$ I added this to this cset, now it passes. diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index d948455e5ed43656..9e5d881b098767a3 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c @@ -20,6 +20,7 @@ #include "stat.h" #include "metricgroup.h" #include "util/env.h" +#include "util/pmu.h" #include #include "util.h" @@ -83,7 +84,7 @@ void perf_stat__collect_metric_expr(struct evlist *evsel_list) } /* - * This one is needed not to drag the PMU bandwagon, jevents generated + * These ones are needed not to drag the PMU bandwagon, jevents generated * pmu_sys_event_tables, etc and evsel__find_pmu() is used so far just for * doing per PMU perf_event_attr.exclude_guest handling, not really needed, so * far, for the perf python binding known usecases, revisit if this become @@ -94,6 +95,11 @@ struct perf_pmu *evsel__find_pmu(struct evsel *evsel __maybe_unused) return NULL; } +int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt, ...) +{ + return EOF; +} + /* * Add this one here not to drag util/metricgroup.c */ > > 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 -- - Arnaldo 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B24F4C25B4E for ; Fri, 20 Jan 2023 17:35:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=hWp4p1se0a6nto+r50fheBGpx3HNfFdkvVuTsWwZEpc=; b=k8Qr7rCRSO9lSv YKb2bG/rUN3BWnXJeFthAUzJhYN3tiBCvvFycr+sbCG7SCuWQHrvKz5a2NAdFXZZ7zH9X76hHTMSb XLVXRm/ldYdBQ5B36AjGJiU+WlRBiJFosfyf5oG5EOjlyHvNfx+oC8mP73loxcQF21h5t08s3woXa YNxXwqgjKAsWm2vpeTRL8oX7pXvnise425+ocvrSJIuTHBWalAKU4npaqg6ZGbuSyVjANPfQAzA1Z jP8KzEUQg7XMU/SgWqqdQF85w+5pdUAMIS1RQ9Bvsx7Q/bmNcHUB30+Apu3PTTnEmuy28tj94izov NQarMuy7UUpTzWRdLAOw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pIvHw-00BdR5-1n; Fri, 20 Jan 2023 17:34:52 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pIvFj-00BcR6-HR for linux-arm-kernel@bombadil.infradead.org; Fri, 20 Jan 2023 17:32:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=uN8x6Ktakwt2sWn6ioIMr5m5/u8yoHD09T0pqaLYRZc=; b=MpM3jQLIXQwhCbfKCQm9oD/L0y 5RpL0esphmA4vYt+zV8kmNK1+C1bbGC0dVGUOthP62i+soI4/ioDqzzKqdR9HiIPDV9X+zv+oPEf6 miHYiXXdOT2nJ2jf05P/g0HSiaQgdHaKLdR3w9hn1bt5sBwqXO4l6srhVcyQt1dbsL/ncGda3y9NW OgtMNhDVmDD4KIYz8I3/95D5rPF7pEqtTSpDRmZ0MQ9St8QmaVYX0j/A4LzYs5HFDe1TlMZOQeOEd PMVsGR0rvKXKIEDEPeR3nYVPGRPjFjmRHlVw3m9SZjHm14ycWa5KBSoeAT1mrQ31VAjPiPzKZlEwc TqQYRCQQ==; Received: from [187.19.237.165] (helo=quaco.ghostprotocols.net) by casper.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1pIvFh-002Gaw-5e; Fri, 20 Jan 2023 17:32:34 +0000 Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id EA224405BE; Fri, 20 Jan 2023 14:32:30 -0300 (-03) Date: Fri, 20 Jan 2023 14:32:30 -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-Disposition: inline In-Reply-To: X-Url: http://acmel.wordpress.com X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Em Fri, Jan 20, 2023 at 02:21:56PM -0300, Arnaldo Carvalho de Melo escreveu: > 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]$ I added this to this cset, now it passes. diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index d948455e5ed43656..9e5d881b098767a3 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c @@ -20,6 +20,7 @@ #include "stat.h" #include "metricgroup.h" #include "util/env.h" +#include "util/pmu.h" #include #include "util.h" @@ -83,7 +84,7 @@ void perf_stat__collect_metric_expr(struct evlist *evsel_list) } /* - * This one is needed not to drag the PMU bandwagon, jevents generated + * These ones are needed not to drag the PMU bandwagon, jevents generated * pmu_sys_event_tables, etc and evsel__find_pmu() is used so far just for * doing per PMU perf_event_attr.exclude_guest handling, not really needed, so * far, for the perf python binding known usecases, revisit if this become @@ -94,6 +95,11 @@ struct perf_pmu *evsel__find_pmu(struct evsel *evsel __maybe_unused) return NULL; } +int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt, ...) +{ + return EOF; +} + /* * Add this one here not to drag util/metricgroup.c */ > > 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 -- - Arnaldo _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel