From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: "Peter Zijlstra" <peterz@infradead.org>,
"Ingo Molnar" <mingo@redhat.com>,
"Mark Rutland" <mark.rutland@arm.com>,
"Alexander Shishkin" <alexander.shishkin@linux.intel.com>,
"Jiri Olsa" <jolsa@kernel.org>,
"Namhyung Kim" <namhyung@kernel.org>,
"Adrian Hunter" <adrian.hunter@intel.com>,
"Suzuki K Poulose" <suzuki.poulose@arm.com>,
"Mike Leach" <mike.leach@linaro.org>,
"James Clark" <james.clark@arm.com>,
"Leo Yan" <leo.yan@linaro.org>,
"John Garry" <john.g.garry@oracle.com>,
"Will Deacon" <will@kernel.org>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Darren Hart" <dvhart@infradead.org>,
"Davidlohr Bueso" <dave@stgolabs.net>,
"André Almeida" <andrealmeid@igalia.com>,
"Kan Liang" <kan.liang@linux.intel.com>,
"K Prateek Nayak" <kprateek.nayak@amd.com>,
"Sean Christopherson" <seanjc@google.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Kajol Jain" <kjain@linux.ibm.com>,
"Athira Rajeev" <atrajeev@linux.vnet.ibm.com>,
"Andrew Jones" <ajones@ventanamicro.com>,
"Alexandre Ghiti" <alexghiti@rivosinc.com>,
"Atish Patra" <atishp@rivosinc.com>,
"Steinar H. Gunderson" <sesse@google.com>,
"Yang Jihong" <yangjihong1@huawei.com>,
"Yang Li" <yang.lee@linux.alibaba.com>,
"Changbin Du" <changbin.du@huawei.com>,
"Sandipan Das" <sandipan.das@amd.com>,
"Ravi Bangoria" <ravi.bangoria@amd.com>,
"Paran Lee" <p4ranlee@gmail.com>,
"Nick Desaulniers" <ndesaulniers@google.com>,
"Huacai Chen" <chenhuacai@kernel.org>,
"Yanteng Si" <siyanteng@loongson.cn>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org,
bpf@vger.kernel.org
Subject: Re: [PATCH v1 02/14] libperf cpumap: Rename and prefer sysfs for perf_cpu_map__default_new
Date: Tue, 12 Dec 2023 14:39:05 -0300 [thread overview]
Message-ID: <ZXiauao3bIbc0ZCo@kernel.org> (raw)
In-Reply-To: <20231129060211.1890454-3-irogers@google.com>
Em Tue, Nov 28, 2023 at 10:01:59PM -0800, Ian Rogers escreveu:
> Rename perf_cpu_map__default_new to perf_cpu_map__new_online_cpus to
> better indicate what the implementation does. Read the online CPUs
> from /sys/devices/system/cpu/online first before using sysconf as
> sysconf can't accurately configure holes in the CPU map. If sysconf is
> used, warn when the configured and online processors disagree.
>
> When reading from a file, if the read doesn't yield a CPU map then
> return an empty map rather than the default online. This avoids
> recursion but also better yields being able to detect failures.
>
> Add more comments.
>
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> tools/lib/perf/cpumap.c | 59 +++++++++++++++++-----------
> tools/lib/perf/include/perf/cpumap.h | 15 ++++++-
> tools/lib/perf/libperf.map | 2 +-
> tools/lib/perf/tests/test-cpumap.c | 2 +-
> 4 files changed, 51 insertions(+), 27 deletions(-)
>
> diff --git a/tools/lib/perf/cpumap.c b/tools/lib/perf/cpumap.c
> index 2bd6aba3d8c9..463ca8b37d45 100644
> --- a/tools/lib/perf/cpumap.c
> +++ b/tools/lib/perf/cpumap.c
> @@ -9,6 +9,7 @@
> #include <unistd.h>
> #include <ctype.h>
> #include <limits.h>
> +#include "internal.h"
>
> void perf_cpu_map__set_nr(struct perf_cpu_map *map, int nr_cpus)
> {
> @@ -66,15 +67,21 @@ void perf_cpu_map__put(struct perf_cpu_map *map)
> }
> }
>
> -static struct perf_cpu_map *cpu_map__default_new(void)
> +static struct perf_cpu_map *cpu_map__new_sysconf(void)
> {
> struct perf_cpu_map *cpus;
> - int nr_cpus;
> + int nr_cpus, nr_cpus_conf;
>
> nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);
> if (nr_cpus < 0)
> return NULL;
>
> + nr_cpus_conf = sysconf(_SC_NPROCESSORS_CONF);
> + if (nr_cpus != nr_cpus_conf) {
> + pr_warning("Number of online CPUs (%d) differs from the number configured (%d) the CPU map will only cover the first %d CPUs.",
> + nr_cpus, nr_cpus_conf, nr_cpus);
> + }
> +
> cpus = perf_cpu_map__alloc(nr_cpus);
> if (cpus != NULL) {
> int i;
> @@ -86,9 +93,27 @@ static struct perf_cpu_map *cpu_map__default_new(void)
> return cpus;
> }
>
> -struct perf_cpu_map *perf_cpu_map__default_new(void)
> +static struct perf_cpu_map *cpu_map__new_syfs_online(void)
I'm renaming this to cpu_map__new_sysfs_online(), ok?
- Arnaldo
> {
> - return cpu_map__default_new();
> + struct perf_cpu_map *cpus = NULL;
> + FILE *onlnf;
> +
> + onlnf = fopen("/sys/devices/system/cpu/online", "r");
> + if (onlnf) {
> + cpus = perf_cpu_map__read(onlnf);
> + fclose(onlnf);
> + }
> + return cpus;
> +}
> +
> +struct perf_cpu_map *perf_cpu_map__new_online_cpus(void)
> +{
> + struct perf_cpu_map *cpus = cpu_map__new_syfs_online();
> +
> + if (cpus)
> + return cpus;
> +
> + return cpu_map__new_sysconf();
> }
>
>
> @@ -180,27 +205,11 @@ struct perf_cpu_map *perf_cpu_map__read(FILE *file)
>
> if (nr_cpus > 0)
> cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
> - else
> - cpus = cpu_map__default_new();
> out_free_tmp:
> free(tmp_cpus);
> return cpus;
> }
>
> -static struct perf_cpu_map *cpu_map__read_all_cpu_map(void)
> -{
> - struct perf_cpu_map *cpus = NULL;
> - FILE *onlnf;
> -
> - onlnf = fopen("/sys/devices/system/cpu/online", "r");
> - if (!onlnf)
> - return cpu_map__default_new();
> -
> - cpus = perf_cpu_map__read(onlnf);
> - fclose(onlnf);
> - return cpus;
> -}
> -
> struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list)
> {
> struct perf_cpu_map *cpus = NULL;
> @@ -211,7 +220,7 @@ struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list)
> int max_entries = 0;
>
> if (!cpu_list)
> - return cpu_map__read_all_cpu_map();
> + return perf_cpu_map__new_online_cpus();
>
> /*
> * must handle the case of empty cpumap to cover
> @@ -268,9 +277,11 @@ struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list)
>
> if (nr_cpus > 0)
> cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
> - else if (*cpu_list != '\0')
> - cpus = cpu_map__default_new();
> - else
> + else if (*cpu_list != '\0') {
> + pr_warning("Unexpected characters at end of cpu list ('%s'), using online CPUs.",
> + cpu_list);
> + cpus = perf_cpu_map__new_online_cpus();
> + } else
> cpus = perf_cpu_map__new_any_cpu();
> invalid:
> free(tmp_cpus);
> diff --git a/tools/lib/perf/include/perf/cpumap.h b/tools/lib/perf/include/perf/cpumap.h
> index d0bf218ada11..b24bd8b8f34e 100644
> --- a/tools/lib/perf/include/perf/cpumap.h
> +++ b/tools/lib/perf/include/perf/cpumap.h
> @@ -22,7 +22,20 @@ struct perf_cpu_map;
> * perf_cpu_map__new_any_cpu - a map with a singular "any CPU"/dummy -1 value.
> */
> LIBPERF_API struct perf_cpu_map *perf_cpu_map__new_any_cpu(void);
> -LIBPERF_API struct perf_cpu_map *perf_cpu_map__default_new(void);
> +/**
> + * perf_cpu_map__new_online_cpus - a map read from
> + * /sys/devices/system/cpu/online if
> + * available. If reading wasn't possible a map
> + * is created using the online processors
> + * assuming the first 'n' processors are all
> + * online.
> + */
> +LIBPERF_API struct perf_cpu_map *perf_cpu_map__new_online_cpus(void);
> +/**
> + * perf_cpu_map__new - create a map from the given cpu_list such as "0-7". If no
> + * cpu_list argument is provided then
> + * perf_cpu_map__new_online_cpus is returned.
> + */
> LIBPERF_API struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list);
> LIBPERF_API struct perf_cpu_map *perf_cpu_map__read(FILE *file);
> LIBPERF_API struct perf_cpu_map *perf_cpu_map__get(struct perf_cpu_map *map);
> diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map
> index a8ff64baea3e..8a71f841498e 100644
> --- a/tools/lib/perf/libperf.map
> +++ b/tools/lib/perf/libperf.map
> @@ -2,7 +2,7 @@ LIBPERF_0.0.1 {
> global:
> libperf_init;
> perf_cpu_map__new_any_cpu;
> - perf_cpu_map__default_new;
> + perf_cpu_map__new_online_cpus;
> perf_cpu_map__get;
> perf_cpu_map__put;
> perf_cpu_map__new;
> diff --git a/tools/lib/perf/tests/test-cpumap.c b/tools/lib/perf/tests/test-cpumap.c
> index 2c359bdb951e..c998b1dae863 100644
> --- a/tools/lib/perf/tests/test-cpumap.c
> +++ b/tools/lib/perf/tests/test-cpumap.c
> @@ -29,7 +29,7 @@ int test_cpumap(int argc, char **argv)
> perf_cpu_map__put(cpus);
> perf_cpu_map__put(cpus);
>
> - cpus = perf_cpu_map__default_new();
> + cpus = perf_cpu_map__new_online_cpus();
> if (!cpus)
> return -1;
>
> --
> 2.43.0.rc1.413.gea7ed67945-goog
>
--
- Arnaldo
next prev parent reply other threads:[~2023-12-12 17:39 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-29 6:01 [PATCH v1 00/14] Clean up libperf cpumap's empty function Ian Rogers
2023-11-29 6:01 ` [PATCH v1 01/14] libperf cpumap: Rename perf_cpu_map__dummy_new Ian Rogers
2023-12-12 11:20 ` James Clark
2023-11-29 6:01 ` [PATCH v1 02/14] libperf cpumap: Rename and prefer sysfs for perf_cpu_map__default_new Ian Rogers
2023-12-12 11:32 ` James Clark
2023-12-12 17:39 ` Arnaldo Carvalho de Melo [this message]
2023-12-12 17:52 ` Ian Rogers
2023-11-29 6:02 ` [PATCH v1 03/14] libperf cpumap: Rename perf_cpu_map__empty Ian Rogers
2023-12-12 11:38 ` James Clark
2023-11-29 6:02 ` [PATCH v1 04/14] libperf cpumap: Replace usage of perf_cpu_map__new(NULL) Ian Rogers
2023-12-12 11:44 ` James Clark
2023-11-29 6:02 ` [PATCH v1 05/14] libperf cpumap: Add for_each_cpu that skips the "any CPU" case Ian Rogers
2023-12-12 13:54 ` James Clark
2023-11-29 6:02 ` [PATCH v1 06/14] libperf cpumap: Add any, empty and min helpers Ian Rogers
2023-12-12 14:00 ` James Clark
2023-12-12 14:51 ` James Clark
2023-12-12 20:02 ` Ian Rogers
2023-12-12 15:06 ` James Clark
2023-12-12 20:27 ` Ian Rogers
2023-12-13 13:48 ` James Clark
2023-11-29 6:02 ` [PATCH v1 07/14] perf arm-spe/cs-etm: Directly iterate CPU maps Ian Rogers
2023-12-12 14:17 ` James Clark
2023-12-12 14:36 ` James Clark
2024-02-01 2:12 ` Ian Rogers
2024-02-01 11:06 ` James Clark
2023-11-29 6:02 ` [PATCH v1 08/14] perf intel-pt/intel-bts: Switch perf_cpu_map__has_any_cpu_or_is_empty use Ian Rogers
2023-11-29 6:02 ` [PATCH v1 09/14] perf cpumap: Clean up use of perf_cpu_map__has_any_cpu_or_is_empty Ian Rogers
2023-12-12 15:10 ` James Clark
2023-11-29 6:02 ` [PATCH v1 10/14] perf top: Avoid repeated function calls Ian Rogers
2023-12-12 15:11 ` James Clark
2023-12-18 20:34 ` Arnaldo Carvalho de Melo
2023-11-29 6:02 ` [PATCH v1 11/14] perf arm64 header: Remove unnecessary CPU map get and put Ian Rogers
2023-12-12 15:13 ` James Clark
2023-11-29 6:02 ` [PATCH v1 12/14] perf stat: Remove duplicate cpus_map_matched function Ian Rogers
2023-12-12 11:28 ` James Clark
2023-11-29 6:02 ` [PATCH v1 13/14] perf cpumap: Use perf_cpu_map__for_each_cpu when possible Ian Rogers
2023-12-12 11:25 ` James Clark
2023-11-29 6:02 ` [PATCH v1 14/14] libperf cpumap: Document perf_cpu_map__nr's behavior Ian Rogers
2023-12-12 15:20 ` James Clark
2023-12-18 20:36 ` Arnaldo Carvalho de Melo
2023-12-11 19:31 ` [PATCH v1 00/14] Clean up libperf cpumap's empty function Ian Rogers
2023-12-12 17:59 ` Arnaldo Carvalho de Melo
2023-12-13 12:48 ` Adrian Hunter
2023-12-14 13:49 ` Arnaldo Carvalho de Melo
2023-12-13 23:29 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZXiauao3bIbc0ZCo@kernel.org \
--to=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ajones@ventanamicro.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=alexghiti@rivosinc.com \
--cc=andrealmeid@igalia.com \
--cc=atishp@rivosinc.com \
--cc=atrajeev@linux.vnet.ibm.com \
--cc=bpf@vger.kernel.org \
--cc=changbin.du@huawei.com \
--cc=chenhuacai@kernel.org \
--cc=coresight@lists.linaro.org \
--cc=dave@stgolabs.net \
--cc=dvhart@infradead.org \
--cc=irogers@google.com \
--cc=james.clark@arm.com \
--cc=john.g.garry@oracle.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=kjain@linux.ibm.com \
--cc=kprateek.nayak@amd.com \
--cc=leo.yan@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mike.leach@linaro.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=ndesaulniers@google.com \
--cc=p4ranlee@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=ravi.bangoria@amd.com \
--cc=sandipan.das@amd.com \
--cc=seanjc@google.com \
--cc=sesse@google.com \
--cc=siyanteng@loongson.cn \
--cc=suzuki.poulose@arm.com \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
--cc=yang.lee@linux.alibaba.com \
--cc=yangjihong1@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).