linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: linux-kernel@vger.kernel.org, Namhyung Kim <namhyung@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Hemant Kumar <hemant@linux.vnet.ibm.com>,
	Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>,
	Brendan Gregg <brendan.d.gregg@gmail.com>
Subject: Re: [PATCH perf/core v8 02/16] perf symbol: Cleanup the code flow of dso__find_kallsyms
Date: Mon, 16 May 2016 10:30:52 -0300	[thread overview]
Message-ID: <20160516133052.GB5475@kernel.org> (raw)
In-Reply-To: <20160515031950.4017.28762.stgit@devbox>

Em Sun, May 15, 2016 at 12:19:50PM +0900, Masami Hiramatsu escreveu:
> Cleanup the code flow of dso__find_kallsyms() to remove
> redundant checking code and add some comment for readability.

Thanks for adding the comment, I'll wait for Hemant to review this, if
you respin it, please break this patch into multiple ones, for
instance, the first should do just the filename__readable() part, then
try to check if you could split it further, to ease reviewing.

I applied the first patch already.

- Arnaldo
 
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> ---
>  Changes in v8:
>   - Add comments why we can't use access(R_OK) for /proc/kcore access.
> ---
>  tools/perf/util/symbol.c |   68 ++++++++++++++++++++++++----------------------
>  1 file changed, 35 insertions(+), 33 deletions(-)
> 
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index 2252b54..abda8ba 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -1641,6 +1641,20 @@ static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
>  	return ret;
>  }
>  
> +/*
> + * Use open(O_RDONLY) to check readability directly instead of access(R_OK)
> + * since access(R_OK) only checks with real UID/GID but open() use effective
> + * UID/GID and actual capabilities (e.g. /proc/kcore requires CAP_SYS_RAWIO).
> + */
> +static bool filename__readable(const char *file)
> +{
> +	int fd = open(file, O_RDONLY);
> +	if (fd < 0)
> +		return false;
> +	close(fd);
> +	return true;
> +}
> +
>  static char *dso__find_kallsyms(struct dso *dso, struct map *map)
>  {
>  	u8 host_build_id[BUILD_ID_SIZE];
> @@ -1660,45 +1674,36 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map)
>  				 sizeof(host_build_id)) == 0)
>  		is_host = dso__build_id_equal(dso, host_build_id);
>  
> -	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
> -
> -	scnprintf(path, sizeof(path), "%s/%s/%s", buildid_dir,
> -		  DSO__NAME_KCORE, sbuild_id);
> -
> -	/* Use /proc/kallsyms if possible */
> +	/* Try a fast path for /proc/kallsyms if possible */
>  	if (is_host) {
> -		DIR *d;
> -		int fd;
> -
> -		/* If no cached kcore go with /proc/kallsyms */
> -		d = opendir(path);
> -		if (!d)
> -			goto proc_kallsyms;
> -		closedir(d);
> -
>  		/*
> -		 * Do not check the build-id cache, until we know we cannot use
> -		 * /proc/kcore.
> +		 * Do not check the build-id cache, unless we know we cannot use
> +		 * /proc/kcore or module maps don't match to /proc/kallsyms.
> +		 * To check readability of /proc/kcore, do not use access(R_OK)
> +		 * since /proc/kcore requires CAP_SYS_RAWIO to read and access
> +		 * can't check it.
>  		 */
> -		fd = open("/proc/kcore", O_RDONLY);
> -		if (fd != -1) {
> -			close(fd);
> -			/* If module maps match go with /proc/kallsyms */
> -			if (!validate_kcore_addresses("/proc/kallsyms", map))
> -				goto proc_kallsyms;
> -		}
> -
> -		/* Find kallsyms in build-id cache with kcore */
> -		if (!find_matching_kcore(map, path, sizeof(path)))
> -			return strdup(path);
> -
> -		goto proc_kallsyms;
> +		if (filename__readable("/proc/kcore") &&
> +		    !validate_kcore_addresses("/proc/kallsyms", map))
> +			goto proc_kallsyms;
>  	}
>  
> +	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
> +
>  	/* Find kallsyms in build-id cache with kcore */
> +	scnprintf(path, sizeof(path), "%s/%s/%s",
> +		  buildid_dir, DSO__NAME_KCORE, sbuild_id);
> +
>  	if (!find_matching_kcore(map, path, sizeof(path)))
>  		return strdup(path);
>  
> +	/* Use current /proc/kallsyms if possible */
> +	if (is_host) {
> +proc_kallsyms:
> +		return strdup("/proc/kallsyms");
> +	}
> +
> +	/* Finally, find a cache of kallsyms */
>  	scnprintf(path, sizeof(path), "%s/%s/%s",
>  		  buildid_dir, DSO__NAME_KALLSYMS, sbuild_id);
>  
> @@ -1709,9 +1714,6 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map)
>  	}
>  
>  	return strdup(path);
> -
> -proc_kallsyms:
> -	return strdup("/proc/kallsyms");
>  }
>  
>  static int dso__load_kernel_sym(struct dso *dso, struct map *map,

  reply	other threads:[~2016-05-16 13:31 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-15  3:19 [PATCH perf/core v8 00/16] perf-probe --cache and SDT support Masami Hiramatsu
2016-05-15  3:19 ` [PATCH perf/core v8 01/16] perf buildid: Introduce DSO__NAME_KALLSYMS and DSO__NAME_KCORE Masami Hiramatsu
2016-05-20  6:44   ` [tip:perf/urgent] perf symbols: " tip-bot for Masami Hiramatsu
2016-05-15  3:19 ` [PATCH perf/core v8 02/16] perf symbol: Cleanup the code flow of dso__find_kallsyms Masami Hiramatsu
2016-05-16 13:30   ` Arnaldo Carvalho de Melo [this message]
2016-05-15  3:20 ` [PATCH perf/core v8 03/16] perf-buildid-cache: Use path/to/bin/buildid/elf instead of path/to/bin/buildid Masami Hiramatsu
2016-05-15  3:20 ` [PATCH perf/core v8 04/16] perf probe: Add --cache option to cache the probe definitions Masami Hiramatsu
2016-05-15  3:20 ` [PATCH perf/core v8 05/16] perf probe: Use cache entry if possible Masami Hiramatsu
2016-05-15  3:20 ` [PATCH perf/core v8 06/16] perf probe: Show all cached probes Masami Hiramatsu
2016-05-15  3:20 ` [PATCH perf/core v8 07/16] perf probe: Remove caches when --cache is given Masami Hiramatsu
2016-05-19  0:45   ` Hemant Kumar
2016-05-19  5:21     ` Masami Hiramatsu
2016-05-15  3:21 ` [PATCH perf/core v8 08/16] perf/sdt: ELF support for SDT Masami Hiramatsu
2016-05-15  3:21 ` [PATCH perf/core v8 09/16] perf probe: Add group name support Masami Hiramatsu
2016-05-15  3:21 ` [PATCH perf/core v8 10/16] perf buildid-cache: Scan and import user SDT events to probe cache Masami Hiramatsu
2016-05-15  3:21 ` [PATCH perf/core v8 11/16] perf probe: Accept %sdt and %cached event name Masami Hiramatsu
2016-05-15  3:21 ` [PATCH perf/core v8 12/16] perf-list: Show SDT and pre-cached events Masami Hiramatsu
2016-05-20  2:48   ` Hemant Kumar
2016-05-15  3:21 ` [PATCH perf/core v8 13/16] perf-list: Skip SDTs placed in invalid binaries Masami Hiramatsu
2016-05-15  3:21 ` [PATCH perf/core v8 14/16] perf probe: Allow wildcard for cached events Masami Hiramatsu
2016-05-15  3:22 ` [PATCH perf/core v8 15/16] perf probe: Support @BUILDID or @FILE suffix for SDT events Masami Hiramatsu
2016-05-15  3:22 ` [PATCH perf/core v8 16/16] perf probe: Support a special SDT probe format Masami Hiramatsu
2016-05-20  4:51 ` [PATCH perf/core v8 00/16] perf-probe --cache and SDT support Hemant Kumar
2016-05-20 11:03   ` Masami Hiramatsu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160516133052.GB5475@kernel.org \
    --to=acme@kernel.org \
    --cc=ananth@linux.vnet.ibm.com \
    --cc=brendan.d.gregg@gmail.com \
    --cc=hemant@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).