On 2022-09-08 5:41 p.m., Namhyung Kim wrote: > 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@xxxxxxxxxx> The series look good to me. Reviewed-by: Kan Liang <kan.liang@xxxxxxxxxxxxxxx> Thanks, Kan > --- > arch/x86/events/amd/ibs.c | 4 +++- > arch/x86/events/intel/ds.c | 8 ++++++-- > kernel/events/core.c | 2 +- > 3 files changed, 10 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c > index c251bc44c088..dab094166693 100644 > --- a/arch/x86/events/amd/ibs.c > +++ b/arch/x86/events/amd/ibs.c > @@ -798,8 +798,10 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs) > * 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, ®s); > out: > diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c > index a5275c235c2a..4ba6ab6d0d92 100644 > --- a/arch/x86/events/intel/ds.c > +++ b/arch/x86/events/intel/ds.c > @@ -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 */ > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 15d27b14c827..b8af9fdbf26f 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -7323,7 +7323,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;