* [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions
@ 2024-05-10 19:14 Yabin Cui
2024-05-10 19:14 ` [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type Yabin Cui
` (4 more replies)
0 siblings, 5 replies; 13+ messages in thread
From: Yabin Cui @ 2024-05-10 19:14 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter
Cc: linux-perf-users, linux-kernel, bpf, Yabin Cui
Hello,
We use helper functions to save raw data, callchain and branch stack in
perf_sample_data. These functions update perf_sample_data->dyn_size without
checking event->attr.sample_type, which may result in unused space allocated in
sample records. To prevent this from happening, this patchset enforces checking
sample_type of an event in these helper functions.
Thanks,
Yabin
Changes since v1:
- Check event->attr.sample_type & PERF_SAMPLE_RAW before
calling perf_sample_save_raw_data().
- Subject has been changed to reflect the change of solution.
Changes since v2:
- Move sample_type check into perf_sample_save_raw_data().
- (New patch) Move sample_type check into perf_sample_save_callchain().
- (New patch) Move sample_type check into perf_sample_save_brstack().
Changes since v3:
- Fix -Werror=implicit-function-declaration by moving has_branch_stack().
Original commit message from v1:
perf/core: Trim dyn_size if raw data is absent
Original commit message from v2/v3:
perf/core: Save raw sample data conditionally based on sample type
Yabin Cui (3):
perf/core: Save raw sample data conditionally based on sample type
perf/core: Check sample_type in perf_sample_save_callchain
perf/core: Check sample_type in perf_sample_save_brstack
arch/s390/kernel/perf_cpum_cf.c | 2 +-
arch/s390/kernel/perf_pai_crypto.c | 2 +-
arch/s390/kernel/perf_pai_ext.c | 2 +-
arch/x86/events/amd/core.c | 3 +--
arch/x86/events/amd/ibs.c | 5 ++---
arch/x86/events/core.c | 3 +--
arch/x86/events/intel/ds.c | 9 +++-----
include/linux/perf_event.h | 20 ++++++++++++-----
kernel/events/core.c | 35 +++++++++++++++---------------
kernel/trace/bpf_trace.c | 11 +++++-----
10 files changed, 49 insertions(+), 43 deletions(-)
--
2.45.0.118.g7fe29c98d7-goog
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type
2024-05-10 19:14 [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Yabin Cui
@ 2024-05-10 19:14 ` Yabin Cui
2024-05-15 8:57 ` Peter Zijlstra
2024-05-10 19:14 ` [PATCH v4 2/3] perf/core: Check sample_type in perf_sample_save_callchain Yabin Cui
` (3 subsequent siblings)
4 siblings, 1 reply; 13+ messages in thread
From: Yabin Cui @ 2024-05-10 19:14 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter
Cc: linux-perf-users, linux-kernel, bpf, Yabin Cui
Currently, space for raw sample data is always allocated within sample
records for both BPF output and tracepoint events. This leads to unused
space in sample records when raw sample data is not requested.
This patch enforces checking sample type of an event in
perf_sample_save_raw_data(). So raw sample data will only be saved if
explicitly requested, reducing overhead when it is not needed.
Fixes: 0a9081cf0a11 ("perf/core: Add perf_sample_save_raw_data() helper")
Signed-off-by: Yabin Cui <yabinc@google.com>
---
arch/s390/kernel/perf_cpum_cf.c | 2 +-
arch/s390/kernel/perf_pai_crypto.c | 2 +-
arch/s390/kernel/perf_pai_ext.c | 2 +-
arch/x86/events/amd/ibs.c | 2 +-
include/linux/perf_event.h | 4 ++++
kernel/events/core.c | 35 +++++++++++++++---------------
kernel/trace/bpf_trace.c | 11 +++++-----
7 files changed, 32 insertions(+), 26 deletions(-)
diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c
index 41ed6e0f0a2a..c7fb99cb1e15 100644
--- a/arch/s390/kernel/perf_cpum_cf.c
+++ b/arch/s390/kernel/perf_cpum_cf.c
@@ -971,7 +971,7 @@ static int cfdiag_push_sample(struct perf_event *event,
if (event->attr.sample_type & PERF_SAMPLE_RAW) {
raw.frag.size = cpuhw->usedss;
raw.frag.data = cpuhw->stop;
- perf_sample_save_raw_data(&data, &raw);
+ perf_sample_save_raw_data(&data, event, &raw);
}
overflow = perf_event_overflow(event, &data, ®s);
diff --git a/arch/s390/kernel/perf_pai_crypto.c b/arch/s390/kernel/perf_pai_crypto.c
index 4ad472d130a3..2fb8aeba4872 100644
--- a/arch/s390/kernel/perf_pai_crypto.c
+++ b/arch/s390/kernel/perf_pai_crypto.c
@@ -444,7 +444,7 @@ static int paicrypt_push_sample(size_t rawsize, struct paicrypt_map *cpump,
if (event->attr.sample_type & PERF_SAMPLE_RAW) {
raw.frag.size = rawsize;
raw.frag.data = cpump->save;
- perf_sample_save_raw_data(&data, &raw);
+ perf_sample_save_raw_data(&data, event, &raw);
}
overflow = perf_event_overflow(event, &data, ®s);
diff --git a/arch/s390/kernel/perf_pai_ext.c b/arch/s390/kernel/perf_pai_ext.c
index a6da7e0cc7a6..b2914df2107a 100644
--- a/arch/s390/kernel/perf_pai_ext.c
+++ b/arch/s390/kernel/perf_pai_ext.c
@@ -458,7 +458,7 @@ static int paiext_push_sample(size_t rawsize, struct paiext_map *cpump,
if (event->attr.sample_type & PERF_SAMPLE_RAW) {
raw.frag.size = rawsize;
raw.frag.data = cpump->save;
- perf_sample_save_raw_data(&data, &raw);
+ perf_sample_save_raw_data(&data, event, &raw);
}
overflow = perf_event_overflow(event, &data, ®s);
diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
index e91970b01d62..c3a2f6f57770 100644
--- a/arch/x86/events/amd/ibs.c
+++ b/arch/x86/events/amd/ibs.c
@@ -1118,7 +1118,7 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs)
.data = ibs_data.data,
},
};
- perf_sample_save_raw_data(&data, &raw);
+ perf_sample_save_raw_data(&data, event, &raw);
}
if (perf_ibs == &perf_ibs_op)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index d2a15c0c6f8a..9fc55193ff99 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1240,12 +1240,16 @@ static inline void perf_sample_save_callchain(struct perf_sample_data *data,
}
static inline void perf_sample_save_raw_data(struct perf_sample_data *data,
+ struct perf_event *event,
struct perf_raw_record *raw)
{
struct perf_raw_frag *frag = &raw->frag;
u32 sum = 0;
int size;
+ if (!(event->attr.sample_type & PERF_SAMPLE_RAW))
+ return;
+
do {
sum += frag->size;
if (perf_raw_frag_last(frag))
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 724e6d7e128f..3031cade53bb 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -10120,9 +10120,9 @@ static struct pmu perf_tracepoint = {
};
static int perf_tp_filter_match(struct perf_event *event,
- struct perf_sample_data *data)
+ struct perf_raw_record *raw)
{
- void *record = data->raw->frag.data;
+ void *record = raw->frag.data;
/* only top level events have filters set */
if (event->parent)
@@ -10134,7 +10134,7 @@ static int perf_tp_filter_match(struct perf_event *event,
}
static int perf_tp_event_match(struct perf_event *event,
- struct perf_sample_data *data,
+ struct perf_raw_record *raw,
struct pt_regs *regs)
{
if (event->hw.state & PERF_HES_STOPPED)
@@ -10145,7 +10145,7 @@ static int perf_tp_event_match(struct perf_event *event,
if (event->attr.exclude_kernel && !user_mode(regs))
return 0;
- if (!perf_tp_filter_match(event, data))
+ if (!perf_tp_filter_match(event, raw))
return 0;
return 1;
@@ -10171,6 +10171,7 @@ EXPORT_SYMBOL_GPL(perf_trace_run_bpf_submit);
static void __perf_tp_event_target_task(u64 count, void *record,
struct pt_regs *regs,
struct perf_sample_data *data,
+ struct perf_raw_record *raw,
struct perf_event *event)
{
struct trace_entry *entry = record;
@@ -10180,13 +10181,17 @@ static void __perf_tp_event_target_task(u64 count, void *record,
/* Cannot deliver synchronous signal to other task. */
if (event->attr.sigtrap)
return;
- if (perf_tp_event_match(event, data, regs))
+ if (perf_tp_event_match(event, raw, regs)) {
+ perf_sample_data_init(data, 0, 0);
+ perf_sample_save_raw_data(data, event, raw);
perf_swevent_event(event, count, data, regs);
+ }
}
static void perf_tp_event_target_task(u64 count, void *record,
struct pt_regs *regs,
struct perf_sample_data *data,
+ struct perf_raw_record *raw,
struct perf_event_context *ctx)
{
unsigned int cpu = smp_processor_id();
@@ -10194,15 +10199,15 @@ static void perf_tp_event_target_task(u64 count, void *record,
struct perf_event *event, *sibling;
perf_event_groups_for_cpu_pmu(event, &ctx->pinned_groups, cpu, pmu) {
- __perf_tp_event_target_task(count, record, regs, data, event);
+ __perf_tp_event_target_task(count, record, regs, data, raw, event);
for_each_sibling_event(sibling, event)
- __perf_tp_event_target_task(count, record, regs, data, sibling);
+ __perf_tp_event_target_task(count, record, regs, data, raw, sibling);
}
perf_event_groups_for_cpu_pmu(event, &ctx->flexible_groups, cpu, pmu) {
- __perf_tp_event_target_task(count, record, regs, data, event);
+ __perf_tp_event_target_task(count, record, regs, data, raw, event);
for_each_sibling_event(sibling, event)
- __perf_tp_event_target_task(count, record, regs, data, sibling);
+ __perf_tp_event_target_task(count, record, regs, data, raw, sibling);
}
}
@@ -10220,15 +10225,10 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,
},
};
- perf_sample_data_init(&data, 0, 0);
- perf_sample_save_raw_data(&data, &raw);
-
perf_trace_buf_update(record, event_type);
hlist_for_each_entry_rcu(event, head, hlist_entry) {
- if (perf_tp_event_match(event, &data, regs)) {
- perf_swevent_event(event, count, &data, regs);
-
+ if (perf_tp_event_match(event, &raw, regs)) {
/*
* Here use the same on-stack perf_sample_data,
* some members in data are event-specific and
@@ -10238,7 +10238,8 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,
* because data->sample_flags is set.
*/
perf_sample_data_init(&data, 0, 0);
- perf_sample_save_raw_data(&data, &raw);
+ perf_sample_save_raw_data(&data, event, &raw);
+ perf_swevent_event(event, count, &data, regs);
}
}
@@ -10255,7 +10256,7 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,
goto unlock;
raw_spin_lock(&ctx->lock);
- perf_tp_event_target_task(count, record, regs, &data, ctx);
+ perf_tp_event_target_task(count, record, regs, &data, &raw, ctx);
raw_spin_unlock(&ctx->lock);
unlock:
rcu_read_unlock();
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 9dc605f08a23..23bcf28ccc82 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -620,7 +620,8 @@ static const struct bpf_func_proto bpf_perf_event_read_value_proto = {
static __always_inline u64
__bpf_perf_event_output(struct pt_regs *regs, struct bpf_map *map,
- u64 flags, struct perf_sample_data *sd)
+ u64 flags, struct perf_raw_record *raw,
+ struct perf_sample_data *sd)
{
struct bpf_array *array = container_of(map, struct bpf_array, map);
unsigned int cpu = smp_processor_id();
@@ -645,6 +646,8 @@ __bpf_perf_event_output(struct pt_regs *regs, struct bpf_map *map,
if (unlikely(event->oncpu != cpu))
return -EOPNOTSUPP;
+ perf_sample_save_raw_data(sd, event, raw);
+
return perf_event_output(event, sd, regs);
}
@@ -688,9 +691,8 @@ BPF_CALL_5(bpf_perf_event_output, struct pt_regs *, regs, struct bpf_map *, map,
}
perf_sample_data_init(sd, 0, 0);
- perf_sample_save_raw_data(sd, &raw);
- err = __bpf_perf_event_output(regs, map, flags, sd);
+ err = __bpf_perf_event_output(regs, map, flags, &raw, sd);
out:
this_cpu_dec(bpf_trace_nest_level);
preempt_enable();
@@ -749,9 +751,8 @@ u64 bpf_event_output(struct bpf_map *map, u64 flags, void *meta, u64 meta_size,
perf_fetch_caller_regs(regs);
perf_sample_data_init(sd, 0, 0);
- perf_sample_save_raw_data(sd, &raw);
- ret = __bpf_perf_event_output(regs, map, flags, sd);
+ ret = __bpf_perf_event_output(regs, map, flags, &raw, sd);
out:
this_cpu_dec(bpf_event_output_nest_level);
preempt_enable();
--
2.45.0.118.g7fe29c98d7-goog
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 2/3] perf/core: Check sample_type in perf_sample_save_callchain
2024-05-10 19:14 [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Yabin Cui
2024-05-10 19:14 ` [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type Yabin Cui
@ 2024-05-10 19:14 ` Yabin Cui
2024-05-10 19:14 ` [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack Yabin Cui
` (2 subsequent siblings)
4 siblings, 0 replies; 13+ messages in thread
From: Yabin Cui @ 2024-05-10 19:14 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter
Cc: linux-perf-users, linux-kernel, bpf, Yabin Cui
Check sample_type in perf_sample_save_callchain() to prevent
saving callchain data when it isn't required.
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Yabin Cui <yabinc@google.com>
---
arch/x86/events/amd/ibs.c | 3 +--
arch/x86/events/intel/ds.c | 6 ++----
include/linux/perf_event.h | 3 +++
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
index c3a2f6f57770..f02939655b2a 100644
--- a/arch/x86/events/amd/ibs.c
+++ b/arch/x86/events/amd/ibs.c
@@ -1129,8 +1129,7 @@ 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)
- perf_sample_save_callchain(&data, event, iregs);
+ perf_sample_save_callchain(&data, event, iregs);
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 e010bfed8417..c2b5585aa6d1 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1655,8 +1655,7 @@ 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)
- perf_sample_save_callchain(data, event, iregs);
+ perf_sample_save_callchain(data, event, iregs);
/*
* We use the interrupt regs as a base because the PEBS record does not
@@ -1823,8 +1822,7 @@ 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)
- perf_sample_save_callchain(data, event, iregs);
+ perf_sample_save_callchain(data, event, iregs);
*regs = *iregs;
/* The ip in basic is EventingIP */
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 9fc55193ff99..8617815456b0 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1232,6 +1232,9 @@ static inline void perf_sample_save_callchain(struct perf_sample_data *data,
{
int size = 1;
+ if (!(event->attr.sample_type & PERF_SAMPLE_CALLCHAIN))
+ return;
+
data->callchain = perf_callchain(event, regs);
size += data->callchain->nr;
--
2.45.0.118.g7fe29c98d7-goog
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack
2024-05-10 19:14 [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Yabin Cui
2024-05-10 19:14 ` [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type Yabin Cui
2024-05-10 19:14 ` [PATCH v4 2/3] perf/core: Check sample_type in perf_sample_save_callchain Yabin Cui
@ 2024-05-10 19:14 ` Yabin Cui
2024-05-10 21:29 ` Namhyung Kim
2024-05-10 19:30 ` [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Ian Rogers
2024-05-10 21:26 ` Namhyung Kim
4 siblings, 1 reply; 13+ messages in thread
From: Yabin Cui @ 2024-05-10 19:14 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter
Cc: linux-perf-users, linux-kernel, bpf, Yabin Cui
Check sample_type in perf_sample_save_brstack() to prevent
saving branch stack data when it isn't required.
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Yabin Cui <yabinc@google.com>
---
arch/x86/events/amd/core.c | 3 +--
arch/x86/events/core.c | 3 +--
arch/x86/events/intel/ds.c | 3 +--
include/linux/perf_event.h | 13 ++++++++-----
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c
index 985ef3b47919..fb9bf3aa1b42 100644
--- a/arch/x86/events/amd/core.c
+++ b/arch/x86/events/amd/core.c
@@ -967,8 +967,7 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs)
if (!x86_perf_event_set_period(event))
continue;
- if (has_branch_stack(event))
- perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
+ perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
if (perf_event_overflow(event, &data, regs))
x86_pmu_stop(event, 0);
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
index 5b0dd07b1ef1..ff5577315938 100644
--- a/arch/x86/events/core.c
+++ b/arch/x86/events/core.c
@@ -1702,8 +1702,7 @@ int x86_pmu_handle_irq(struct pt_regs *regs)
perf_sample_data_init(&data, 0, event->hw.last_period);
- if (has_branch_stack(event))
- perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
+ perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
if (perf_event_overflow(event, &data, regs))
x86_pmu_stop(event, 0);
diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index c2b5585aa6d1..f25236ffa28f 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1754,8 +1754,7 @@ static void setup_pebs_fixed_sample_data(struct perf_event *event,
if (x86_pmu.intel_cap.pebs_format >= 3)
setup_pebs_time(event, data, pebs->tsc);
- if (has_branch_stack(event))
- perf_sample_save_brstack(data, event, &cpuc->lbr_stack, NULL);
+ perf_sample_save_brstack(data, event, &cpuc->lbr_stack, NULL);
}
static void adaptive_pebs_save_regs(struct pt_regs *regs,
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 8617815456b0..ecfbe22ff299 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1269,6 +1269,11 @@ static inline void perf_sample_save_raw_data(struct perf_sample_data *data,
data->sample_flags |= PERF_SAMPLE_RAW;
}
+static inline bool has_branch_stack(struct perf_event *event)
+{
+ return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
+}
+
static inline void perf_sample_save_brstack(struct perf_sample_data *data,
struct perf_event *event,
struct perf_branch_stack *brs,
@@ -1276,6 +1281,9 @@ static inline void perf_sample_save_brstack(struct perf_sample_data *data,
{
int size = sizeof(u64); /* nr */
+ if (!has_branch_stack(event))
+ return;
+
if (branch_sample_hw_index(event))
size += sizeof(u64);
size += brs->nr * sizeof(struct perf_branch_entry);
@@ -1665,11 +1673,6 @@ extern void perf_bp_event(struct perf_event *event, void *data);
# define perf_arch_bpf_user_pt_regs(regs) regs
#endif
-static inline bool has_branch_stack(struct perf_event *event)
-{
- return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
-}
-
static inline bool needs_branch_stack(struct perf_event *event)
{
return event->attr.branch_sample_type != 0;
--
2.45.0.118.g7fe29c98d7-goog
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions
2024-05-10 19:14 [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Yabin Cui
` (2 preceding siblings ...)
2024-05-10 19:14 ` [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack Yabin Cui
@ 2024-05-10 19:30 ` Ian Rogers
2024-05-10 21:26 ` Namhyung Kim
4 siblings, 0 replies; 13+ messages in thread
From: Ian Rogers @ 2024-05-10 19:30 UTC (permalink / raw)
To: Yabin Cui
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Adrian Hunter, linux-perf-users, linux-kernel, bpf
On Fri, May 10, 2024 at 12:14 PM Yabin Cui <yabinc@google.com> wrote:
>
> Hello,
>
> We use helper functions to save raw data, callchain and branch stack in
> perf_sample_data. These functions update perf_sample_data->dyn_size without
> checking event->attr.sample_type, which may result in unused space allocated in
> sample records. To prevent this from happening, this patchset enforces checking
> sample_type of an event in these helper functions.
>
> Thanks,
> Yabin
>
>
> Changes since v1:
> - Check event->attr.sample_type & PERF_SAMPLE_RAW before
> calling perf_sample_save_raw_data().
> - Subject has been changed to reflect the change of solution.
>
> Changes since v2:
> - Move sample_type check into perf_sample_save_raw_data().
> - (New patch) Move sample_type check into perf_sample_save_callchain().
> - (New patch) Move sample_type check into perf_sample_save_brstack().
>
> Changes since v3:
> - Fix -Werror=implicit-function-declaration by moving has_branch_stack().
>
> Original commit message from v1:
> perf/core: Trim dyn_size if raw data is absent
>
> Original commit message from v2/v3:
> perf/core: Save raw sample data conditionally based on sample type
>
> Yabin Cui (3):
> perf/core: Save raw sample data conditionally based on sample type
> perf/core: Check sample_type in perf_sample_save_callchain
> perf/core: Check sample_type in perf_sample_save_brstack
Reviewed-by: Ian Rogers <irogers@google.com>
Thanks,
Ian
> arch/s390/kernel/perf_cpum_cf.c | 2 +-
> arch/s390/kernel/perf_pai_crypto.c | 2 +-
> arch/s390/kernel/perf_pai_ext.c | 2 +-
> arch/x86/events/amd/core.c | 3 +--
> arch/x86/events/amd/ibs.c | 5 ++---
> arch/x86/events/core.c | 3 +--
> arch/x86/events/intel/ds.c | 9 +++-----
> include/linux/perf_event.h | 20 ++++++++++++-----
> kernel/events/core.c | 35 +++++++++++++++---------------
> kernel/trace/bpf_trace.c | 11 +++++-----
> 10 files changed, 49 insertions(+), 43 deletions(-)
>
> --
> 2.45.0.118.g7fe29c98d7-goog
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions
2024-05-10 19:14 [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Yabin Cui
` (3 preceding siblings ...)
2024-05-10 19:30 ` [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Ian Rogers
@ 2024-05-10 21:26 ` Namhyung Kim
4 siblings, 0 replies; 13+ messages in thread
From: Namhyung Kim @ 2024-05-10 21:26 UTC (permalink / raw)
To: Yabin Cui
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, linux-perf-users, linux-kernel, bpf
Hi Yabin,
On Fri, May 10, 2024 at 12:14 PM Yabin Cui <yabinc@google.com> wrote:
>
> Hello,
>
> We use helper functions to save raw data, callchain and branch stack in
> perf_sample_data. These functions update perf_sample_data->dyn_size without
> checking event->attr.sample_type, which may result in unused space allocated in
> sample records. To prevent this from happening, this patchset enforces checking
> sample_type of an event in these helper functions.
>
> Thanks,
> Yabin
>
>
> Changes since v1:
> - Check event->attr.sample_type & PERF_SAMPLE_RAW before
> calling perf_sample_save_raw_data().
> - Subject has been changed to reflect the change of solution.
>
> Changes since v2:
> - Move sample_type check into perf_sample_save_raw_data().
> - (New patch) Move sample_type check into perf_sample_save_callchain().
> - (New patch) Move sample_type check into perf_sample_save_brstack().
>
> Changes since v3:
> - Fix -Werror=implicit-function-declaration by moving has_branch_stack().
>
> Original commit message from v1:
> perf/core: Trim dyn_size if raw data is absent
>
> Original commit message from v2/v3:
> perf/core: Save raw sample data conditionally based on sample type
>
> Yabin Cui (3):
> perf/core: Save raw sample data conditionally based on sample type
> perf/core: Check sample_type in perf_sample_save_callchain
> perf/core: Check sample_type in perf_sample_save_brstack
Thanks for doing this!
Acked-by: Namhyung Kim <namhyung@kernel.org>
Thanks,
Namhyung
>
> arch/s390/kernel/perf_cpum_cf.c | 2 +-
> arch/s390/kernel/perf_pai_crypto.c | 2 +-
> arch/s390/kernel/perf_pai_ext.c | 2 +-
> arch/x86/events/amd/core.c | 3 +--
> arch/x86/events/amd/ibs.c | 5 ++---
> arch/x86/events/core.c | 3 +--
> arch/x86/events/intel/ds.c | 9 +++-----
> include/linux/perf_event.h | 20 ++++++++++++-----
> kernel/events/core.c | 35 +++++++++++++++---------------
> kernel/trace/bpf_trace.c | 11 +++++-----
> 10 files changed, 49 insertions(+), 43 deletions(-)
>
> --
> 2.45.0.118.g7fe29c98d7-goog
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack
2024-05-10 19:14 ` [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack Yabin Cui
@ 2024-05-10 21:29 ` Namhyung Kim
2024-05-13 18:31 ` Yabin Cui
2024-05-15 8:58 ` Peter Zijlstra
0 siblings, 2 replies; 13+ messages in thread
From: Namhyung Kim @ 2024-05-10 21:29 UTC (permalink / raw)
To: Yabin Cui
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, linux-perf-users, linux-kernel, bpf
On Fri, May 10, 2024 at 12:14 PM Yabin Cui <yabinc@google.com> wrote:
>
> Check sample_type in perf_sample_save_brstack() to prevent
> saving branch stack data when it isn't required.
>
> Suggested-by: Namhyung Kim <namhyung@kernel.org>
> Signed-off-by: Yabin Cui <yabinc@google.com>
It seems powerpc has the similar bug, then you need this:
Fixes: eb55b455ef9c ("perf/core: Add perf_sample_save_brstack() helper")
Thanks,
Namhyung
> ---
> arch/x86/events/amd/core.c | 3 +--
> arch/x86/events/core.c | 3 +--
> arch/x86/events/intel/ds.c | 3 +--
> include/linux/perf_event.h | 13 ++++++++-----
> 4 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c
> index 985ef3b47919..fb9bf3aa1b42 100644
> --- a/arch/x86/events/amd/core.c
> +++ b/arch/x86/events/amd/core.c
> @@ -967,8 +967,7 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs)
> if (!x86_perf_event_set_period(event))
> continue;
>
> - if (has_branch_stack(event))
> - perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
> + perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
>
> if (perf_event_overflow(event, &data, regs))
> x86_pmu_stop(event, 0);
> diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
> index 5b0dd07b1ef1..ff5577315938 100644
> --- a/arch/x86/events/core.c
> +++ b/arch/x86/events/core.c
> @@ -1702,8 +1702,7 @@ int x86_pmu_handle_irq(struct pt_regs *regs)
>
> perf_sample_data_init(&data, 0, event->hw.last_period);
>
> - if (has_branch_stack(event))
> - perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
> + perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
>
> if (perf_event_overflow(event, &data, regs))
> x86_pmu_stop(event, 0);
> diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
> index c2b5585aa6d1..f25236ffa28f 100644
> --- a/arch/x86/events/intel/ds.c
> +++ b/arch/x86/events/intel/ds.c
> @@ -1754,8 +1754,7 @@ static void setup_pebs_fixed_sample_data(struct perf_event *event,
> if (x86_pmu.intel_cap.pebs_format >= 3)
> setup_pebs_time(event, data, pebs->tsc);
>
> - if (has_branch_stack(event))
> - perf_sample_save_brstack(data, event, &cpuc->lbr_stack, NULL);
> + perf_sample_save_brstack(data, event, &cpuc->lbr_stack, NULL);
> }
>
> static void adaptive_pebs_save_regs(struct pt_regs *regs,
> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index 8617815456b0..ecfbe22ff299 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -1269,6 +1269,11 @@ static inline void perf_sample_save_raw_data(struct perf_sample_data *data,
> data->sample_flags |= PERF_SAMPLE_RAW;
> }
>
> +static inline bool has_branch_stack(struct perf_event *event)
> +{
> + return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
> +}
> +
> static inline void perf_sample_save_brstack(struct perf_sample_data *data,
> struct perf_event *event,
> struct perf_branch_stack *brs,
> @@ -1276,6 +1281,9 @@ static inline void perf_sample_save_brstack(struct perf_sample_data *data,
> {
> int size = sizeof(u64); /* nr */
>
> + if (!has_branch_stack(event))
> + return;
> +
> if (branch_sample_hw_index(event))
> size += sizeof(u64);
> size += brs->nr * sizeof(struct perf_branch_entry);
> @@ -1665,11 +1673,6 @@ extern void perf_bp_event(struct perf_event *event, void *data);
> # define perf_arch_bpf_user_pt_regs(regs) regs
> #endif
>
> -static inline bool has_branch_stack(struct perf_event *event)
> -{
> - return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
> -}
> -
> static inline bool needs_branch_stack(struct perf_event *event)
> {
> return event->attr.branch_sample_type != 0;
> --
> 2.45.0.118.g7fe29c98d7-goog
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack
2024-05-10 21:29 ` Namhyung Kim
@ 2024-05-13 18:31 ` Yabin Cui
2024-05-13 20:39 ` Namhyung Kim
2024-05-15 8:58 ` Peter Zijlstra
1 sibling, 1 reply; 13+ messages in thread
From: Yabin Cui @ 2024-05-13 18:31 UTC (permalink / raw)
To: Namhyung Kim
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, linux-perf-users, linux-kernel, bpf
arch/powerpc/perf/core-book3s.c checks sample_type, see
if (event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK) {
...
perf_sample_save_brstack(&data, event, &cpuhw->bhrb_stack, NULL);
}
So I think we don't need the "fixes:" line.
On Fri, May 10, 2024 at 2:30 PM Namhyung Kim <namhyung@kernel.org> wrote:
>
> On Fri, May 10, 2024 at 12:14 PM Yabin Cui <yabinc@google.com> wrote:
> >
> > Check sample_type in perf_sample_save_brstack() to prevent
> > saving branch stack data when it isn't required.
> >
> > Suggested-by: Namhyung Kim <namhyung@kernel.org>
> > Signed-off-by: Yabin Cui <yabinc@google.com>
>
> It seems powerpc has the similar bug, then you need this:
>
> Fixes: eb55b455ef9c ("perf/core: Add perf_sample_save_brstack() helper")
>
> Thanks,
> Namhyung
>
> > ---
> > arch/x86/events/amd/core.c | 3 +--
> > arch/x86/events/core.c | 3 +--
> > arch/x86/events/intel/ds.c | 3 +--
> > include/linux/perf_event.h | 13 ++++++++-----
> > 4 files changed, 11 insertions(+), 11 deletions(-)
> >
> > diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c
> > index 985ef3b47919..fb9bf3aa1b42 100644
> > --- a/arch/x86/events/amd/core.c
> > +++ b/arch/x86/events/amd/core.c
> > @@ -967,8 +967,7 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs)
> > if (!x86_perf_event_set_period(event))
> > continue;
> >
> > - if (has_branch_stack(event))
> > - perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
> > + perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
> >
> > if (perf_event_overflow(event, &data, regs))
> > x86_pmu_stop(event, 0);
> > diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
> > index 5b0dd07b1ef1..ff5577315938 100644
> > --- a/arch/x86/events/core.c
> > +++ b/arch/x86/events/core.c
> > @@ -1702,8 +1702,7 @@ int x86_pmu_handle_irq(struct pt_regs *regs)
> >
> > perf_sample_data_init(&data, 0, event->hw.last_period);
> >
> > - if (has_branch_stack(event))
> > - perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
> > + perf_sample_save_brstack(&data, event, &cpuc->lbr_stack, NULL);
> >
> > if (perf_event_overflow(event, &data, regs))
> > x86_pmu_stop(event, 0);
> > diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
> > index c2b5585aa6d1..f25236ffa28f 100644
> > --- a/arch/x86/events/intel/ds.c
> > +++ b/arch/x86/events/intel/ds.c
> > @@ -1754,8 +1754,7 @@ static void setup_pebs_fixed_sample_data(struct perf_event *event,
> > if (x86_pmu.intel_cap.pebs_format >= 3)
> > setup_pebs_time(event, data, pebs->tsc);
> >
> > - if (has_branch_stack(event))
> > - perf_sample_save_brstack(data, event, &cpuc->lbr_stack, NULL);
> > + perf_sample_save_brstack(data, event, &cpuc->lbr_stack, NULL);
> > }
> >
> > static void adaptive_pebs_save_regs(struct pt_regs *regs,
> > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> > index 8617815456b0..ecfbe22ff299 100644
> > --- a/include/linux/perf_event.h
> > +++ b/include/linux/perf_event.h
> > @@ -1269,6 +1269,11 @@ static inline void perf_sample_save_raw_data(struct perf_sample_data *data,
> > data->sample_flags |= PERF_SAMPLE_RAW;
> > }
> >
> > +static inline bool has_branch_stack(struct perf_event *event)
> > +{
> > + return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
> > +}
> > +
> > static inline void perf_sample_save_brstack(struct perf_sample_data *data,
> > struct perf_event *event,
> > struct perf_branch_stack *brs,
> > @@ -1276,6 +1281,9 @@ static inline void perf_sample_save_brstack(struct perf_sample_data *data,
> > {
> > int size = sizeof(u64); /* nr */
> >
> > + if (!has_branch_stack(event))
> > + return;
> > +
> > if (branch_sample_hw_index(event))
> > size += sizeof(u64);
> > size += brs->nr * sizeof(struct perf_branch_entry);
> > @@ -1665,11 +1673,6 @@ extern void perf_bp_event(struct perf_event *event, void *data);
> > # define perf_arch_bpf_user_pt_regs(regs) regs
> > #endif
> >
> > -static inline bool has_branch_stack(struct perf_event *event)
> > -{
> > - return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
> > -}
> > -
> > static inline bool needs_branch_stack(struct perf_event *event)
> > {
> > return event->attr.branch_sample_type != 0;
> > --
> > 2.45.0.118.g7fe29c98d7-goog
> >
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack
2024-05-13 18:31 ` Yabin Cui
@ 2024-05-13 20:39 ` Namhyung Kim
0 siblings, 0 replies; 13+ messages in thread
From: Namhyung Kim @ 2024-05-13 20:39 UTC (permalink / raw)
To: Yabin Cui
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, linux-perf-users, linux-kernel, bpf
On Mon, May 13, 2024 at 11:31 AM Yabin Cui <yabinc@google.com> wrote:
>
> arch/powerpc/perf/core-book3s.c checks sample_type, see
> if (event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK) {
> ...
> perf_sample_save_brstack(&data, event, &cpuhw->bhrb_stack, NULL);
> }
> So I think we don't need the "fixes:" line.
Oh, ok. Thanks for the correction!
Namhyung
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type
2024-05-10 19:14 ` [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type Yabin Cui
@ 2024-05-15 8:57 ` Peter Zijlstra
2024-05-15 17:39 ` Yabin Cui
0 siblings, 1 reply; 13+ messages in thread
From: Peter Zijlstra @ 2024-05-15 8:57 UTC (permalink / raw)
To: Yabin Cui
Cc: Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
linux-perf-users, linux-kernel, bpf
On Fri, May 10, 2024 at 12:14:21PM -0700, Yabin Cui wrote:
> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index d2a15c0c6f8a..9fc55193ff99 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -1240,12 +1240,16 @@ static inline void perf_sample_save_callchain(struct perf_sample_data *data,
> }
>
> static inline void perf_sample_save_raw_data(struct perf_sample_data *data,
> + struct perf_event *event,
> struct perf_raw_record *raw)
> {
> struct perf_raw_frag *frag = &raw->frag;
> u32 sum = 0;
> int size;
>
> + if (!(event->attr.sample_type & PERF_SAMPLE_RAW))
> + return;
> +
Should we add something like:
if (WARN_ON_ONCE(data->sample_flags & PERF_SAMPLE_RAW))
return;
? And I suppose the same for all these other patches.
> do {
> sum += frag->size;
> if (perf_raw_frag_last(frag))
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack
2024-05-10 21:29 ` Namhyung Kim
2024-05-13 18:31 ` Yabin Cui
@ 2024-05-15 8:58 ` Peter Zijlstra
2024-05-15 17:47 ` Yabin Cui
1 sibling, 1 reply; 13+ messages in thread
From: Peter Zijlstra @ 2024-05-15 8:58 UTC (permalink / raw)
To: Namhyung Kim
Cc: Yabin Cui, Ingo Molnar, Arnaldo Carvalho de Melo, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
linux-perf-users, linux-kernel, bpf
On Fri, May 10, 2024 at 02:29:58PM -0700, Namhyung Kim wrote:
> On Fri, May 10, 2024 at 12:14 PM Yabin Cui <yabinc@google.com> wrote:
> >
> > Check sample_type in perf_sample_save_brstack() to prevent
> > saving branch stack data when it isn't required.
> >
> > Suggested-by: Namhyung Kim <namhyung@kernel.org>
> > Signed-off-by: Yabin Cui <yabinc@google.com>
>
> It seems powerpc has the similar bug, then you need this:
>
> Fixes: eb55b455ef9c ("perf/core: Add perf_sample_save_brstack() helper")
Is this really a bug? AFAICT it just does unneeded work, no?
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type
2024-05-15 8:57 ` Peter Zijlstra
@ 2024-05-15 17:39 ` Yabin Cui
0 siblings, 0 replies; 13+ messages in thread
From: Yabin Cui @ 2024-05-15 17:39 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
linux-perf-users, linux-kernel, bpf
Good suggestion! I will send a new version.
On Wed, May 15, 2024 at 1:58 AM Peter Zijlstra <peterz@infradead.org> wrote:
>
> On Fri, May 10, 2024 at 12:14:21PM -0700, Yabin Cui wrote:
>
> > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> > index d2a15c0c6f8a..9fc55193ff99 100644
> > --- a/include/linux/perf_event.h
> > +++ b/include/linux/perf_event.h
> > @@ -1240,12 +1240,16 @@ static inline void perf_sample_save_callchain(struct perf_sample_data *data,
> > }
> >
> > static inline void perf_sample_save_raw_data(struct perf_sample_data *data,
> > + struct perf_event *event,
> > struct perf_raw_record *raw)
> > {
> > struct perf_raw_frag *frag = &raw->frag;
> > u32 sum = 0;
> > int size;
> >
> > + if (!(event->attr.sample_type & PERF_SAMPLE_RAW))
> > + return;
> > +
>
> Should we add something like:
>
> if (WARN_ON_ONCE(data->sample_flags & PERF_SAMPLE_RAW))
> return;
>
> ? And I suppose the same for all these other patches.
>
> > do {
> > sum += frag->size;
> > if (perf_raw_frag_last(frag))
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack
2024-05-15 8:58 ` Peter Zijlstra
@ 2024-05-15 17:47 ` Yabin Cui
0 siblings, 0 replies; 13+ messages in thread
From: Yabin Cui @ 2024-05-15 17:47 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Namhyung Kim, Ingo Molnar, Arnaldo Carvalho de Melo, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
linux-perf-users, linux-kernel, bpf
On Wed, May 15, 2024 at 1:58 AM Peter Zijlstra <peterz@infradead.org> wrote:
>
> On Fri, May 10, 2024 at 02:29:58PM -0700, Namhyung Kim wrote:
> > On Fri, May 10, 2024 at 12:14 PM Yabin Cui <yabinc@google.com> wrote:
> > >
> > > Check sample_type in perf_sample_save_brstack() to prevent
> > > saving branch stack data when it isn't required.
> > >
> > > Suggested-by: Namhyung Kim <namhyung@kernel.org>
> > > Signed-off-by: Yabin Cui <yabinc@google.com>
> >
> > It seems powerpc has the similar bug, then you need this:
> >
> > Fixes: eb55b455ef9c ("perf/core: Add perf_sample_save_brstack() helper")
>
> Is this really a bug? AFAICT it just does unneeded work, no?
It's not a bug. As I replied to Namhyuang, the powerpc code checks
sample_type before calling perf_sample_save_brstack().
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2024-05-15 17:47 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-10 19:14 [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Yabin Cui
2024-05-10 19:14 ` [PATCH v4 1/3] perf/core: Save raw sample data conditionally based on sample type Yabin Cui
2024-05-15 8:57 ` Peter Zijlstra
2024-05-15 17:39 ` Yabin Cui
2024-05-10 19:14 ` [PATCH v4 2/3] perf/core: Check sample_type in perf_sample_save_callchain Yabin Cui
2024-05-10 19:14 ` [PATCH v4 3/3] perf/core: Check sample_type in perf_sample_save_brstack Yabin Cui
2024-05-10 21:29 ` Namhyung Kim
2024-05-13 18:31 ` Yabin Cui
2024-05-13 20:39 ` Namhyung Kim
2024-05-15 8:58 ` Peter Zijlstra
2024-05-15 17:47 ` Yabin Cui
2024-05-10 19:30 ` [PATCH v4 0/3] perf/core: Check sample_type in sample data saving helper functions Ian Rogers
2024-05-10 21:26 ` Namhyung Kim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox