linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] perf unwind: Set userdata for all __report_module paths
@ 2021-02-18 16:56 d.rigby
  2021-02-18 16:58 ` Dave Rigby
  2021-02-18 17:22 ` Jan Kratochvil
  0 siblings, 2 replies; 6+ messages in thread
From: d.rigby @ 2021-02-18 16:56 UTC (permalink / raw)
  To: d.rigby
  Cc: linux-perf-users, Arnaldo Carvalho de Melo, Jan Kratochvil, Jiri Olsa

From: Dave Rigby <d.rigby@me.com>

When locating the dwarf module for a given address, __find_debuginfo()
requires a 'struct dso' passed via the userdata argument.

However, this field is only set in __report_module() if the module is
found in via dwfl_addrmodule(), not if it is found later via dwfl_report_elf().

Set userdata irrespective of how the dwarf module was found, as long
as we found a module.

Fixes: bf53fc6b5f41 ("perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder")
Cc: linux-perf-users@vger.kernel.org
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
---
 tools/perf/util/unwind-libdw.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c
index 0ada907..a74b517 100644
--- a/tools/perf/util/unwind-libdw.c
+++ b/tools/perf/util/unwind-libdw.c
@@ -60,10 +60,8 @@ static int __report_module(struct addr_location *al, u64 ip,
 	mod = dwfl_addrmodule(ui->dwfl, ip);
 	if (mod) {
 		Dwarf_Addr s;
-		void **userdatap;
 
-		dwfl_module_info(mod, &userdatap, &s, NULL, NULL, NULL, NULL, NULL);
-		*userdatap = dso;
+		dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL);
 		if (s != al->map->start - al->map->pgoff)
 			mod = 0;
 	}
@@ -79,6 +77,13 @@ static int __report_module(struct addr_location *al, u64 ip,
 					      al->map->start - al->map->pgoff, false);
 	}
 
+	if (mod) {
+		void **userdatap;
+
+		dwfl_module_info(mod, &userdatap, NULL, NULL, NULL, NULL, NULL, NULL);
+		*userdatap = dso;
+	}
+
 	return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1;
 }
 
-- 
1.8.3.1

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

* Re: [PATCH] perf unwind: Set userdata for all __report_module paths
  2021-02-18 16:56 [PATCH] perf unwind: Set userdata for all __report_module paths d.rigby
@ 2021-02-18 16:58 ` Dave Rigby
  2021-02-18 17:13   ` Arnaldo Carvalho de Melo
  2021-02-18 17:19   ` Arnaldo Carvalho de Melo
  2021-02-18 17:22 ` Jan Kratochvil
  1 sibling, 2 replies; 6+ messages in thread
From: Dave Rigby @ 2021-02-18 16:58 UTC (permalink / raw)
  To: Dave Rigby
  Cc: linux-perf-users, Arnaldo Carvalho de Melo, Jan Kratochvil, Jiri Olsa

I missed adding a link to the bugzilla issue: https://bugzilla.kernel.org/show_bug.cgi?id=211801

Note sure what the recommended way of tagging that in the patch is…


DaveR

