Message ID | 20220908214104.3851807-1-namhyung@kernel.org (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | BPF |
Headers | show |
Series | [1/3] perf: Use sample_flags for callchain | expand |
Context | Check | Description |
---|---|---|
bpf/vmtest-bpf-next-PR | fail | PR summary |
netdev/tree_selection | success | Not a local patch |
bpf/vmtest-bpf-next-VM_Test-6 | success | Logs for set-matrix |
bpf/vmtest-bpf-next-VM_Test-1 | pending | Logs for build for s390x with gcc |
bpf/vmtest-bpf-next-VM_Test-4 | success | Logs for llvm-toolchain |
bpf/vmtest-bpf-next-VM_Test-5 | success | Logs for set-matrix |
bpf/vmtest-bpf-next-VM_Test-2 | fail | Logs for build for x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-3 | fail | Logs for build for x86_64 with llvm-16 |
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@kernel.org> The series look good to me. Reviewed-by: Kan Liang <kan.liang@linux.intel.com> 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;
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;
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> --- 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(-)