OSDN Git Service

perf: Use sample_flags for callchain
authorNamhyung Kim <namhyung@kernel.org>
Thu, 8 Sep 2022 21:41:02 +0000 (14:41 -0700)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 13 Sep 2022 13:03:22 +0000 (15:03 +0200)
So that it can call perf_callchain() only if needed.  Historically it used
__PERF_SAMPLE_CALLCHAIN_EARLY but we can do that with sample_flags in the
struct perf_sample_data.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220908214104.3851807-1-namhyung@kernel.org
arch/x86/events/amd/ibs.c
arch/x86/events/intel/ds.c
kernel/events/core.c

index c251bc4..dab0941 100644 (file)
@@ -798,8 +798,10 @@ fail:
         * recorded as part of interrupt regs. Thus we need to use rip from
         * interrupt regs while unwinding call stack.
         */
-       if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN)
+       if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) {
                data.callchain = perf_callchain(event, iregs);
+               data.sample_flags |= PERF_SAMPLE_CALLCHAIN;
+       }
 
        throttle = perf_event_overflow(event, &data, &regs);
 out:
index a5275c2..4ba6ab6 100644 (file)
@@ -1546,8 +1546,10 @@ static void setup_pebs_fixed_sample_data(struct perf_event *event,
         * previous PMI context or an (I)RET happened between the record and
         * PMI.
         */
-       if (sample_type & PERF_SAMPLE_CALLCHAIN)
+       if (sample_type & PERF_SAMPLE_CALLCHAIN) {
                data->callchain = perf_callchain(event, iregs);
+               data->sample_flags |= PERF_SAMPLE_CALLCHAIN;
+       }
 
        /*
         * We use the interrupt regs as a base because the PEBS record does not
@@ -1719,8 +1721,10 @@ static void setup_pebs_adaptive_sample_data(struct perf_event *event,
         * previous PMI context or an (I)RET happened between the record and
         * PMI.
         */
-       if (sample_type & PERF_SAMPLE_CALLCHAIN)
+       if (sample_type & PERF_SAMPLE_CALLCHAIN) {
                data->callchain = perf_callchain(event, iregs);
+               data->sample_flags |= PERF_SAMPLE_CALLCHAIN;
+       }
 
        *regs = *iregs;
        /* The ip in basic is EventingIP */
index 3e90e45..c98ecf3 100644 (file)
@@ -7320,7 +7320,7 @@ void perf_prepare_sample(struct perf_event_header *header,
        if (sample_type & PERF_SAMPLE_CALLCHAIN) {
                int size = 1;
 
-               if (!(sample_type & __PERF_SAMPLE_CALLCHAIN_EARLY))
+               if (filtered_sample_type & PERF_SAMPLE_CALLCHAIN)
                        data->callchain = perf_callchain(event, regs);
 
                size += data->callchain->nr;