Message ID | 20250307153448.250871-1-acme@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [1/1,next] perf libunwind: Fixup conversion perf_sample->user_regs to a pointer | expand |
On Fri, Mar 7, 2025 at 7:35 AM Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > > From: Arnaldo Carvalho de Melo <acme@redhat.com> > > The dc6d2bc2d893a878 ("perf sample: Make user_regs and intr_regs optional") misses > the changes to a file, resulting in this problem: > > $ make LIBUNWIND=1 -C tools/perf O=/tmp/build/perf-tools-next install-bin > <SNIP> > CC /tmp/build/perf-tools-next/util/unwind-libunwind-local.o > CC /tmp/build/perf-tools-next/util/unwind-libunwind.o > <SNIP> > util/unwind-libunwind-local.c: In function ‘access_mem’: > util/unwind-libunwind-local.c:582:56: error: ‘ui->sample->user_regs’ is a pointer; did you mean to use ‘->’? > 582 | if (__write || !stack || !ui->sample->user_regs.regs) { > | ^ > | -> > util/unwind-libunwind-local.c:587:38: error: passing argument 2 of ‘perf_reg_value’ from incompatible pointer type [-Wincompatible-pointer-types] > 587 | ret = perf_reg_value(&start, &ui->sample->user_regs, > | ^~~~~~~~~~~~~~~~~~~~~~ > | | > | struct regs_dump ** > <SNIP> > ⬢ [acme@toolbox perf-tools-next]$ git bisect bad > dc6d2bc2d893a878e7b58578ff01b4738708deb4 is the first bad commit > commit dc6d2bc2d893a878e7b58578ff01b4738708deb4 (HEAD) > Author: Ian Rogers <irogers@google.com> > Date: Mon Jan 13 11:43:45 2025 -0800 > > perf sample: Make user_regs and intr_regs optional > > Detected using: > > make -C tools/perf build-test > > Fixes: dc6d2bc2d893a878 ("perf sample: Make user_regs and intr_regs optional") > Cc: Adrian Hunter <adrian.hunter@intel.com> > Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> > Cc: Andi Kleen <ak@linux.intel.com> > Cc: Charlie Jenkins <charlie@rivosinc.com> > Cc: Ian Rogers <irogers@google.com> > Cc: Ingo Molnar <mingo@redhat.com> > Cc: James Clark <james.clark@linaro.org> > Cc: John Garry <john.g.garry@oracle.com> > Cc: Kan Liang <kan.liang@linux.intel.com> > Cc: Leo Yan <leo.yan@linux.dev> > Cc: Mark Rutland <mark.rutland@arm.com> > Cc: Michael Petlan <mpetlan@redhat.com> > Cc: Namhyung Kim <namhyung@kernel.org> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Tavian Barnes <tavianator@tavianator.com> > Cc: Veronika Molnarova <vmolnaro@redhat.com> > Cc: coresight@lists.linaro.org > Cc: linux-arm-kernel@lists.infradead.org > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Sorry for the breakage, thanks for fixing this! Reviewed-by: Ian Rogers <irogers@google.com> Thanks, Ian > --- > tools/perf/util/unwind-libunwind-local.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c > index 16c2b03831f39afc..cc0e41f2c2f2ef10 100644 > --- a/tools/perf/util/unwind-libunwind-local.c > +++ b/tools/perf/util/unwind-libunwind-local.c > @@ -579,12 +579,12 @@ static int access_mem(unw_addr_space_t __maybe_unused as, > int ret; > > /* Don't support write, probably not needed. */ > - if (__write || !stack || !ui->sample->user_regs.regs) { > + if (__write || !stack || !ui->sample->user_regs->regs) { > *valp = 0; > return 0; > } > > - ret = perf_reg_value(&start, &ui->sample->user_regs, > + ret = perf_reg_value(&start, perf_sample__user_regs(ui->sample), > perf_arch_reg_sp(arch)); > if (ret) > return ret; > @@ -628,7 +628,7 @@ static int access_reg(unw_addr_space_t __maybe_unused as, > return 0; > } > > - if (!ui->sample->user_regs.regs) { > + if (!ui->sample->user_regs->regs) { > *valp = 0; > return 0; > } > @@ -637,7 +637,7 @@ static int access_reg(unw_addr_space_t __maybe_unused as, > if (id < 0) > return -EINVAL; > > - ret = perf_reg_value(&val, &ui->sample->user_regs, id); > + ret = perf_reg_value(&val, perf_sample__user_regs(ui->sample), id); > if (ret) { > if (!ui->best_effort) > pr_err("unwind: can't read reg %d\n", regnum); > @@ -741,7 +741,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, > unw_cursor_t c; > int ret, i = 0; > > - ret = perf_reg_value(&val, &ui->sample->user_regs, > + ret = perf_reg_value(&val, perf_sample__user_regs(ui->sample), > perf_arch_reg_ip(arch)); > if (ret) > return ret; > @@ -808,7 +808,7 @@ static int _unwind__get_entries(unwind_entry_cb_t cb, void *arg, > .best_effort = best_effort > }; > > - if (!data->user_regs.regs) > + if (!data->user_regs->regs) > return -EINVAL; > > if (max_stack <= 0) > -- > 2.47.0 >
diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c index 16c2b03831f39afc..cc0e41f2c2f2ef10 100644 --- a/tools/perf/util/unwind-libunwind-local.c +++ b/tools/perf/util/unwind-libunwind-local.c @@ -579,12 +579,12 @@ static int access_mem(unw_addr_space_t __maybe_unused as, int ret; /* Don't support write, probably not needed. */ - if (__write || !stack || !ui->sample->user_regs.regs) { + if (__write || !stack || !ui->sample->user_regs->regs) { *valp = 0; return 0; } - ret = perf_reg_value(&start, &ui->sample->user_regs, + ret = perf_reg_value(&start, perf_sample__user_regs(ui->sample), perf_arch_reg_sp(arch)); if (ret) return ret; @@ -628,7 +628,7 @@ static int access_reg(unw_addr_space_t __maybe_unused as, return 0; } - if (!ui->sample->user_regs.regs) { + if (!ui->sample->user_regs->regs) { *valp = 0; return 0; } @@ -637,7 +637,7 @@ static int access_reg(unw_addr_space_t __maybe_unused as, if (id < 0) return -EINVAL; - ret = perf_reg_value(&val, &ui->sample->user_regs, id); + ret = perf_reg_value(&val, perf_sample__user_regs(ui->sample), id); if (ret) { if (!ui->best_effort) pr_err("unwind: can't read reg %d\n", regnum); @@ -741,7 +741,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, unw_cursor_t c; int ret, i = 0; - ret = perf_reg_value(&val, &ui->sample->user_regs, + ret = perf_reg_value(&val, perf_sample__user_regs(ui->sample), perf_arch_reg_ip(arch)); if (ret) return ret; @@ -808,7 +808,7 @@ static int _unwind__get_entries(unwind_entry_cb_t cb, void *arg, .best_effort = best_effort }; - if (!data->user_regs.regs) + if (!data->user_regs->regs) return -EINVAL; if (max_stack <= 0)