2022-10-03 19:25:21

by Henry Castro

[permalink] [raw]
Subject: [PATCH v2] perf: fix the probe finder location (.dwo files)

If the file object is compiled using -gsplit-dwarf,
the probe finder location will fail.

Signed-off-by: Henry Castro <[email protected]>
---

> Anyway I think it'd be safer to do
>
> if (dwarf_cu_info() == 0 && unit_type == skeleton)
> pf->cu_die = subdie;

Thank you, I have modifed the patch :)


tools/perf/util/probe-finder.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 50d861a80f57..b27039f5f04b 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1161,7 +1161,8 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
struct perf_probe_point *pp = &pf->pev->point;
Dwarf_Off off, noff;
size_t cuhl;
- Dwarf_Die *diep;
+ Dwarf_Die *diep, cudie, subdie;
+ uint8_t unit_type;
int ret = 0;

off = 0;
@@ -1200,6 +1201,14 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
continue;
}

+#if _ELFUTILS_VERSION >= 171
+ /* Check separate debug information file. */
+ if (dwarf_cu_info(pf->cu_die.cu, NULL, &unit_type,
+ &cudie, &subdie, NULL, NULL, NULL) == 0
+ && unit_type == DW_UT_skeleton)
+ pf->cu_die = subdie;
+#endif
+
/* Check if target file is included. */
if (pp->file)
pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
--
2.20.1


2022-10-04 19:15:29

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v2] perf: fix the probe finder location (.dwo files)

Cc + Masami

On Mon, Oct 3, 2022 at 11:10 AM Henry Castro <[email protected]> wrote:
>
> If the file object is compiled using -gsplit-dwarf,
> the probe finder location will fail.
>
> Signed-off-by: Henry Castro <[email protected]>
> ---
>
> > Anyway I think it'd be safer to do
> >
> > if (dwarf_cu_info() == 0 && unit_type == skeleton)
> > pf->cu_die = subdie;
>
> Thank you, I have modifed the patch :)
>
>
> tools/perf/util/probe-finder.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 50d861a80f57..b27039f5f04b 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -1161,7 +1161,8 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
> struct perf_probe_point *pp = &pf->pev->point;
> Dwarf_Off off, noff;
> size_t cuhl;
> - Dwarf_Die *diep;
> + Dwarf_Die *diep, cudie, subdie;
> + uint8_t unit_type;

They will be unused for earlier elfutils.

> int ret = 0;
>
> off = 0;
> @@ -1200,6 +1201,14 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
> continue;
> }
>
> +#if _ELFUTILS_VERSION >= 171

Nit, I think we use _ELFUTILS_PREREQ(0, 171).

> + /* Check separate debug information file. */
> + if (dwarf_cu_info(pf->cu_die.cu, NULL, &unit_type,
> + &cudie, &subdie, NULL, NULL, NULL) == 0
> + && unit_type == DW_UT_skeleton)
> + pf->cu_die = subdie;
> +#endif

How about making it a separate function with 2 versions
depending on the elfutils? Then you can have the variables
only if they are used.

Something like get_source_from_debuginfod() in the same
file.

Thanks,
Namhyung


> +
> /* Check if target file is included. */
> if (pp->file)
> pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
> --
> 2.20.1
>

2022-10-05 13:03:55

by Henry Castro

[permalink] [raw]
Subject: [PATCH v3] perf: fix the probe finder location (.dwo files)

If the file object is compiled using -gsplit-dwarf,
the probe finder location will fail.

Signed-off-by: Henry Castro <[email protected]>
---

> Nit, I think we use _ELFUTILS_PREREQ(0, 171).
Thank you

> How about making it a separate function with 2 versions
> depending on the elfutils? Then you can have the variables
> only if they are used.

> Something like get_source_from_debuginfod() in the same
> file.

Sounds good, but I prefer simplicity in the patch =),
what do you think about
{
Dwarf_Die cudie, subdie;
if (dwarf_cu_info() ..)
..
}

to resolve unused variable?
}


tools/perf/util/probe-finder.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 50d861a80f57..5f6781e712db 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1200,6 +1200,20 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
continue;
}

+#if _ELFUTILS_PREREQ(0, 171)
+ {
+ uint8_t unit_type;
+ Dwarf_Die cudie, subdie;
+
+ /* Check separate debug information file. */
+ if (dwarf_cu_info(pf->cu_die.cu, NULL,
+ &unit_type, &cudie,
+ &subdie, NULL,
+ NULL, NULL) == 0
+ && unit_type == DW_UT_skeleton)
+ pf->cu_die = subdie;
+ }
+#endif
/* Check if target file is included. */
if (pp->file)
pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
--
2.20.1

2022-10-17 13:21:37

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v3] perf: fix the probe finder location (.dwo files)

Em Wed, Oct 05, 2022 at 08:47:02AM -0400, Henry Castro escreveu:
> If the file object is compiled using -gsplit-dwarf,
> the probe finder location will fail.
>
> Signed-off-by: Henry Castro <[email protected]>
> ---
>
> > Nit, I think we use _ELFUTILS_PREREQ(0, 171).
> Thank you

Masami, are you ok with this?

Namyung, how about you?

Thanks,

- Arnaldo

