lkml.org 
[lkml]   [2022]   [May]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 1/8] perf record ibs: Warn about sampling period skew
    Date
    Samples without an L3 miss are discarded and counter is reset with
    random value (between 1-15 for fetch pmu and 1-127 for op pmu) when
    IBS L3 miss filtering is enabled. This causes a sampling period skew
    but there is no way to reconstruct aggregated sampling period. So
    print a warning at perf record if user sets l3missonly=1.

    Ex:
    # perf record -c 10000 -C 0 -e ibs_op/l3missonly=1/
    WARNING: Hw internally resets sampling period when L3 Miss Filtering is enabled
    and tagged operation does not cause L3 Miss. This causes sampling period skew.

    Signed-off-by: Ravi Bangoria <ravi.bangoria@amd.com>
    Acked-by: Ian Rogers <irogers@google.com>
    ---
    tools/perf/arch/x86/util/evsel.c | 49 ++++++++++++++++++++++++++++++++
    tools/perf/util/evsel.c | 7 +++++
    tools/perf/util/evsel.h | 1 +
    3 files changed, 57 insertions(+)

    diff --git a/tools/perf/arch/x86/util/evsel.c b/tools/perf/arch/x86/util/evsel.c
    index 88306183d629..fceb904902ab 100644
    --- a/tools/perf/arch/x86/util/evsel.c
    +++ b/tools/perf/arch/x86/util/evsel.c
    @@ -5,6 +5,7 @@
    #include "util/env.h"
    #include "util/pmu.h"
    #include "linux/string.h"
    +#include "util/debug.h"

    void arch_evsel__set_sample_weight(struct evsel *evsel)
    {
    @@ -60,3 +61,51 @@ bool arch_evsel__must_be_in_group(const struct evsel *evsel)
    (!strcasecmp(evsel->name, "slots") ||
    strcasestr(evsel->name, "topdown"));
    }
    +
    +static void ibs_l3miss_warn(void)
    +{
    + pr_warning(
    +"WARNING: Hw internally resets sampling period when L3 Miss Filtering is enabled\n"
    +"and tagged operation does not cause L3 Miss. This causes sampling period skew.\n");
    +}
    +
    +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)
    + 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;
    +
    + ibs_fetch_pmu = perf_pmu__find("ibs_fetch");
    + ibs_op_pmu = perf_pmu__find("ibs_op");
    +
    + if (ibs_fetch_pmu && ibs_fetch_pmu->type == evsel_pmu->type) {
    + if (attr->config & (1ULL << 59)) {
    + ibs_l3miss_warn();
    + warned_once = 1;
    + }
    + } else if (ibs_op_pmu && ibs_op_pmu->type == evsel_pmu->type) {
    + if (attr->config & (1ULL << 16)) {
    + ibs_l3miss_warn();
    + warned_once = 1;
    + }
    + }
    +}
    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index ce499c5da8d7..8fea51a9cd90 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -1091,6 +1091,11 @@ void __weak arch_evsel__fixup_new_cycles(struct perf_event_attr *attr __maybe_un
    {
    }

    +void __weak arch__post_evsel_config(struct evsel *evsel __maybe_unused,
    + struct perf_event_attr *attr __maybe_unused)
    +{
    +}
    +
    static void evsel__set_default_freq_period(struct record_opts *opts,
    struct perf_event_attr *attr)
    {
    @@ -1366,6 +1371,8 @@ void evsel__config(struct evsel *evsel, struct record_opts *opts,
    */
    if (evsel__is_dummy_event(evsel))
    evsel__reset_sample_bit(evsel, BRANCH_STACK);
    +
    + arch__post_evsel_config(evsel, attr);
    }

    int evsel__set_filter(struct evsel *evsel, const char *filter)
    diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
    index 73ea48e94079..92bed8e2f7d8 100644
    --- a/tools/perf/util/evsel.h
    +++ b/tools/perf/util/evsel.h
    @@ -297,6 +297,7 @@ void evsel__set_sample_id(struct evsel *evsel, bool use_sample_identifier);

    void arch_evsel__set_sample_weight(struct evsel *evsel);
    void arch_evsel__fixup_new_cycles(struct perf_event_attr *attr);
    +void arch__post_evsel_config(struct evsel *evsel, struct perf_event_attr *attr);

    int evsel__set_filter(struct evsel *evsel, const char *filter);
    int evsel__append_tp_filter(struct evsel *evsel, const char *filter);
    --
    2.31.1
    \
     
     \ /
      Last update: 2022-06-01 05:29    [W:4.176 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site