linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned
@ 2024-12-12  8:05 Ian Rogers
  2024-12-12  8:05 ` [PATCH v1 2/3] perf machine: Avoid UB by delaying computing branch entries Ian Rogers
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Ian Rogers @ 2024-12-12  8:05 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, Sun Haiyong, Yanteng Si,
	linux-perf-users, linux-kernel

Features like hostname have arbitrary size and break the assumed
8-byte alignment of perf events. Pad all feature events until 8-byte
alignment is restored.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/synthetic-events.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
index f8ac2ac2da45..5b14244253b5 100644
--- a/tools/perf/util/synthetic-events.c
+++ b/tools/perf/util/synthetic-events.c
@@ -2401,6 +2401,11 @@ int perf_event__synthesize_features(const struct perf_tool *tool, struct perf_se
 			pr_debug("Error writing feature\n");
 			continue;
 		}
+		while (PERF_ALIGN(ff.offset, sizeof(u64)) != ff.offset) {
+			char c = 0;
+
+			do_write(&ff, &c, 1);
+		}
 		/* ff.buf may have changed due to realloc in do_write() */
 		fe = ff.buf;
 		memset(fe, 0, sizeof(*fe));
-- 
2.47.1.613.gc27f4b7a9f-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v1 2/3] perf machine: Avoid UB by delaying computing branch entries
  2024-12-12  8:05 [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned Ian Rogers
@ 2024-12-12  8:05 ` Ian Rogers
  2024-12-12  8:05 ` [PATCH v1 3/3] perf record: Assert synthesized events are 8-byte aligned Ian Rogers
  2024-12-14 19:32 ` [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned Ian Rogers
  2 siblings, 0 replies; 4+ messages in thread
From: Ian Rogers @ 2024-12-12  8:05 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, Sun Haiyong, Yanteng Si,
	linux-perf-users, linux-kernel

If the branch_stack is NULL then perf_sample__branch_entries may
return NULL+1 which triggers ubsan (undefined behavior
sanitizer). Avoid this by making the computation conditional on branch
existing.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/machine.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 84661d950104..7b1e1c254c17 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -2670,7 +2670,6 @@ static int thread__resolve_callchain_sample(struct thread *thread,
 					    bool symbols)
 {
 	struct branch_stack *branch = sample->branch_stack;
-	struct branch_entry *entries = perf_sample__branch_entries(sample);
 	struct ip_callchain *chain = sample->callchain;
 	int chain_nr = 0;
 	u8 cpumode = PERF_RECORD_MISC_USER;
@@ -2712,6 +2711,7 @@ static int thread__resolve_callchain_sample(struct thread *thread,
 	 */
 
 	if (branch && callchain_param.branch_callstack) {
+		struct branch_entry *entries = perf_sample__branch_entries(sample);
 		int nr = min(max_stack, (int)branch->nr);
 		struct branch_entry be[nr];
 		struct iterations iter[nr];
-- 
2.47.1.613.gc27f4b7a9f-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v1 3/3] perf record: Assert synthesized events are 8-byte aligned
  2024-12-12  8:05 [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned Ian Rogers
  2024-12-12  8:05 ` [PATCH v1 2/3] perf machine: Avoid UB by delaying computing branch entries Ian Rogers
@ 2024-12-12  8:05 ` Ian Rogers
  2024-12-14 19:32 ` [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned Ian Rogers
  2 siblings, 0 replies; 4+ messages in thread
From: Ian Rogers @ 2024-12-12  8:05 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, Sun Haiyong, Yanteng Si,
	linux-perf-users, linux-kernel

Capture that events are 8-byte aligned and avoid later misaligned
event problems.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/builtin-record.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index adbaf80b398c..a5689d0e93ad 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -624,7 +624,10 @@ static int process_synthesized_event(const struct perf_tool *tool,
 				     struct machine *machine __maybe_unused)
 {
 	struct record *rec = container_of(tool, struct record, tool);
-	return record__write(rec, NULL, event, event->header.size);
+	size_t size = event->header.size;
+
+	assert(PERF_ALIGN(size, sizeof(u64)) == size);
+	return record__write(rec, NULL, event, size);
 }
 
 static struct mutex synth_lock;
-- 
2.47.1.613.gc27f4b7a9f-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned
  2024-12-12  8:05 [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned Ian Rogers
  2024-12-12  8:05 ` [PATCH v1 2/3] perf machine: Avoid UB by delaying computing branch entries Ian Rogers
  2024-12-12  8:05 ` [PATCH v1 3/3] perf record: Assert synthesized events are 8-byte aligned Ian Rogers
@ 2024-12-14 19:32 ` Ian Rogers
  2 siblings, 0 replies; 4+ messages in thread
From: Ian Rogers @ 2024-12-14 19:32 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, Sun Haiyong, Yanteng Si,
	linux-perf-users, linux-kernel

On Thu, Dec 12, 2024 at 12:05 AM Ian Rogers <irogers@google.com> wrote:
>
> Features like hostname have arbitrary size and break the assumed
> 8-byte alignment of perf events. Pad all feature events until 8-byte
> alignment is restored.
>
> Signed-off-by: Ian Rogers <irogers@google.com>

This change breaks pipe mode tests for me on ARM. I've not investigated why yet.

Thanks,
Ian

> ---
>  tools/perf/util/synthetic-events.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
> index f8ac2ac2da45..5b14244253b5 100644
> --- a/tools/perf/util/synthetic-events.c
> +++ b/tools/perf/util/synthetic-events.c
> @@ -2401,6 +2401,11 @@ int perf_event__synthesize_features(const struct perf_tool *tool, struct perf_se
>                         pr_debug("Error writing feature\n");
>                         continue;
>                 }
> +               while (PERF_ALIGN(ff.offset, sizeof(u64)) != ff.offset) {
> +                       char c = 0;
> +
> +                       do_write(&ff, &c, 1);
> +               }
>                 /* ff.buf may have changed due to realloc in do_write() */
>                 fe = ff.buf;
>                 memset(fe, 0, sizeof(*fe));
> --
> 2.47.1.613.gc27f4b7a9f-goog
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-12-14 19:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-12  8:05 [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned Ian Rogers
2024-12-12  8:05 ` [PATCH v1 2/3] perf machine: Avoid UB by delaying computing branch entries Ian Rogers
2024-12-12  8:05 ` [PATCH v1 3/3] perf record: Assert synthesized events are 8-byte aligned Ian Rogers
2024-12-14 19:32 ` [PATCH v1 1/3] perf synthetic-events: Ensure features are aligned Ian Rogers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).