> > How about making it a separate function with 2 versions
> > depending on the elfutils? Then you can have the variables
> > only if they are used.
>
> > Something like get_source_from_debuginfod() in the same
> > file.
>
> Sounds good, but I prefer simplicity in the patch =),
> what do you think about
> {
> Dwarf_Die cudie, subdie;
> if (dwarf_cu_info() ..)
> ..
> }
>
> to resolve unused variable?
> }
>
>
> tools/perf/util/probe-finder.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 50d861a80f57..5f6781e712db 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -1200,6 +1200,20 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
> continue;
> }
>
> +#if _ELFUTILS_PREREQ(0, 171)
> + {
> + uint8_t unit_type;
> + Dwarf_Die cudie, subdie;
> +
> + /* Check separate debug information file. */
> + if (dwarf_cu_info(pf->cu_die.cu, NULL,
> + &unit_type, &cudie,
> + &subdie, NULL,
> + NULL, NULL) == 0
> + && unit_type == DW_UT_skeleton)
> + pf->cu_die = subdie;
> + }
> +#endif
> /* Check if target file is included. */
> if (pp->file)
> pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
> --
> 2.20.1

--

- Arnaldo

2023-01-29 23:22:27

by Henry Castro

[permalink] [raw]
Subject: [PATCH v3] perf: fix the probe finder location (.dwo files)

If the file object is compiled using -gsplit-dwarf,
the probe finder location will fail.

Signed-off-by: Henry Castro <[email protected]>
---

Hi,

Polite ping? Any feedback?

Regards
Henry

tools/perf/util/probe-finder.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 50d861a80f57..5f6781e712db 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1200,6 +1200,20 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
continue;
}

+#if _ELFUTILS_PREREQ(0, 171)
+ {
+ uint8_t unit_type;
+ Dwarf_Die cudie, subdie;
+
+ /* Check separate debug information file. */
+ if (dwarf_cu_info(pf->cu_die.cu, NULL,
+ &unit_type, &cudie,
+ &subdie, NULL,
+ NULL, NULL) == 0
+ && unit_type == DW_UT_skeleton)
+ pf->cu_die = subdie;
+ }
+#endif
/* Check if target file is included. */
if (pp->file)
pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
--
2.20.1


2023-02-02 01:22:13

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v3] perf: fix the probe finder location (.dwo files)

Em Sun, Jan 29, 2023 at 07:21:28PM -0400, Henry Castro escreveu:
> If the file object is compiled using -gsplit-dwarf,
> the probe finder location will fail.
>
> Signed-off-by: Henry Castro <[email protected]>
> ---
>
> Hi,
>
> Polite ping? Any feedback?

Namhyung, are you ok now? Masami, can you please take a look and provide
an Acked-by or Reviewed-by?

- Arnaldo

> Regards
> Henry
>
> tools/perf/util/probe-finder.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 50d861a80f57..5f6781e712db 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -1200,6 +1200,20 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
> continue;
> }
>
> +#if _ELFUTILS_PREREQ(0, 171)
> + {
> + uint8_t unit_type;
> + Dwarf_Die cudie, subdie;
> +
> + /* Check separate debug information file. */
> + if (dwarf_cu_info(pf->cu_die.cu, NULL,
> + &unit_type, &cudie,
> + &subdie, NULL,
> + NULL, NULL) == 0
> + && unit_type == DW_UT_skeleton)
> + pf->cu_die = subdie;
> + }
> +#endif
> /* Check if target file is included. */
> if (pp->file)
> pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
> --
> 2.20.1
>

--

- Arnaldo

2023-02-02 02:55:45

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v3] perf: fix the probe finder location (.dwo files)

Hello,

On Wed, Feb 1, 2023 at 5:22 PM Arnaldo Carvalho de Melo <[email protected]> wrote:
>
> Em Sun, Jan 29, 2023 at 07:21:28PM -0400, Henry Castro escreveu:
> > If the file object is compiled using -gsplit-dwarf,
> > the probe finder location will fail.
> >
> > Signed-off-by: Henry Castro <[email protected]>
> > ---
> >
> > Hi,
> >
> > Polite ping? Any feedback?
>
> Namhyung, are you ok now? Masami, can you please take a look and provide
> an Acked-by or Reviewed-by?

Sorry about that. I completely missed this..
Now it looks ok, but it'd be nice if Masami could review this.

Acked-by: Namhyung Kim <[email protected]>

Thanks,
Namhyung


> > tools/perf/util/probe-finder.c | 14 ++++++++++++++
> > 1 file changed, 14 insertions(+)
> >
> > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> > index 50d861a80f57..5f6781e712db 100644
> > --- a/tools/perf/util/probe-finder.c
> > +++ b/tools/perf/util/probe-finder.c
> > @@ -1200,6 +1200,20 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg,
> > continue;
> > }
> >
> > +#if _ELFUTILS_PREREQ(0, 171)
> > + {
> > + uint8_t unit_type;
> > + Dwarf_Die cudie, subdie;
> > +
> > + /* Check separate debug information file. */
> > + if (dwarf_cu_info(pf->cu_die.cu, NULL,
> > + &unit_type, &cudie,
> > + &subdie, NULL,
> > + NULL, NULL) == 0
> > + && unit_type == DW_UT_skeleton)
> > + pf->cu_die = subdie;
> > + }
> > +#endif
> > /* Check if target file is included. */
> > if (pp->file)
> > pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
> > --
> > 2.20.1
> >
>
> --
>
> - Arnaldo