Re: [PATCH 2/4] perf tool x86: Consolidate is_amd check into single function

From: Ian Rogers
Date: Tue Jun 13 2023 - 15:50:11 EST


On Tue, Jun 13, 2023 at 2:56 AM Ravi Bangoria <ravi.bangoria@xxxxxxx> wrote:
>
> There are multiple places where x86 specific code determines AMD vs
> Intel arch and acts based on that. Consolidate those checks into a
> single function.
>
> Signed-off-by: Ravi Bangoria <ravi.bangoria@xxxxxxx>

Acked-by: Ian Rogers <irogers@xxxxxxxxxx>

Thanks,
Ian

> ---
> tools/perf/arch/x86/util/Build | 1 +
> tools/perf/arch/x86/util/env.c | 19 +++++++++++++++++++
> tools/perf/arch/x86/util/env.h | 7 +++++++
> tools/perf/arch/x86/util/evsel.c | 16 ++--------------
> tools/perf/arch/x86/util/mem-events.c | 19 ++-----------------
> 5 files changed, 31 insertions(+), 31 deletions(-)
> create mode 100644 tools/perf/arch/x86/util/env.c
> create mode 100644 tools/perf/arch/x86/util/env.h
>
> diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
> index 195ccfdef7aa..005907cb97d8 100644
> --- a/tools/perf/arch/x86/util/Build
> +++ b/tools/perf/arch/x86/util/Build
> @@ -10,6 +10,7 @@ perf-y += evlist.o
> perf-y += mem-events.o
> perf-y += evsel.o
> perf-y += iostat.o
> +perf-y += env.o
>
> perf-$(CONFIG_DWARF) += dwarf-regs.o
> perf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
> diff --git a/tools/perf/arch/x86/util/env.c b/tools/perf/arch/x86/util/env.c
> new file mode 100644
> index 000000000000..33b87f8ac1cc
> --- /dev/null
> +++ b/tools/perf/arch/x86/util/env.c
> @@ -0,0 +1,19 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#include "linux/string.h"
> +#include "util/env.h"
> +#include "env.h"
> +
> +bool x86__is_amd_cpu(void)
> +{
> + struct perf_env env = { .total_mem = 0, };
> + static int is_amd; /* 0: Uninitialized, 1: Yes, -1: No */
> +
> + if (is_amd)
> + goto ret;
> +
> + perf_env__cpuid(&env);
> + is_amd = env.cpuid && strstarts(env.cpuid, "AuthenticAMD") ? 1 : -1;
> +
> +ret:
> + return is_amd >= 1 ? true : false;
> +}
> diff --git a/tools/perf/arch/x86/util/env.h b/tools/perf/arch/x86/util/env.h
> new file mode 100644
> index 000000000000..d78f080b6b3f
> --- /dev/null
> +++ b/tools/perf/arch/x86/util/env.h
> @@ -0,0 +1,7 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _X86_ENV_H
> +#define _X86_ENV_H
> +
> +bool x86__is_amd_cpu(void);
> +
> +#endif /* _X86_ENV_H */
> diff --git a/tools/perf/arch/x86/util/evsel.c b/tools/perf/arch/x86/util/evsel.c
> index 25da46c8cca9..512c2d885d24 100644
> --- a/tools/perf/arch/x86/util/evsel.c
> +++ b/tools/perf/arch/x86/util/evsel.c
> @@ -8,6 +8,7 @@
> #include "linux/string.h"
> #include "evsel.h"
> #include "util/debug.h"
> +#include "env.h"
>
> #define IBS_FETCH_L3MISSONLY (1ULL << 59)
> #define IBS_OP_L3MISSONLY (1ULL << 16)
> @@ -78,23 +79,10 @@ void arch__post_evsel_config(struct evsel *evsel, struct perf_event_attr *attr)
> {
> struct perf_pmu *evsel_pmu, *ibs_fetch_pmu, *ibs_op_pmu;
> static int warned_once;
> - /* 0: Uninitialized, 1: Yes, -1: No */
> - static int is_amd;
>
> - if (warned_once || is_amd == -1)
> + if (warned_once || !x86__is_amd_cpu())
> return;
>
> - if (!is_amd) {
> - struct perf_env *env = evsel__env(evsel);
> -
> - if (!perf_env__cpuid(env) || !env->cpuid ||
> - !strstarts(env->cpuid, "AuthenticAMD")) {
> - is_amd = -1;
> - return;
> - }
> - is_amd = 1;
> - }
> -
> evsel_pmu = evsel__find_pmu(evsel);
> if (!evsel_pmu)
> return;
> diff --git a/tools/perf/arch/x86/util/mem-events.c b/tools/perf/arch/x86/util/mem-events.c
> index 32879d12a8d5..a8a782bcb121 100644
> --- a/tools/perf/arch/x86/util/mem-events.c
> +++ b/tools/perf/arch/x86/util/mem-events.c
> @@ -5,6 +5,7 @@
> #include "map_symbol.h"
> #include "mem-events.h"
> #include "linux/string.h"
> +#include "env.h"
>
> static char mem_loads_name[100];
> static bool mem_loads_name__init;
> @@ -27,28 +28,12 @@ static struct perf_mem_event perf_mem_events_amd[PERF_MEM_EVENTS__MAX] = {
> E("mem-ldst", "ibs_op//", "ibs_op"),
> };
>
> -static int perf_mem_is_amd_cpu(void)
> -{
> - struct perf_env env = { .total_mem = 0, };
> -
> - perf_env__cpuid(&env);
> - if (env.cpuid && strstarts(env.cpuid, "AuthenticAMD"))
> - return 1;
> - return -1;
> -}
> -
> struct perf_mem_event *perf_mem_events__ptr(int i)
> {
> - /* 0: Uninitialized, 1: Yes, -1: No */
> - static int is_amd;
> -
> if (i >= PERF_MEM_EVENTS__MAX)
> return NULL;
>
> - if (!is_amd)
> - is_amd = perf_mem_is_amd_cpu();
> -
> - if (is_amd == 1)
> + if (x86__is_amd_cpu())
> return &perf_mem_events_amd[i];
>
> return &perf_mem_events_intel[i];
> --
> 2.40.1
>