> On 18 Feb 2021, at 16:56, d.rigby@me.com wrote:
> 
> From: Dave Rigby <d.rigby@me.com>
> 
> When locating the dwarf module for a given address, __find_debuginfo()
> requires a 'struct dso' passed via the userdata argument.
> 
> However, this field is only set in __report_module() if the module is
> found in via dwfl_addrmodule(), not if it is found later via dwfl_report_elf().
> 
> Set userdata irrespective of how the dwarf module was found, as long
> as we found a module.
> 
> Fixes: bf53fc6b5f41 ("perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder")
> Cc: linux-perf-users@vger.kernel.org
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
> Cc: Jiri Olsa <jolsa@redhat.com>
> ---
> tools/perf/util/unwind-libdw.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c
> index 0ada907..a74b517 100644
> --- a/tools/perf/util/unwind-libdw.c
> +++ b/tools/perf/util/unwind-libdw.c
> @@ -60,10 +60,8 @@ static int __report_module(struct addr_location *al, u64 ip,
> 	mod = dwfl_addrmodule(ui->dwfl, ip);
> 	if (mod) {
> 		Dwarf_Addr s;
> -		void **userdatap;
> 
> -		dwfl_module_info(mod, &userdatap, &s, NULL, NULL, NULL, NULL, NULL);
> -		*userdatap = dso;
> +		dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL);
> 		if (s != al->map->start - al->map->pgoff)
> 			mod = 0;
> 	}
> @@ -79,6 +77,13 @@ static int __report_module(struct addr_location *al, u64 ip,
> 					      al->map->start - al->map->pgoff, false);
> 	}
> 
> +	if (mod) {
> +		void **userdatap;
> +
> +		dwfl_module_info(mod, &userdatap, NULL, NULL, NULL, NULL, NULL, NULL);
> +		*userdatap = dso;
> +	}
> +
> 	return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1;
> }
> 
> -- 
> 1.8.3.1


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

* Re: [PATCH] perf unwind: Set userdata for all __report_module paths
  2021-02-18 16:58 ` Dave Rigby
@ 2021-02-18 17:13   ` Arnaldo Carvalho de Melo
  2021-02-18 17:19   ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-02-18 17:13 UTC (permalink / raw)
  To: Dave Rigby; +Cc: linux-perf-users, Jan Kratochvil, Jiri Olsa

Em Thu, Feb 18, 2021 at 04:58:44PM +0000, Dave Rigby escreveu:
> I missed adding a link to the bugzilla issue: https://bugzilla.kernel.org/show_bug.cgi?id=211801
> 
> Note sure what the recommended way of tagging that in the patch is…

I'll add a:

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=211801

tag,

Thanks,

- Arnaldo
 
> 
> DaveR
> 
> > On 18 Feb 2021, at 16:56, d.rigby@me.com wrote:
> > 
> > From: Dave Rigby <d.rigby@me.com>
> > 
> > When locating the dwarf module for a given address, __find_debuginfo()
> > requires a 'struct dso' passed via the userdata argument.
> > 
> > However, this field is only set in __report_module() if the module is
> > found in via dwfl_addrmodule(), not if it is found later via dwfl_report_elf().
> > 
> > Set userdata irrespective of how the dwarf module was found, as long
> > as we found a module.
> > 
> > Fixes: bf53fc6b5f41 ("perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder")
> > Cc: linux-perf-users@vger.kernel.org
> > Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> > Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
> > Cc: Jiri Olsa <jolsa@redhat.com>
> > ---
> > tools/perf/util/unwind-libdw.c | 11 ++++++++---
> > 1 file changed, 8 insertions(+), 3 deletions(-)
> > 
> > diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c
> > index 0ada907..a74b517 100644
> > --- a/tools/perf/util/unwind-libdw.c
> > +++ b/tools/perf/util/unwind-libdw.c
> > @@ -60,10 +60,8 @@ static int __report_module(struct addr_location *al, u64 ip,
> > 	mod = dwfl_addrmodule(ui->dwfl, ip);
> > 	if (mod) {
> > 		Dwarf_Addr s;
> > -		void **userdatap;
> > 
> > -		dwfl_module_info(mod, &userdatap, &s, NULL, NULL, NULL, NULL, NULL);
> > -		*userdatap = dso;
> > +		dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL);
> > 		if (s != al->map->start - al->map->pgoff)
> > 			mod = 0;
> > 	}
> > @@ -79,6 +77,13 @@ static int __report_module(struct addr_location *al, u64 ip,
> > 					      al->map->start - al->map->pgoff, false);
> > 	}
> > 
> > +	if (mod) {
> > +		void **userdatap;
> > +
> > +		dwfl_module_info(mod, &userdatap, NULL, NULL, NULL, NULL, NULL, NULL);
> > +		*userdatap = dso;
> > +	}
> > +
> > 	return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1;
> > }
> > 
> > -- 
> > 1.8.3.1
> 

-- 

- Arnaldo

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

