2019-01-19 08:14:52

by Stephane Eranian

[permalink] [raw]
Subject: [PATCH] perf tools: handle TOPOLOGY headers with no CPU

This patch fixes an issue in cpumap.c when used with the
TOPOLOGY header. In some configurations, some NUMA nodes may
have no CPU (empty cpulist). Yet a cpumap map must be created
otherwise perf abort with an error. This patch handles this
case by creating a dummy map.

Before:
$ perf record -o - -e cycles noploop 2 | perf script -i -
0x6e8 [0x6c]: failed to process type: 80

After:
$ perf record -o - -e cycles noploop 2 | perf script -i -
noploop for 2 seconds

Signed-off-by: Stephane Eranian <[email protected]>
---
tools/perf/util/cpumap.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c
index 1ccbd3342069..383674f448fc 100644
--- a/tools/perf/util/cpumap.c
+++ b/tools/perf/util/cpumap.c
@@ -134,7 +134,12 @@ struct cpu_map *cpu_map__new(const char *cpu_list)
if (!cpu_list)
return cpu_map__read_all_cpu_map();

- if (!isdigit(*cpu_list))
+ /*
+ * must handle the case of empty cpumap to cover
+ * TOPOLOGY header for NUMA nodes with no CPU
+ * ( e.g., because of CPU hotplug)
+ */
+ if (!isdigit(*cpu_list) && *cpu_list != '\0')
goto out;

while (isdigit(*cpu_list)) {
@@ -181,8 +186,10 @@ struct cpu_map *cpu_map__new(const char *cpu_list)

if (nr_cpus > 0)
cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
- else
+ else if (*cpu_list != '\0')
cpus = cpu_map__default_new();
+ else
+ cpus = cpu_map__dummy_new();
invalid:
free(tmp_cpus);
out:
--
2.7.4



2019-01-20 18:34:29

by Jiri Olsa

[permalink] [raw]
Subject: Re: [PATCH] perf tools: handle TOPOLOGY headers with no CPU

On Sat, Jan 19, 2019 at 12:12:39AM -0800, Stephane Eranian wrote:
> This patch fixes an issue in cpumap.c when used with the
> TOPOLOGY header. In some configurations, some NUMA nodes may
> have no CPU (empty cpulist). Yet a cpumap map must be created
> otherwise perf abort with an error. This patch handles this
> case by creating a dummy map.
>
> Before:
> $ perf record -o - -e cycles noploop 2 | perf script -i -
> 0x6e8 [0x6c]: failed to process type: 80
>
> After:
> $ perf record -o - -e cycles noploop 2 | perf script -i -
> noploop for 2 seconds
>
> Signed-off-by: Stephane Eranian <[email protected]>

Acked-by: Jiri Olsa <[email protected]>

thanks,
jirka

> ---
> tools/perf/util/cpumap.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c
> index 1ccbd3342069..383674f448fc 100644
> --- a/tools/perf/util/cpumap.c
> +++ b/tools/perf/util/cpumap.c
> @@ -134,7 +134,12 @@ struct cpu_map *cpu_map__new(const char *cpu_list)
> if (!cpu_list)
> return cpu_map__read_all_cpu_map();
>
> - if (!isdigit(*cpu_list))
> + /*
> + * must handle the case of empty cpumap to cover
> + * TOPOLOGY header for NUMA nodes with no CPU
> + * ( e.g., because of CPU hotplug)
> + */
> + if (!isdigit(*cpu_list) && *cpu_list != '\0')
> goto out;
>
> while (isdigit(*cpu_list)) {
> @@ -181,8 +186,10 @@ struct cpu_map *cpu_map__new(const char *cpu_list)
>
> if (nr_cpus > 0)
> cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
> - else
> + else if (*cpu_list != '\0')
> cpus = cpu_map__default_new();
> + else
> + cpus = cpu_map__dummy_new();
> invalid:
> free(tmp_cpus);
> out:
> --
> 2.7.4
>

Subject: [tip:perf/urgent] perf tools: Handle TOPOLOGY headers with no CPU

Commit-ID: 1497e804d1a6e2bd9107ddf64b0310449f4673eb
Gitweb: https://git.kernel.org/tip/1497e804d1a6e2bd9107ddf64b0310449f4673eb
Author: Stephane Eranian <[email protected]>
AuthorDate: Sat, 19 Jan 2019 00:12:39 -0800
Committer: Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Mon, 21 Jan 2019 11:28:56 -0300

perf tools: Handle TOPOLOGY headers with no CPU

This patch fixes an issue in cpumap.c when used with the TOPOLOGY
header. In some configurations, some NUMA nodes may have no CPU (empty
cpulist). Yet a cpumap map must be created otherwise perf abort with an
error. This patch handles this case by creating a dummy map.

Before:

$ perf record -o - -e cycles noploop 2 | perf script -i -
0x6e8 [0x6c]: failed to process type: 80

After:

$ perf record -o - -e cycles noploop 2 | perf script -i -
noploop for 2 seconds

Signed-off-by: Stephane Eranian <[email protected]>
Acked-by: Jiri Olsa <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/cpumap.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c
index 1ccbd3342069..383674f448fc 100644
--- a/tools/perf/util/cpumap.c
+++ b/tools/perf/util/cpumap.c
@@ -134,7 +134,12 @@ struct cpu_map *cpu_map__new(const char *cpu_list)
if (!cpu_list)
return cpu_map__read_all_cpu_map();

- if (!isdigit(*cpu_list))
+ /*
+ * must handle the case of empty cpumap to cover
+ * TOPOLOGY header for NUMA nodes with no CPU
+ * ( e.g., because of CPU hotplug)
+ */
+ if (!isdigit(*cpu_list) && *cpu_list != '\0')
goto out;

while (isdigit(*cpu_list)) {
@@ -181,8 +186,10 @@ struct cpu_map *cpu_map__new(const char *cpu_list)

if (nr_cpus > 0)
cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
- else
+ else if (*cpu_list != '\0')
cpus = cpu_map__default_new();
+ else
+ cpus = cpu_map__dummy_new();
invalid:
free(tmp_cpus);
out: