lkml.org 
[lkml]   [2020]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 02/12] perf tools: Support PERF_SAMPLE_BRANCH_HW_INDEX
    Date
    From: Kan Liang <kan.liang@linux.intel.com>

    A new branch sample type PERF_SAMPLE_BRANCH_HW_INDEX has been introduced
    in latest kernel.

    Enable HW_INDEX by default in LBR call stack mode.
    If kernel doesn't support the sample type, switching it off.

    Add HW_INDEX in attr_fprintf as well. User can check whether the branch
    sample type is set via debug information or header.

    Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
    ---
    tools/perf/util/evsel.c | 15 ++++++++++++---
    tools/perf/util/evsel.h | 1 +
    tools/perf/util/perf_event_attr_fprintf.c | 1 +
    3 files changed, 14 insertions(+), 3 deletions(-)

    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index 05883a45de5b..816d930d774e 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -712,7 +712,8 @@ static void __perf_evsel__config_callchain(struct evsel *evsel,
    attr->branch_sample_type = PERF_SAMPLE_BRANCH_USER |
    PERF_SAMPLE_BRANCH_CALL_STACK |
    PERF_SAMPLE_BRANCH_NO_CYCLES |
    - PERF_SAMPLE_BRANCH_NO_FLAGS;
    + PERF_SAMPLE_BRANCH_NO_FLAGS |
    + PERF_SAMPLE_BRANCH_HW_INDEX;
    }
    } else
    pr_warning("Cannot use LBR callstack with branch stack. "
    @@ -763,7 +764,8 @@ perf_evsel__reset_callgraph(struct evsel *evsel,
    if (param->record_mode == CALLCHAIN_LBR) {
    perf_evsel__reset_sample_bit(evsel, BRANCH_STACK);
    attr->branch_sample_type &= ~(PERF_SAMPLE_BRANCH_USER |
    - PERF_SAMPLE_BRANCH_CALL_STACK);
    + PERF_SAMPLE_BRANCH_CALL_STACK |
    + PERF_SAMPLE_BRANCH_HW_INDEX);
    }
    if (param->record_mode == CALLCHAIN_DWARF) {
    perf_evsel__reset_sample_bit(evsel, REGS_USER);
    @@ -1673,6 +1675,8 @@ static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus,
    evsel->core.attr.ksymbol = 0;
    if (perf_missing_features.bpf)
    evsel->core.attr.bpf_event = 0;
    + if (perf_missing_features.branch_hw_idx)
    + evsel->core.attr.branch_sample_type &= ~PERF_SAMPLE_BRANCH_HW_INDEX;
    retry_sample_id:
    if (perf_missing_features.sample_id_all)
    evsel->core.attr.sample_id_all = 0;
    @@ -1784,7 +1788,12 @@ static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus,
    * Must probe features in the order they were added to the
    * perf_event_attr interface.
    */
    - if (!perf_missing_features.aux_output && evsel->core.attr.aux_output) {
    + if (!perf_missing_features.branch_hw_idx &&
    + (evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX)) {
    + perf_missing_features.branch_hw_idx = true;
    + pr_debug2("switching off branch HW index support\n");
    + goto fallback_missing_features;
    + } else if (!perf_missing_features.aux_output && evsel->core.attr.aux_output) {
    perf_missing_features.aux_output = true;
    pr_debug2_peo("Kernel has no attr.aux_output support, bailing out\n");
    goto out_close;
    diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
    index 99a0cb60c556..33804740e2ca 100644
    --- a/tools/perf/util/evsel.h
    +++ b/tools/perf/util/evsel.h
    @@ -119,6 +119,7 @@ struct perf_missing_features {
    bool ksymbol;
    bool bpf;
    bool aux_output;
    + bool branch_hw_idx;
    };

    extern struct perf_missing_features perf_missing_features;
    diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
    index 651203126c71..355d3458d4e6 100644
    --- a/tools/perf/util/perf_event_attr_fprintf.c
    +++ b/tools/perf/util/perf_event_attr_fprintf.c
    @@ -50,6 +50,7 @@ static void __p_branch_sample_type(char *buf, size_t size, u64 value)
    bit_name(ABORT_TX), bit_name(IN_TX), bit_name(NO_TX),
    bit_name(COND), bit_name(CALL_STACK), bit_name(IND_JUMP),
    bit_name(CALL), bit_name(NO_FLAGS), bit_name(NO_CYCLES),
    + bit_name(HW_INDEX),
    { .name = NULL, }
    };
    #undef bit_name
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-02-28 17:33    [W:3.162 / U:0.912 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site