* Re: [PATCH] perf unwind: Set userdata for all __report_module paths
  2021-02-18 16:58 ` Dave Rigby
  2021-02-18 17:13   ` Arnaldo Carvalho de Melo
@ 2021-02-18 17:19   ` Arnaldo Carvalho de Melo
  2021-02-18 17:21     ` Dave Rigby
  1 sibling, 1 reply; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-02-18 17:19 UTC (permalink / raw)
  To: Dave Rigby; +Cc: linux-perf-users, Jan Kratochvil, Jiri Olsa

Em Thu, Feb 18, 2021 at 04:58:44PM +0000, Dave Rigby escreveu:
> I missed adding a link to the bugzilla issue: https://bugzilla.kernel.org/show_bug.cgi?id=211801
> 
> Note sure what the recommended way of tagging that in the patch is…

You also forgot to add your:

Signed-off-by: Dave Rigby <d.rigby@me.com>

I'm adding it, ok?

Please take a look at Documentation/process/submitting-patches.rst, this
part:

----------------------------------------------------------------------------
Developer's Certificate of Origin 1.1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

By making a contribution to this project, I certify that:

        (a) The contribution was created in whole or in part by me and I
            have the right to submit it under the open source license
            indicated in the file; or

        (b) The contribution is based upon previous work that, to the best
            of my knowledge, is covered under an appropriate open source
            license and I have the right under that license to submit that
            work with modifications, whether created in whole or in part
            by me, under the same open source license (unless I am
            permitted to submit under a different license), as indicated
            in the file; or

        (c) The contribution was provided directly to me by some other
            person who certified (a), (b) or (c) and I have not modified
            it.

        (d) I understand and agree that this project and the contribution
            are public and that a record of the contribution (including all
            personal information I submit with it, including my sign-off) is
            maintained indefinitely and may be redistributed consistent with
            this project or the open source license(s) involved.

then you just add a line saying::

        Signed-off-by: Random J Developer <random@developer.example.org>

using your real name (sorry, no pseudonyms or anonymous contributions.)
This will be done for you automatically if you use ``git commit -s``.
Reverts should also include "Signed-off-by". ``git revert -s`` does that
for you.

Some people also put extra tags at the end.  They'll just be ignored for
now, but you can do this to mark internal company procedures or just
point out some special detail about the sign-off.

Any further SoBs (Signed-off-by:'s) following the author's SoB are from
people handling and transporting the patch, but were not involved in its
development. SoB chains should reflect the **real** route a patch took
as it was propagated to the maintainers and ultimately to Linus, with
the first SoB entry signalling primary authorship of a single author.
----------------------------------------------------------------------------
 
> 
> DaveR
> 
> > On 18 Feb 2021, at 16:56, d.rigby@me.com wrote:
> > 
> > From: Dave Rigby <d.rigby@me.com>
> > 
> > When locating the dwarf module for a given address, __find_debuginfo()
> > requires a 'struct dso' passed via the userdata argument.
> > 
> > However, this field is only set in __report_module() if the module is
> > found in via dwfl_addrmodule(), not if it is found later via dwfl_report_elf().
> > 
> > Set userdata irrespective of how the dwarf module was found, as long
> > as we found a module.
> > 
> > Fixes: bf53fc6b5f41 ("perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder")
> > Cc: linux-perf-users@vger.kernel.org
> > Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> > Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
> > Cc: Jiri Olsa <jolsa@redhat.com>
> > ---
> > tools/perf/util/unwind-libdw.c | 11 ++++++++---
> > 1 file changed, 8 insertions(+), 3 deletions(-)
> > 
> > diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c
> > index 0ada907..a74b517 100644
> > --- a/tools/perf/util/unwind-libdw.c
> > +++ b/tools/perf/util/unwind-libdw.c
> > @@ -60,10 +60,8 @@ static int __report_module(struct addr_location *al, u64 ip,
> > 	mod = dwfl_addrmodule(ui->dwfl, ip);
> > 	if (mod) {
> > 		Dwarf_Addr s;
> > -		void **userdatap;
> > 
> > -		dwfl_module_info(mod, &userdatap, &s, NULL, NULL, NULL, NULL, NULL);
> > -		*userdatap = dso;
> > +		dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL);
> > 		if (s != al->map->start - al->map->pgoff)
> > 			mod = 0;
> > 	}
> > @@ -79,6 +77,13 @@ static int __report_module(struct addr_location *al, u64 ip,
> > 					      al->map->start - al->map->pgoff, false);
> > 	}
> > 
> > +	if (mod) {
> > +		void **userdatap;
> > +
> > +		dwfl_module_info(mod, &userdatap, NULL, NULL, NULL, NULL, NULL, NULL);
> > +		*userdatap = dso;
> > +	}
> > +
> > 	return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1;
> > }
> > 
> > -- 
> > 1.8.3.1
> 

