Re: [PATCH] perf auxtrace: Alter addr_filter__entire_dso() to work if there are no symbols

From: Arnaldo Carvalho de Melo
Date: Tue Nov 27 2018 - 07:42:32 EST


Em Tue, Nov 27, 2018 at 10:46:34AM +0200, Adrian Hunter escreveu:
> addr_filter__entire_dso() uses the first and last symbols from a dso,
> and so does not work when there are no symbols. Alter it to filter the
> whole file instead.

I'm splitting this patch into a first prep one that renames and exports
the static function dso__data_file_size() and a second that does what
this commig log message states.

The reason is that sometimes we find out that the main part of the patch
is wrong and we then decide to revert the patch, only to realize that
the exported function is by that time already used elsewhere.

- Arnaldo

> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> ---
> tools/perf/util/auxtrace.c | 11 ++++-------
> tools/perf/util/dso.c | 6 +++---
> tools/perf/util/dso.h | 1 +
> 3 files changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
> index 72d5ba2479bf..f69961c4a4f3 100644
> --- a/tools/perf/util/auxtrace.c
> +++ b/tools/perf/util/auxtrace.c
> @@ -1983,17 +1983,14 @@ static int find_dso_sym(struct dso *dso, const char *sym_name, u64 *start,
>
> static int addr_filter__entire_dso(struct addr_filter *filt, struct dso *dso)
> {
> - struct symbol *first_sym = dso__first_symbol(dso);
> - struct symbol *last_sym = dso__last_symbol(dso);
> -
> - if (!first_sym || !last_sym) {
> - pr_err("Failed to determine filter for %s\nNo symbols found.\n",
> + if (dso__data_file_size(dso, NULL)) {
> + pr_err("Failed to determine filter for %s\nCannot determine file size.\n",
> filt->filename);
> return -EINVAL;
> }
>
> - filt->addr = first_sym->start;
> - filt->size = last_sym->end - first_sym->start;
> + filt->addr = 0;
> + filt->size = dso->data.file_size;
>
> return 0;
> }
> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
> index bbed90e5d9bb..721f3d583945 100644
> --- a/tools/perf/util/dso.c
> +++ b/tools/perf/util/dso.c
> @@ -894,7 +894,7 @@ static ssize_t cached_read(struct dso *dso, struct machine *machine,
> return r;
> }
>
> -static int data_file_size(struct dso *dso, struct machine *machine)
> +int dso__data_file_size(struct dso *dso, struct machine *machine)
> {
> int ret = 0;
> struct stat st;
> @@ -943,7 +943,7 @@ static int data_file_size(struct dso *dso, struct machine *machine)
> */
> off_t dso__data_size(struct dso *dso, struct machine *machine)
> {
> - if (data_file_size(dso, machine))
> + if (dso__data_file_size(dso, machine))
> return -1;
>
> /* For now just estimate dso data size is close to file size */
> @@ -953,7 +953,7 @@ off_t dso__data_size(struct dso *dso, struct machine *machine)
> static ssize_t data_read_offset(struct dso *dso, struct machine *machine,
> u64 offset, u8 *data, ssize_t size)
> {
> - if (data_file_size(dso, machine))
> + if (dso__data_file_size(dso, machine))
> return -1;
>
> /* Check the offset sanity. */
> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
> index c5380500bed4..8c8a7abe809d 100644
> --- a/tools/perf/util/dso.h
> +++ b/tools/perf/util/dso.h
> @@ -322,6 +322,7 @@ int dso__data_get_fd(struct dso *dso, struct machine *machine);
> void dso__data_put_fd(struct dso *dso);
> void dso__data_close(struct dso *dso);
>
> +int dso__data_file_size(struct dso *dso, struct machine *machine);
> off_t dso__data_size(struct dso *dso, struct machine *machine);
> ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
> u64 offset, u8 *data, ssize_t size);
> --
> 2.17.1

--

- Arnaldo