From: Namhyung Kim <namhy...@kernel.org>

And add the missing feature detection logic to clear the flag on old
kernels.

  $ perf record -g -vv true
  ...
  ------------------------------------------------------------
  perf_event_attr:
    type                             0 (PERF_TYPE_HARDWARE)
    size                             136
    config                           0 (PERF_COUNT_HW_CPU_CYCLES)
    { sample_period, sample_freq }   4000
    sample_type                      IP|TID|TIME|CALLCHAIN|PERIOD
    read_format                      ID|LOST
    disabled                         1
    inherit                          1
    mmap                             1
    comm                             1
    freq                             1
    enable_on_exec                   1
    task                             1
    sample_id_all                    1
    mmap2                            1
    comm_exec                        1
    ksymbol                          1
    bpf_event                        1
    defer_callchain                  1
  ------------------------------------------------------------
  sys_perf_event_open: pid 162755  cpu 0  group_fd -1  flags 0x8
  sys_perf_event_open failed, error -22
  switching off deferred callchain support

Signed-off-by: Namhyung Kim <namhy...@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoim...@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rost...@goodmis.org>
---
 tools/perf/util/evsel.c | 24 ++++++++++++++++++++++++
 tools/perf/util/evsel.h |  1 +
 2 files changed, 25 insertions(+)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 6176c31b57ea..c942983b870e 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -1076,6 +1076,14 @@ static void __evsel__config_callchain(struct evsel 
*evsel, struct record_opts *o
                }
        }
 
+       if (param->record_mode == CALLCHAIN_FP && 
!attr->exclude_callchain_user) {
+               /*
+                * Enable deferred callchains optimistically.  It'll be switched
+                * off later if the kernel doesn't support it.
+                */
+               attr->defer_callchain = 1;
+       }
+
        if (function) {
                pr_info("Disabling user space callchains for function trace 
event.\n");
                attr->exclude_callchain_user = 1;
@@ -2124,6 +2132,8 @@ static int __evsel__prepare_open(struct evsel *evsel, 
struct perf_cpu_map *cpus,
 
 static void evsel__disable_missing_features(struct evsel *evsel)
 {
+       if (perf_missing_features.defer_callchain)
+               evsel->core.attr.defer_callchain = 0;
        if (perf_missing_features.inherit_sample_read && 
evsel->core.attr.inherit &&
            (evsel->core.attr.sample_type & PERF_SAMPLE_READ))
                evsel->core.attr.inherit = 0;
@@ -2398,6 +2408,15 @@ static bool evsel__detect_missing_features(struct evsel 
*evsel, struct perf_cpu
 
        /* Please add new feature detection here. */
 
+       attr.defer_callchain = true;
+       attr.sample_type = PERF_SAMPLE_CALLCHAIN;
+       if (has_attr_feature(&attr, /*flags=*/0))
+               goto found;
+       perf_missing_features.defer_callchain = true;
+       pr_debug2("switching off deferred callchain support\n");
+       attr.defer_callchain = false;
+       attr.sample_type = 0;
+
        attr.inherit = true;
        attr.sample_type = PERF_SAMPLE_READ;
        if (has_attr_feature(&attr, /*flags=*/0))
@@ -2509,6 +2528,11 @@ static bool evsel__detect_missing_features(struct evsel 
*evsel, struct perf_cpu
        errno = old_errno;
 
 check:
+       if (evsel->core.attr.defer_callchain &&
+           evsel->core.attr.sample_type & PERF_SAMPLE_CALLCHAIN &&
+           perf_missing_features.defer_callchain)
+               return true;
+
        if (evsel->core.attr.inherit &&
            (evsel->core.attr.sample_type & PERF_SAMPLE_READ) &&
            perf_missing_features.inherit_sample_read)
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 6dbc9690e0c9..a01c1de8f95f 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -221,6 +221,7 @@ struct perf_missing_features {
        bool branch_counters;
        bool aux_action;
        bool inherit_sample_read;
+       bool defer_callchain;
 };
 
 extern struct perf_missing_features perf_missing_features;
-- 
2.47.2



Reply via email to