-- 

- Arnaldo

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

* Re: [PATCH] perf unwind: Set userdata for all __report_module paths
  2021-02-18 17:19   ` Arnaldo Carvalho de Melo
@ 2021-02-18 17:21     ` Dave Rigby
  0 siblings, 0 replies; 6+ messages in thread
From: Dave Rigby @ 2021-02-18 17:21 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: linux-perf-users, Jan Kratochvil, Jiri Olsa



> On 18 Feb 2021, at 17:19, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> 
> Em Thu, Feb 18, 2021 at 04:58:44PM +0000, Dave Rigby escreveu:
>> I missed adding a link to the bugzilla issue: https://bugzilla.kernel.org/show_bug.cgi?id=211801
>> 
>> Note sure what the recommended way of tagging that in the patch is…
> 
> You also forgot to add your:
> 
> Signed-off-by: Dave Rigby <d.rigby@me.com>
> 
> I'm adding it, ok?

Thanks - I missed that in the documentation. 

Signed-off-by: Dave Rigby <d.rigby@me.com>



> 
> Please take a look at Documentation/process/submitting-patches.rst, this
> part:
> 
> ----------------------------------------------------------------------------
> Developer's Certificate of Origin 1.1
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 
> By making a contribution to this project, I certify that:
> 
>        (a) The contribution was created in whole or in part by me and I
>            have the right to submit it under the open source license
>            indicated in the file; or
> 
>        (b) The contribution is based upon previous work that, to the best
>            of my knowledge, is covered under an appropriate open source
>            license and I have the right under that license to submit that
>            work with modifications, whether created in whole or in part
>            by me, under the same open source license (unless I am
>            permitted to submit under a different license), as indicated
>            in the file; or
> 
>        (c) The contribution was provided directly to me by some other
>            person who certified (a), (b) or (c) and I have not modified
>            it.
> 
>        (d) I understand and agree that this project and the contribution
>            are public and that a record of the contribution (including all
>            personal information I submit with it, including my sign-off) is
>            maintained indefinitely and may be redistributed consistent with
>            this project or the open source license(s) involved.
> 
> then you just add a line saying::
> 
>        Signed-off-by: Random J Developer <random@developer.example.org>
> 
> using your real name (sorry, no pseudonyms or anonymous contributions.)
> This will be done for you automatically if you use ``git commit -s``.
> Reverts should also include "Signed-off-by". ``git revert -s`` does that
> for you.
> 
> Some people also put extra tags at the end.  They'll just be ignored for
> now, but you can do this to mark internal company procedures or just
> point out some special detail about the sign-off.
> 
> Any further SoBs (Signed-off-by:'s) following the author's SoB are from
> people handling and transporting the patch, but were not involved in its
> development. SoB chains should reflect the **real** route a patch took
> as it was propagated to the maintainers and ultimately to Linus, with
> the first SoB entry signalling primary authorship of a single author.
> ----------------------------------------------------------------------------
> 
>> 
>> DaveR
>> 
>>> On 18 Feb 2021, at 16:56, d.rigby@me.com wrote:
>>> 
>>> From: Dave Rigby <d.rigby@me.com>
>>> 
>>> When locating the dwarf module for a given address, __find_debuginfo()
>>> requires a 'struct dso' passed via the userdata argument.
>>> 
>>> However, this field is only set in __report_module() if the module is
>>> found in via dwfl_addrmodule(), not if it is found later via dwfl_report_elf().
>>> 
>>> Set userdata irrespective of how the dwarf module was found, as long
>>> as we found a module.
>>> 
>>> Fixes: bf53fc6b5f41 ("perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder")
>>> Cc: linux-perf-users@vger.kernel.org
>>> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
>>> Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
>>> Cc: Jiri Olsa <jolsa@redhat.com>
>>> ---
>>> tools/perf/util/unwind-libdw.c | 11 ++++++++---
>>> 1 file changed, 8 insertions(+), 3 deletions(-)
>>> 
>>> diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c
>>> index 0ada907..a74b517 100644
>>> --- a/tools/perf/util/unwind-libdw.c
>>> +++ b/tools/perf/util/unwind-libdw.c
>>> @@ -60,10 +60,8 @@ static int __report_module(struct addr_location *al, u64 ip,
>>> 	mod = dwfl_addrmodule(ui->dwfl, ip);
>>> 	if (mod) {
>>> 		Dwarf_Addr s;
>>> -		void **userdatap;
>>> 
>>> -		dwfl_module_info(mod, &userdatap, &s, NULL, NULL, NULL, NULL, NULL);
>>> -		*userdatap = dso;
>>> +		dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL);
>>> 		if (s != al->map->start - al->map->pgoff)
>>> 			mod = 0;
>>> 	}
>>> @@ -79,6 +77,13 @@ static int __report_module(struct addr_location *al, u64 ip,
>>> 					      al->map->start - al->map->pgoff, false);
>>> 	}
>>> 
>>> +	if (mod) {
>>> +		void **userdatap;
>>> +
>>> +		dwfl_module_info(mod, &userdatap, NULL, NULL, NULL, NULL, NULL, NULL);
>>> +		*userdatap = dso;
>>> +	}
>>> +
>>> 	return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1;
>>> }
>>> 
>>> -- 
>>> 1.8.3.1
>> 
> 
> -- 
> 
> - Arnaldo


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

* Re: [PATCH] perf unwind: Set userdata for all __report_module paths
  2021-02-18 16:56 [PATCH] perf unwind: Set userdata for all __report_module paths d.rigby
  2021-02-18 16:58 ` Dave Rigby
@ 2021-02-18 17:22 ` Jan Kratochvil
  1 sibling, 0 replies; 6+ messages in thread
From: Jan Kratochvil @ 2021-02-18 17:22 UTC (permalink / raw)
  To: d.rigby; +Cc: linux-perf-users, Arnaldo Carvalho de Melo, Jiri Olsa

On Thu, 18 Feb 2021 17:56:54 +0100, d.rigby@me.com wrote:
> From: Dave Rigby <d.rigby@me.com>
> 
> When locating the dwarf module for a given address, __find_debuginfo()
> requires a 'struct dso' passed via the userdata argument.
> 
> However, this field is only set in __report_module() if the module is
> found in via dwfl_addrmodule(), not if it is found later via dwfl_report_elf().
> 
> Set userdata irrespective of how the dwarf module was found, as long
> as we found a module.
> 
> Fixes: bf53fc6b5f41 ("perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder")
> Cc: linux-perf-users@vger.kernel.org
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
> Cc: Jiri Olsa <jolsa@redhat.com>

Acked-by: Jan Kratochvil <jan.kratochvil@redhat.com>


Sorry for the regression,
Jan


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

end of thread, other threads:[~2021-02-18 19:01 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-18 16:56 [PATCH] perf unwind: Set userdata for all __report_module paths d.rigby
2021-02-18 16:58 ` Dave Rigby
2021-02-18 17:13   ` Arnaldo Carvalho de Melo
2021-02-18 17:19   ` Arnaldo Carvalho de Melo
2021-02-18 17:21     ` Dave Rigby
2021-02-18 17:22 ` Jan Kratochvil

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).