linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] perf probe: export get_real_path
@ 2015-02-26  7:12 Naohiro Aota
  2015-02-26  7:12 ` [PATCH 2/2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Naohiro Aota @ 2015-02-26  7:12 UTC (permalink / raw)
  To: Peter Zijlstra, Arnaldo Carvalho de Melo, Masami Hiramatsu, Namhyung Kim
  Cc: linux-kernel, Naohiro Aota

Export it to use from util/probe-finder.c

Signed-off-by: Naohiro Aota <naota@elisp.net>
---
 tools/perf/util/probe-event.c | 2 +-
 tools/perf/util/probe-event.h | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 919937e..1d0d505 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -520,7 +520,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
  * a newly allocated path on success.
  * Return 0 if file was found and readable, -errno otherwise.
  */
-static int get_real_path(const char *raw_path, const char *comp_dir,
+int get_real_path(const char *raw_path, const char *comp_dir,
 			 char **new_path)
 {
 	const char *prefix = symbol_conf.source_prefix;
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index e01e994..30a3391 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -135,6 +135,8 @@ extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
 			       struct strfilter *filter, bool externs);
 extern int show_available_funcs(const char *module, struct strfilter *filter,
 				bool user);
+extern int get_real_path(const char *raw_path, const char *comp_dir,
+			 char **new_path);
 
 /* Maximum index number of event-name postfix */
 #define MAX_EVENT_INDEX	1024
-- 
2.3.0


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

* [PATCH 2/2] perf probe: Find compilation directory path for lazy matching
  2015-02-26  7:12 [PATCH 1/2] perf probe: export get_real_path Naohiro Aota
@ 2015-02-26  7:12 ` Naohiro Aota
  2015-02-26  8:08   ` Masami Hiramatsu
  2015-02-26  7:50 ` [PATCH 1/2] perf probe: export get_real_path Masami Hiramatsu
  2015-03-04  7:52 ` [PATCH v2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
  2 siblings, 1 reply; 18+ messages in thread
From: Naohiro Aota @ 2015-02-26  7:12 UTC (permalink / raw)
  To: Peter Zijlstra, Arnaldo Carvalho de Melo, Masami Hiramatsu, Namhyung Kim
  Cc: linux-kernel, Naohiro Aota

If we use lazy matching, it failed to open a souce file if perf command
is invoked outside of compilation directory:

$ perf probe -a '__schedule;clear_*'
Failed to open kernel/sched/core.c: No such file or directory
  Error: Failed to add events. (-2)

OTOH, other commands like "probe -L" can solve the souce directory by
themselves. Let's make it possible for lazy matching too!

Signed-off-by: Naohiro Aota <naota@elisp.net>
---
 tools/perf/util/probe-finder.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index b5247d7..8e0714c 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -39,6 +39,7 @@
 #include "util.h"
 #include "symbol.h"
 #include "probe-finder.h"
+#include "probe-event.h"
 
 /* Kprobe tracer basic type is up to u64 */
 #define MAX_BASIC_TYPE_BITS	64
@@ -849,11 +850,23 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
 {
 	int ret = 0;
+	char *fpath;
 
 	if (intlist__empty(pf->lcache)) {
+		const char *comp_dir;
+
+		comp_dir = cu_get_comp_dir(&pf->cu_die);
+		ret = get_real_path(pf->fname, comp_dir, &fpath);
+		if (ret < 0) {
+			free(fpath);
+			pr_warning("Failed to find source file path.\n");
+			return ret;
+		}
+
 		/* Matching lazy line pattern */
-		ret = find_lazy_match_lines(pf->lcache, pf->fname,
+		ret = find_lazy_match_lines(pf->lcache, fpath,
 					    pf->pev->point.lazy_line);
+		free(fpath);
 		if (ret <= 0)
 			return ret;
 	}
-- 
2.3.0


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

* Re: [PATCH 1/2] perf probe: export get_real_path
  2015-02-26  7:12 [PATCH 1/2] perf probe: export get_real_path Naohiro Aota
  2015-02-26  7:12 ` [PATCH 2/2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
@ 2015-02-26  7:50 ` Masami Hiramatsu
  2015-03-04  7:52 ` [PATCH v2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
  2 siblings, 0 replies; 18+ messages in thread
From: Masami Hiramatsu @ 2015-02-26  7:50 UTC (permalink / raw)
  To: Naohiro Aota
  Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Namhyung Kim, linux-kernel

(2015/02/26 16:12), Naohiro Aota wrote:
> Export it to use from util/probe-finder.c

Please fold this in to the next patch, since this exported symbol
is not used until applying the next one.

BTW, since get_real_path is compiled only when HAVE_DWARF_SUPPORT=y,
we can also move it into probe-finder.c.
Could you also move it into probe-finder.c and export it at probe-finder.h?

Thank you,

> 
> Signed-off-by: Naohiro Aota <naota@elisp.net>
> ---
>  tools/perf/util/probe-event.c | 2 +-
>  tools/perf/util/probe-event.h | 2 ++
>  2 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 919937e..1d0d505 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -520,7 +520,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
>   * a newly allocated path on success.
>   * Return 0 if file was found and readable, -errno otherwise.
>   */
> -static int get_real_path(const char *raw_path, const char *comp_dir,
> +int get_real_path(const char *raw_path, const char *comp_dir,
>  			 char **new_path)
>  {
>  	const char *prefix = symbol_conf.source_prefix;
> diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> index e01e994..30a3391 100644
> --- a/tools/perf/util/probe-event.h
> +++ b/tools/perf/util/probe-event.h
> @@ -135,6 +135,8 @@ extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
>  			       struct strfilter *filter, bool externs);
>  extern int show_available_funcs(const char *module, struct strfilter *filter,
>  				bool user);
> +extern int get_real_path(const char *raw_path, const char *comp_dir,
> +			 char **new_path);
>  
>  /* Maximum index number of event-name postfix */
>  #define MAX_EVENT_INDEX	1024
> 


-- 
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com



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

* Re: [PATCH 2/2] perf probe: Find compilation directory path for lazy matching
  2015-02-26  7:12 ` [PATCH 2/2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
@ 2015-02-26  8:08   ` Masami Hiramatsu
  2015-02-26  8:25     ` [PATCH perf/core ] [BUGFIX] perf-probe: Fix get_real_path to free allocated memory in error path Masami Hiramatsu
  0 siblings, 1 reply; 18+ messages in thread
From: Masami Hiramatsu @ 2015-02-26  8:08 UTC (permalink / raw)
  To: Naohiro Aota
  Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Namhyung Kim, linux-kernel

(2015/02/26 16:12), Naohiro Aota wrote:
> If we use lazy matching, it failed to open a souce file if perf command
> is invoked outside of compilation directory:
> 
> $ perf probe -a '__schedule;clear_*'
> Failed to open kernel/sched/core.c: No such file or directory
>   Error: Failed to add events. (-2)
> 
> OTOH, other commands like "probe -L" can solve the souce directory by
> themselves. Let's make it possible for lazy matching too!
> 
> Signed-off-by: Naohiro Aota <naota@elisp.net>
> ---
>  tools/perf/util/probe-finder.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index b5247d7..8e0714c 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -39,6 +39,7 @@
>  #include "util.h"
>  #include "symbol.h"
>  #include "probe-finder.h"
> +#include "probe-event.h"
>  
>  /* Kprobe tracer basic type is up to u64 */
>  #define MAX_BASIC_TYPE_BITS	64
> @@ -849,11 +850,23 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
>  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
>  {
>  	int ret = 0;
> +	char *fpath;
>  
>  	if (intlist__empty(pf->lcache)) {
> +		const char *comp_dir;
> +
> +		comp_dir = cu_get_comp_dir(&pf->cu_die);
> +		ret = get_real_path(pf->fname, comp_dir, &fpath);
> +		if (ret < 0) {
> +			free(fpath);

Here, if the get_real_path is failed, fpath should be freed before returning.
If not, there is a bug, and yeah, there is a bug...

Thank you!

> +			pr_warning("Failed to find source file path.\n");
> +			return ret;
> +		}
> +
>  		/* Matching lazy line pattern */
> -		ret = find_lazy_match_lines(pf->lcache, pf->fname,
> +		ret = find_lazy_match_lines(pf->lcache, fpath,
>  					    pf->pev->point.lazy_line);
> +		free(fpath);
>  		if (ret <= 0)
>  			return ret;
>  	}
> 


-- 
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com



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

* [PATCH perf/core ] [BUGFIX] perf-probe: Fix get_real_path to free allocated memory in error path
  2015-02-26  8:08   ` Masami Hiramatsu
@ 2015-02-26  8:25     ` Masami Hiramatsu
  2015-02-26 14:46       ` Arnaldo Carvalho de Melo
  2015-02-28  9:31       ` [tip:perf/core] perf probe: " tip-bot for Masami Hiramatsu
  0 siblings, 2 replies; 18+ messages in thread
From: Masami Hiramatsu @ 2015-02-26  8:25 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, namhyung, Naohiro Aota, Ingo Molnar,
	Linux Kernel Mailing List

Fix get_real_path to free allocated memory when comp_dir
is used for complementing path and getting an error.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
---
 tools/perf/util/probe-event.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 9dfbed9..43cc534 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -549,9 +549,11 @@ static int get_real_path(const char *raw_path, const char *comp_dir,
 		if (access(*new_path, R_OK) == 0)
 			return 0;
 
-		if (!symbol_conf.source_prefix)
+		if (!symbol_conf.source_prefix) {
 			/* In case of searching comp_dir, don't retry */
+			zfree(new_path);
 			return -errno;
+		}
 
 		switch (errno) {
 		case ENAMETOOLONG:


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

* Re: [PATCH perf/core ] [BUGFIX] perf-probe: Fix get_real_path to free allocated memory in error path
  2015-02-26  8:25     ` [PATCH perf/core ] [BUGFIX] perf-probe: Fix get_real_path to free allocated memory in error path Masami Hiramatsu
@ 2015-02-26 14:46       ` Arnaldo Carvalho de Melo
  2015-02-27  0:58         ` Masami Hiramatsu
  2015-02-28  9:31       ` [tip:perf/core] perf probe: " tip-bot for Masami Hiramatsu
  1 sibling, 1 reply; 18+ messages in thread
From: Arnaldo Carvalho de Melo @ 2015-02-26 14:46 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Peter Zijlstra, namhyung, Naohiro Aota, Ingo Molnar,
	Linux Kernel Mailing List

Em Thu, Feb 26, 2015 at 05:25:04PM +0900, Masami Hiramatsu escreveu:
> Fix get_real_path to free allocated memory when comp_dir
> is used for complementing path and getting an error.


While reviewing this patch I noticed this is needed, ack?

- Arnaldo


diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 4a93bf433344..9526cf37682e 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -533,7 +533,7 @@ static int get_real_path(const char *raw_path, const char *comp_dir,
 		else {
 			if (access(raw_path, R_OK) == 0) {
 				*new_path = strdup(raw_path);
-				return 0;
+				return *new_path ? 0 : -ENOMEM;
 			} else
 				return -errno;
 		}

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

* Re: [PATCH perf/core ] [BUGFIX] perf-probe: Fix get_real_path to free allocated memory in error path
  2015-02-26 14:46       ` Arnaldo Carvalho de Melo
@ 2015-02-27  0:58         ` Masami Hiramatsu
  0 siblings, 0 replies; 18+ messages in thread
From: Masami Hiramatsu @ 2015-02-27  0:58 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, namhyung, Naohiro Aota, Ingo Molnar,
	Linux Kernel Mailing List

(2015/02/26 23:46), Arnaldo Carvalho de Melo wrote:
> Em Thu, Feb 26, 2015 at 05:25:04PM +0900, Masami Hiramatsu escreveu:
>> Fix get_real_path to free allocated memory when comp_dir
>> is used for complementing path and getting an error.
> 
> 
> While reviewing this patch I noticed this is needed, ack?

Ah, right!

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

Thank you,

> 
> - Arnaldo
> 
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 4a93bf433344..9526cf37682e 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -533,7 +533,7 @@ static int get_real_path(const char *raw_path, const char *comp_dir,
>  		else {
>  			if (access(raw_path, R_OK) == 0) {
>  				*new_path = strdup(raw_path);
> -				return 0;
> +				return *new_path ? 0 : -ENOMEM;
>  			} else
>  				return -errno;
>  		}
> 


-- 
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com



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

* [tip:perf/core] perf probe: Fix get_real_path to free allocated memory in error path
  2015-02-26  8:25     ` [PATCH perf/core ] [BUGFIX] perf-probe: Fix get_real_path to free allocated memory in error path Masami Hiramatsu
  2015-02-26 14:46       ` Arnaldo Carvalho de Melo
@ 2015-02-28  9:31       ` tip-bot for Masami Hiramatsu
  1 sibling, 0 replies; 18+ messages in thread
From: tip-bot for Masami Hiramatsu @ 2015-02-28  9:31 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, masami.hiramatsu.pt, mingo, naota, tglx, acme,
	peterz, hpa, namhyung

Commit-ID:  eb47cb2eb22dfacac9689708f5bd3cb0e975e290
Gitweb:     http://git.kernel.org/tip/eb47cb2eb22dfacac9689708f5bd3cb0e975e290
Author:     Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
AuthorDate: Thu, 26 Feb 2015 17:25:04 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 26 Feb 2015 11:59:05 -0300

perf probe: Fix get_real_path to free allocated memory in error path

Fix get_real_path to free allocated memory when comp_dir is used for
complementing path and getting an error.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Naohiro Aota <naota@elisp.net>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150226082504.28125.74506.stgit@localhost.localdomain
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-event.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 662d454..4a93bf4 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -549,9 +549,11 @@ static int get_real_path(const char *raw_path, const char *comp_dir,
 		if (access(*new_path, R_OK) == 0)
 			return 0;
 
-		if (!symbol_conf.source_prefix)
+		if (!symbol_conf.source_prefix) {
 			/* In case of searching comp_dir, don't retry */
+			zfree(new_path);
 			return -errno;
+		}
 
 		switch (errno) {
 		case ENAMETOOLONG:

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

* [PATCH v2] perf probe: Find compilation directory path for lazy matching
  2015-02-26  7:12 [PATCH 1/2] perf probe: export get_real_path Naohiro Aota
  2015-02-26  7:12 ` [PATCH 2/2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
  2015-02-26  7:50 ` [PATCH 1/2] perf probe: export get_real_path Masami Hiramatsu
@ 2015-03-04  7:52 ` Naohiro Aota
  2015-03-04 12:34   ` Masami Hiramatsu
  2 siblings, 1 reply; 18+ messages in thread
From: Naohiro Aota @ 2015-03-04  7:52 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Naohiro Aota, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa,
	open list:PERFORMANCE EVENT...

If we use lazy matching, it failed to open a souce file if perf command
is invoked outside of compilation directory:

$ perf probe -a '__schedule;clear_*'
Failed to open kernel/sched/core.c: No such file or directory
  Error: Failed to add events. (-2)

OTOH, other commands like "probe -L" can solve the souce directory by
themselves. Let's make it possible for lazy matching too!

Signed-off-by: Naohiro Aota <naota@elisp.net>
---
 tools/perf/util/probe-event.c  | 59 -----------------------------------
 tools/perf/util/probe-finder.c | 71 +++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/probe-finder.h |  4 +++
 3 files changed, 74 insertions(+), 60 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 1c570c2..adb8d1f 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -515,65 +515,6 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
 	return ntevs;
 }
 
-/*
- * Find a src file from a DWARF tag path. Prepend optional source path prefix
- * and chop off leading directories that do not exist. Result is passed back as
- * a newly allocated path on success.
- * Return 0 if file was found and readable, -errno otherwise.
- */
-static int get_real_path(const char *raw_path, const char *comp_dir,
-			 char **new_path)
-{
-	const char *prefix = symbol_conf.source_prefix;
-
-	if (!prefix) {
-		if (raw_path[0] != '/' && comp_dir)
-			/* If not an absolute path, try to use comp_dir */
-			prefix = comp_dir;
-		else {
-			if (access(raw_path, R_OK) == 0) {
-				*new_path = strdup(raw_path);
-				return *new_path ? 0 : -ENOMEM;
-			} else
-				return -errno;
-		}
-	}
-
-	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
-	if (!*new_path)
-		return -ENOMEM;
-
-	for (;;) {
-		sprintf(*new_path, "%s/%s", prefix, raw_path);
-
-		if (access(*new_path, R_OK) == 0)
-			return 0;
-
-		if (!symbol_conf.source_prefix) {
-			/* In case of searching comp_dir, don't retry */
-			zfree(new_path);
-			return -errno;
-		}
-
-		switch (errno) {
-		case ENAMETOOLONG:
-		case ENOENT:
-		case EROFS:
-		case EFAULT:
-			raw_path = strchr(++raw_path, '/');
-			if (!raw_path) {
-				zfree(new_path);
-				return -ENOENT;
-			}
-			continue;
-
-		default:
-			zfree(new_path);
-			return -errno;
-		}
-	}
-}
-
 #define LINEBUF_SIZE 256
 #define NR_ADDITIONAL_LINES 2
 
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 46f009a..e6c0262 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
 {
 	int ret = 0;
+	char *fpath;
 
 	if (intlist__empty(pf->lcache)) {
+		const char *comp_dir;
+
+		comp_dir = cu_get_comp_dir(&pf->cu_die);
+		ret = get_real_path(pf->fname, comp_dir, &fpath);
+		if (ret < 0) {
+			pr_warning("Failed to find source file path.\n");
+			return ret;
+		}
+
 		/* Matching lazy line pattern */
-		ret = find_lazy_match_lines(pf->lcache, pf->fname,
+		ret = find_lazy_match_lines(pf->lcache, fpath,
 					    pf->pev->point.lazy_line);
+		free(fpath);
 		if (ret <= 0)
 			return ret;
 	}
@@ -1616,3 +1627,61 @@ found:
 	return (ret < 0) ? ret : lf.found;
 }
 
+/*
+ * Find a src file from a DWARF tag path. Prepend optional source path prefix
+ * and chop off leading directories that do not exist. Result is passed back as
+ * a newly allocated path on success.
+ * Return 0 if file was found and readable, -errno otherwise.
+ */
+static int get_real_path(const char *raw_path, const char *comp_dir,
+			 char **new_path)
+{
+	const char *prefix = symbol_conf.source_prefix;
+
+	if (!prefix) {
+		if (raw_path[0] != '/' && comp_dir)
+			/* If not an absolute path, try to use comp_dir */
+			prefix = comp_dir;
+		else {
+			if (access(raw_path, R_OK) == 0) {
+				*new_path = strdup(raw_path);
+				return *new_path ? 0 : -ENOMEM;
+			} else
+				return -errno;
+		}
+	}
+
+	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
+	if (!*new_path)
+		return -ENOMEM;
+
+	for (;;) {
+		sprintf(*new_path, "%s/%s", prefix, raw_path);
+
+		if (access(*new_path, R_OK) == 0)
+			return 0;
+
+		if (!symbol_conf.source_prefix) {
+			/* In case of searching comp_dir, don't retry */
+			zfree(new_path);
+			return -errno;
+		}
+
+		switch (errno) {
+		case ENAMETOOLONG:
+		case ENOENT:
+		case EROFS:
+		case EFAULT:
+			raw_path = strchr(++raw_path, '/');
+			if (!raw_path) {
+				zfree(new_path);
+				return -ENOENT;
+			}
+			continue;
+
+		default:
+			zfree(new_path);
+			return -errno;
+		}
+	}
+}
diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
index 92590b2..5ef82dd 100644
--- a/tools/perf/util/probe-finder.h
+++ b/tools/perf/util/probe-finder.h
@@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
 					     struct variable_list **vls,
 					     int max_points, bool externs);
 
+/* Find a src file from a DWARF tag path */
+extern int get_real_path(const char *raw_path, const char *comp_dir,
+			 char **new_path);
+
 struct probe_finder {
 	struct perf_probe_event	*pev;		/* Target probe event */
 
-- 
2.3.1


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

* Re: [PATCH v2] perf probe: Find compilation directory path for lazy matching
  2015-03-04  7:52 ` [PATCH v2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
@ 2015-03-04 12:34   ` Masami Hiramatsu
  2015-03-11 13:30     ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 18+ messages in thread
From: Masami Hiramatsu @ 2015-03-04 12:34 UTC (permalink / raw)
  To: Naohiro Aota
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Arnaldo Carvalho de Melo, Namhyung Kim, Jiri Olsa,
	open list:PERFORMANCE EVENT...

(2015/03/04 16:52), Naohiro Aota wrote:
> If we use lazy matching, it failed to open a souce file if perf command
> is invoked outside of compilation directory:
> 
> $ perf probe -a '__schedule;clear_*'
> Failed to open kernel/sched/core.c: No such file or directory
>   Error: Failed to add events. (-2)
> 
> OTOH, other commands like "probe -L" can solve the souce directory by
> themselves. Let's make it possible for lazy matching too!
> 

Looks good to me :)

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

Thank you!

> Signed-off-by: Naohiro Aota <naota@elisp.net>
> ---
>  tools/perf/util/probe-event.c  | 59 -----------------------------------
>  tools/perf/util/probe-finder.c | 71 +++++++++++++++++++++++++++++++++++++++++-
>  tools/perf/util/probe-finder.h |  4 +++
>  3 files changed, 74 insertions(+), 60 deletions(-)
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 1c570c2..adb8d1f 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -515,65 +515,6 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
>  	return ntevs;
>  }
>  
> -/*
> - * Find a src file from a DWARF tag path. Prepend optional source path prefix
> - * and chop off leading directories that do not exist. Result is passed back as
> - * a newly allocated path on success.
> - * Return 0 if file was found and readable, -errno otherwise.
> - */
> -static int get_real_path(const char *raw_path, const char *comp_dir,
> -			 char **new_path)
> -{
> -	const char *prefix = symbol_conf.source_prefix;
> -
> -	if (!prefix) {
> -		if (raw_path[0] != '/' && comp_dir)
> -			/* If not an absolute path, try to use comp_dir */
> -			prefix = comp_dir;
> -		else {
> -			if (access(raw_path, R_OK) == 0) {
> -				*new_path = strdup(raw_path);
> -				return *new_path ? 0 : -ENOMEM;
> -			} else
> -				return -errno;
> -		}
> -	}
> -
> -	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
> -	if (!*new_path)
> -		return -ENOMEM;
> -
> -	for (;;) {
> -		sprintf(*new_path, "%s/%s", prefix, raw_path);
> -
> -		if (access(*new_path, R_OK) == 0)
> -			return 0;
> -
> -		if (!symbol_conf.source_prefix) {
> -			/* In case of searching comp_dir, don't retry */
> -			zfree(new_path);
> -			return -errno;
> -		}
> -
> -		switch (errno) {
> -		case ENAMETOOLONG:
> -		case ENOENT:
> -		case EROFS:
> -		case EFAULT:
> -			raw_path = strchr(++raw_path, '/');
> -			if (!raw_path) {
> -				zfree(new_path);
> -				return -ENOENT;
> -			}
> -			continue;
> -
> -		default:
> -			zfree(new_path);
> -			return -errno;
> -		}
> -	}
> -}
> -
>  #define LINEBUF_SIZE 256
>  #define NR_ADDITIONAL_LINES 2
>  
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 46f009a..e6c0262 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
>  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
>  {
>  	int ret = 0;
> +	char *fpath;
>  
>  	if (intlist__empty(pf->lcache)) {
> +		const char *comp_dir;
> +
> +		comp_dir = cu_get_comp_dir(&pf->cu_die);
> +		ret = get_real_path(pf->fname, comp_dir, &fpath);
> +		if (ret < 0) {
> +			pr_warning("Failed to find source file path.\n");
> +			return ret;
> +		}
> +
>  		/* Matching lazy line pattern */
> -		ret = find_lazy_match_lines(pf->lcache, pf->fname,
> +		ret = find_lazy_match_lines(pf->lcache, fpath,
>  					    pf->pev->point.lazy_line);
> +		free(fpath);
>  		if (ret <= 0)
>  			return ret;
>  	}
> @@ -1616,3 +1627,61 @@ found:
>  	return (ret < 0) ? ret : lf.found;
>  }
>  
> +/*
> + * Find a src file from a DWARF tag path. Prepend optional source path prefix
> + * and chop off leading directories that do not exist. Result is passed back as
> + * a newly allocated path on success.
> + * Return 0 if file was found and readable, -errno otherwise.
> + */
> +static int get_real_path(const char *raw_path, const char *comp_dir,
> +			 char **new_path)
> +{
> +	const char *prefix = symbol_conf.source_prefix;
> +
> +	if (!prefix) {
> +		if (raw_path[0] != '/' && comp_dir)
> +			/* If not an absolute path, try to use comp_dir */
> +			prefix = comp_dir;
> +		else {
> +			if (access(raw_path, R_OK) == 0) {
> +				*new_path = strdup(raw_path);
> +				return *new_path ? 0 : -ENOMEM;
> +			} else
> +				return -errno;
> +		}
> +	}
> +
> +	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
> +	if (!*new_path)
> +		return -ENOMEM;
> +
> +	for (;;) {
> +		sprintf(*new_path, "%s/%s", prefix, raw_path);
> +
> +		if (access(*new_path, R_OK) == 0)
> +			return 0;
> +
> +		if (!symbol_conf.source_prefix) {
> +			/* In case of searching comp_dir, don't retry */
> +			zfree(new_path);
> +			return -errno;
> +		}
> +
> +		switch (errno) {
> +		case ENAMETOOLONG:
> +		case ENOENT:
> +		case EROFS:
> +		case EFAULT:
> +			raw_path = strchr(++raw_path, '/');
> +			if (!raw_path) {
> +				zfree(new_path);
> +				return -ENOENT;
> +			}
> +			continue;
> +
> +		default:
> +			zfree(new_path);
> +			return -errno;
> +		}
> +	}
> +}
> diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
> index 92590b2..5ef82dd 100644
> --- a/tools/perf/util/probe-finder.h
> +++ b/tools/perf/util/probe-finder.h
> @@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
>  					     struct variable_list **vls,
>  					     int max_points, bool externs);
>  
> +/* Find a src file from a DWARF tag path */
> +extern int get_real_path(const char *raw_path, const char *comp_dir,
> +			 char **new_path);
> +
>  struct probe_finder {
>  	struct perf_probe_event	*pev;		/* Target probe event */
>  
> 


-- 
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com



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

* Re: [PATCH v2] perf probe: Find compilation directory path for lazy matching
  2015-03-04 12:34   ` Masami Hiramatsu
@ 2015-03-11 13:30     ` Arnaldo Carvalho de Melo
  2015-03-12  1:42       ` Masami Hiramatsu
  2015-03-13  5:18       ` [PATCH v3] " Naohiro Aota
  0 siblings, 2 replies; 18+ messages in thread
From: Arnaldo Carvalho de Melo @ 2015-03-11 13:30 UTC (permalink / raw)
  To: Naohiro Aota
  Cc: Masami Hiramatsu, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Namhyung Kim, Jiri Olsa, open list:PERFORMANCE EVENT...

Em Wed, Mar 04, 2015 at 09:34:38PM +0900, Masami Hiramatsu escreveu:
> (2015/03/04 16:52), Naohiro Aota wrote:
> > If we use lazy matching, it failed to open a souce file if perf command
> > is invoked outside of compilation directory:
> > 
> > $ perf probe -a '__schedule;clear_*'
> > Failed to open kernel/sched/core.c: No such file or directory
> >   Error: Failed to add events. (-2)
> > 
> > OTOH, other commands like "probe -L" can solve the souce directory by
> > themselves. Let's make it possible for lazy matching too!
> > 
> 
> Looks good to me :)
> 
> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

This doesn't make sense... se below:
 
> Thank you!
> 
> > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> > index 46f009a..e6c0262 100644
> > --- a/tools/perf/util/probe-finder.c
> > +++ b/tools/perf/util/probe-finder.c
> > @@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
> >  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
> >  {
> >  	int ret = 0;
> > +	char *fpath;
> >  
> >  	if (intlist__empty(pf->lcache)) {
> > +		const char *comp_dir;
> > +
> > +		comp_dir = cu_get_comp_dir(&pf->cu_die);
> > +		ret = get_real_path(pf->fname, comp_dir, &fpath);
> > +		if (ret < 0) {
> > +			pr_warning("Failed to find source file path.\n");
> > +			return ret;
> > +		}
> > +
> >  		/* Matching lazy line pattern */
> > -		ret = find_lazy_match_lines(pf->lcache, pf->fname,
> > +		ret = find_lazy_match_lines(pf->lcache, fpath,
> >  					    pf->pev->point.lazy_line);
> > +		free(fpath);
> >  		if (ret <= 0)
> >  			return ret;
> >  	}
> > @@ -1616,3 +1627,61 @@ found:
> >  	return (ret < 0) ? ret : lf.found;
> >  }
> >  
> > +/*
> > + * Find a src file from a DWARF tag path. Prepend optional source path prefix
> > + * and chop off leading directories that do not exist. Result is passed back as
> > + * a newly allocated path on success.
> > + * Return 0 if file was found and readable, -errno otherwise.
> > + */
> > +static int get_real_path(const char *raw_path, const char *comp_dir,
> > +			 char **new_path)

The function is marked "static"

> > +{
> > +	const char *prefix = symbol_conf.source_prefix;
> > +
> > +	if (!prefix) {
> > +		if (raw_path[0] != '/' && comp_dir)
> > +			/* If not an absolute path, try to use comp_dir */
> > +			prefix = comp_dir;
> > +		else {
> > +			if (access(raw_path, R_OK) == 0) {
> > +				*new_path = strdup(raw_path);
> > +				return *new_path ? 0 : -ENOMEM;
> > +			} else
> > +				return -errno;
> > +		}
> > +	}
> > +
> > +	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
> > +	if (!*new_path)
> > +		return -ENOMEM;
> > +
> > +	for (;;) {
> > +		sprintf(*new_path, "%s/%s", prefix, raw_path);
> > +
> > +		if (access(*new_path, R_OK) == 0)
> > +			return 0;
> > +
> > +		if (!symbol_conf.source_prefix) {
> > +			/* In case of searching comp_dir, don't retry */
> > +			zfree(new_path);
> > +			return -errno;
> > +		}
> > +
> > +		switch (errno) {
> > +		case ENAMETOOLONG:
> > +		case ENOENT:
> > +		case EROFS:
> > +		case EFAULT:
> > +			raw_path = strchr(++raw_path, '/');
> > +			if (!raw_path) {
> > +				zfree(new_path);
> > +				return -ENOENT;
> > +			}
> > +			continue;
> > +
> > +		default:
> > +			zfree(new_path);
> > +			return -errno;
> > +		}
> > +	}
> > +}
> > diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
> > index 92590b2..5ef82dd 100644
> > --- a/tools/perf/util/probe-finder.h
> > +++ b/tools/perf/util/probe-finder.h
> > @@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
> >  					     struct variable_list **vls,
> >  					     int max_points, bool externs);
> >  
> > +/* Find a src file from a DWARF tag path */
> > +extern int get_real_path(const char *raw_path, const char *comp_dir,
> > +			 char **new_path);
> > +

And then you mark it "extern"? Have you tried to compile this? I tried:
 
  CC       /tmp/build/perf/tests/task-exit.o
util/probe-finder.c:1636:12: error: static declaration of ‘get_real_path’ follows non-static declaration
 static int get_real_path(const char *raw_path, const char *comp_dir,
            ^
In file included from util/probe-finder.c:41:0:
util/probe-finder.h:59:12: note: previous declaration of ‘get_real_path’ was here
 extern int get_real_path(const char *raw_path, const char *comp_dir,
            ^
util/probe-finder.c:1636:12: error: ‘get_real_path’ defined but not used [-Werror=unused-function]
 static int get_real_path(const char *raw_path, const char *comp_dir,
            ^
cc1: all warnings being treated as errors
make[3]: *** [/tmp/build/perf/util/probe-finder.o] Error 1
make[3]: *** Waiting for unfinished jobs....
  CC       /tmp/build/perf/tests/sw-clock.o

Also please refrain from using 'extern' in front of function prototypes, its just noise.

- Arnaldo

> >  struct probe_finder {
> >  	struct perf_probe_event	*pev;		/* Target probe event */
> >  
> > 
> 
> 
> -- 
> Masami HIRAMATSU
> Software Platform Research Dept. Linux Technology Research Center
> Hitachi, Ltd., Yokohama Research Laboratory
> E-mail: masami.hiramatsu.pt@hitachi.com
> 

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

* Re: Re: [PATCH v2] perf probe: Find compilation directory path for lazy matching
  2015-03-11 13:30     ` Arnaldo Carvalho de Melo
@ 2015-03-12  1:42       ` Masami Hiramatsu
  2015-03-13  5:13         ` Naohiro Aota
  2015-03-13  5:18       ` [PATCH v3] " Naohiro Aota
  1 sibling, 1 reply; 18+ messages in thread
From: Masami Hiramatsu @ 2015-03-12  1:42 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Naohiro Aota, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Namhyung Kim, Jiri Olsa, open list:PERFORMANCE EVENT...

(2015/03/11 22:30), Arnaldo Carvalho de Melo wrote:
> Em Wed, Mar 04, 2015 at 09:34:38PM +0900, Masami Hiramatsu escreveu:
>> (2015/03/04 16:52), Naohiro Aota wrote:
>>> If we use lazy matching, it failed to open a souce file if perf command
>>> is invoked outside of compilation directory:
>>>
>>> $ perf probe -a '__schedule;clear_*'
>>> Failed to open kernel/sched/core.c: No such file or directory
>>>   Error: Failed to add events. (-2)
>>>
>>> OTOH, other commands like "probe -L" can solve the souce directory by
>>> themselves. Let's make it possible for lazy matching too!
>>>
>>
>> Looks good to me :)
>>
>> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> 
> This doesn't make sense... se below:
>  
>> Thank you!
>>
>>> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
>>> index 46f009a..e6c0262 100644
>>> --- a/tools/perf/util/probe-finder.c
>>> +++ b/tools/perf/util/probe-finder.c
>>> @@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
>>>  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
>>>  {
>>>  	int ret = 0;
>>> +	char *fpath;
>>>  
>>>  	if (intlist__empty(pf->lcache)) {
>>> +		const char *comp_dir;
>>> +
>>> +		comp_dir = cu_get_comp_dir(&pf->cu_die);
>>> +		ret = get_real_path(pf->fname, comp_dir, &fpath);
>>> +		if (ret < 0) {
>>> +			pr_warning("Failed to find source file path.\n");
>>> +			return ret;
>>> +		}
>>> +
>>>  		/* Matching lazy line pattern */
>>> -		ret = find_lazy_match_lines(pf->lcache, pf->fname,
>>> +		ret = find_lazy_match_lines(pf->lcache, fpath,
>>>  					    pf->pev->point.lazy_line);
>>> +		free(fpath);
>>>  		if (ret <= 0)
>>>  			return ret;
>>>  	}
>>> @@ -1616,3 +1627,61 @@ found:
>>>  	return (ret < 0) ? ret : lf.found;
>>>  }
>>>  
>>> +/*
>>> + * Find a src file from a DWARF tag path. Prepend optional source path prefix
>>> + * and chop off leading directories that do not exist. Result is passed back as
>>> + * a newly allocated path on success.
>>> + * Return 0 if file was found and readable, -errno otherwise.
>>> + */
>>> +static int get_real_path(const char *raw_path, const char *comp_dir,
>>> +			 char **new_path)
> 
> The function is marked "static"
> 
>>> +{
>>> +	const char *prefix = symbol_conf.source_prefix;
>>> +
>>> +	if (!prefix) {
>>> +		if (raw_path[0] != '/' && comp_dir)
>>> +			/* If not an absolute path, try to use comp_dir */
>>> +			prefix = comp_dir;
>>> +		else {
>>> +			if (access(raw_path, R_OK) == 0) {
>>> +				*new_path = strdup(raw_path);
>>> +				return *new_path ? 0 : -ENOMEM;
>>> +			} else
>>> +				return -errno;
>>> +		}
>>> +	}
>>> +
>>> +	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
>>> +	if (!*new_path)
>>> +		return -ENOMEM;
>>> +
>>> +	for (;;) {
>>> +		sprintf(*new_path, "%s/%s", prefix, raw_path);
>>> +
>>> +		if (access(*new_path, R_OK) == 0)
>>> +			return 0;
>>> +
>>> +		if (!symbol_conf.source_prefix) {
>>> +			/* In case of searching comp_dir, don't retry */
>>> +			zfree(new_path);
>>> +			return -errno;
>>> +		}
>>> +
>>> +		switch (errno) {
>>> +		case ENAMETOOLONG:
>>> +		case ENOENT:
>>> +		case EROFS:
>>> +		case EFAULT:
>>> +			raw_path = strchr(++raw_path, '/');
>>> +			if (!raw_path) {
>>> +				zfree(new_path);
>>> +				return -ENOENT;
>>> +			}
>>> +			continue;
>>> +
>>> +		default:
>>> +			zfree(new_path);
>>> +			return -errno;
>>> +		}
>>> +	}
>>> +}
>>> diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
>>> index 92590b2..5ef82dd 100644
>>> --- a/tools/perf/util/probe-finder.h
>>> +++ b/tools/perf/util/probe-finder.h
>>> @@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
>>>  					     struct variable_list **vls,
>>>  					     int max_points, bool externs);
>>>  
>>> +/* Find a src file from a DWARF tag path */
>>> +extern int get_real_path(const char *raw_path, const char *comp_dir,
>>> +			 char **new_path);
>>> +
> 
> And then you mark it "extern"? Have you tried to compile this? I tried:
>  
>   CC       /tmp/build/perf/tests/task-exit.o
> util/probe-finder.c:1636:12: error: static declaration of ‘get_real_path’ follows non-static declaration
>  static int get_real_path(const char *raw_path, const char *comp_dir,
>             ^
> In file included from util/probe-finder.c:41:0:
> util/probe-finder.h:59:12: note: previous declaration of ‘get_real_path’ was here
>  extern int get_real_path(const char *raw_path, const char *comp_dir,
>             ^
> util/probe-finder.c:1636:12: error: ‘get_real_path’ defined but not used [-Werror=unused-function]
>  static int get_real_path(const char *raw_path, const char *comp_dir,
>             ^
> cc1: all warnings being treated as errors
> make[3]: *** [/tmp/build/perf/util/probe-finder.o] Error 1
> make[3]: *** Waiting for unfinished jobs....
>   CC       /tmp/build/perf/tests/sw-clock.o
> 
> Also please refrain from using 'extern' in front of function prototypes, its just noise.1

Ooops! Sorry, I missed this ...

Naohiro, could you fix this?

Thanks,

> 
> - Arnaldo
> 
>>>  struct probe_finder {
>>>  	struct perf_probe_event	*pev;		/* Target probe event */
>>>  
>>>
>>
>>
>> -- 
>> Masami HIRAMATSU
>> Software Platform Research Dept. Linux Technology Research Center
>> Hitachi, Ltd., Yokohama Research Laboratory
>> E-mail: masami.hiramatsu.pt@hitachi.com
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 


-- 
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com



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

* Re: Re: [PATCH v2] perf probe: Find compilation directory path for lazy matching
  2015-03-12  1:42       ` Masami Hiramatsu
@ 2015-03-13  5:13         ` Naohiro Aota
  0 siblings, 0 replies; 18+ messages in thread
From: Naohiro Aota @ 2015-03-13  5:13 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, Jiri Olsa,
	open list:PERFORMANCE EVENT...

On Thu, Mar 12, 2015 at 10:42 AM, Masami Hiramatsu
<masami.hiramatsu.pt@hitachi.com> wrote:
> (2015/03/11 22:30), Arnaldo Carvalho de Melo wrote:
>> Em Wed, Mar 04, 2015 at 09:34:38PM +0900, Masami Hiramatsu escreveu:
>>> (2015/03/04 16:52), Naohiro Aota wrote:
>>>> If we use lazy matching, it failed to open a souce file if perf command
>>>> is invoked outside of compilation directory:
>>>>
>>>> $ perf probe -a '__schedule;clear_*'
>>>> Failed to open kernel/sched/core.c: No such file or directory
>>>>   Error: Failed to add events. (-2)
>>>>
>>>> OTOH, other commands like "probe -L" can solve the souce directory by
>>>> themselves. Let's make it possible for lazy matching too!
>>>>
>>>
>>> Looks good to me :)
>>>
>>> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
>>
>> This doesn't make sense... se below:
>>
>>> Thank you!
>>>
>>>> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
>>>> index 46f009a..e6c0262 100644
>>>> --- a/tools/perf/util/probe-finder.c
>>>> +++ b/tools/perf/util/probe-finder.c
>>>> @@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
>>>>  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
>>>>  {
>>>>     int ret = 0;
>>>> +   char *fpath;
>>>>
>>>>     if (intlist__empty(pf->lcache)) {
>>>> +           const char *comp_dir;
>>>> +
>>>> +           comp_dir = cu_get_comp_dir(&pf->cu_die);
>>>> +           ret = get_real_path(pf->fname, comp_dir, &fpath);
>>>> +           if (ret < 0) {
>>>> +                   pr_warning("Failed to find source file path.\n");
>>>> +                   return ret;
>>>> +           }
>>>> +
>>>>             /* Matching lazy line pattern */
>>>> -           ret = find_lazy_match_lines(pf->lcache, pf->fname,
>>>> +           ret = find_lazy_match_lines(pf->lcache, fpath,
>>>>                                         pf->pev->point.lazy_line);
>>>> +           free(fpath);
>>>>             if (ret <= 0)
>>>>                     return ret;
>>>>     }
>>>> @@ -1616,3 +1627,61 @@ found:
>>>>     return (ret < 0) ? ret : lf.found;
>>>>  }
>>>>
>>>> +/*
>>>> + * Find a src file from a DWARF tag path. Prepend optional source path prefix
>>>> + * and chop off leading directories that do not exist. Result is passed back as
>>>> + * a newly allocated path on success.
>>>> + * Return 0 if file was found and readable, -errno otherwise.
>>>> + */
>>>> +static int get_real_path(const char *raw_path, const char *comp_dir,
>>>> +                    char **new_path)
>>
>> The function is marked "static"
>>
>>>> +{
>>>> +   const char *prefix = symbol_conf.source_prefix;
>>>> +
>>>> +   if (!prefix) {
>>>> +           if (raw_path[0] != '/' && comp_dir)
>>>> +                   /* If not an absolute path, try to use comp_dir */
>>>> +                   prefix = comp_dir;
>>>> +           else {
>>>> +                   if (access(raw_path, R_OK) == 0) {
>>>> +                           *new_path = strdup(raw_path);
>>>> +                           return *new_path ? 0 : -ENOMEM;
>>>> +                   } else
>>>> +                           return -errno;
>>>> +           }
>>>> +   }
>>>> +
>>>> +   *new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
>>>> +   if (!*new_path)
>>>> +           return -ENOMEM;
>>>> +
>>>> +   for (;;) {
>>>> +           sprintf(*new_path, "%s/%s", prefix, raw_path);
>>>> +
>>>> +           if (access(*new_path, R_OK) == 0)
>>>> +                   return 0;
>>>> +
>>>> +           if (!symbol_conf.source_prefix) {
>>>> +                   /* In case of searching comp_dir, don't retry */
>>>> +                   zfree(new_path);
>>>> +                   return -errno;
>>>> +           }
>>>> +
>>>> +           switch (errno) {
>>>> +           case ENAMETOOLONG:
>>>> +           case ENOENT:
>>>> +           case EROFS:
>>>> +           case EFAULT:
>>>> +                   raw_path = strchr(++raw_path, '/');
>>>> +                   if (!raw_path) {
>>>> +                           zfree(new_path);
>>>> +                           return -ENOENT;
>>>> +                   }
>>>> +                   continue;
>>>> +
>>>> +           default:
>>>> +                   zfree(new_path);
>>>> +                   return -errno;
>>>> +           }
>>>> +   }
>>>> +}
>>>> diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
>>>> index 92590b2..5ef82dd 100644
>>>> --- a/tools/perf/util/probe-finder.h
>>>> +++ b/tools/perf/util/probe-finder.h
>>>> @@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
>>>>                                          struct variable_list **vls,
>>>>                                          int max_points, bool externs);
>>>>
>>>> +/* Find a src file from a DWARF tag path */
>>>> +extern int get_real_path(const char *raw_path, const char *comp_dir,
>>>> +                    char **new_path);
>>>> +
>>
>> And then you mark it "extern"? Have you tried to compile this? I tried:
>>
>>   CC       /tmp/build/perf/tests/task-exit.o
>> util/probe-finder.c:1636:12: error: static declaration of 'get_real_path' follows non-static declaration
>>  static int get_real_path(const char *raw_path, const char *comp_dir,
>>             ^
>> In file included from util/probe-finder.c:41:0:
>> util/probe-finder.h:59:12: note: previous declaration of 'get_real_path' was here
>>  extern int get_real_path(const char *raw_path, const char *comp_dir,
>>             ^
>> util/probe-finder.c:1636:12: error: 'get_real_path' defined but not used [-Werror=unused-function]
>>  static int get_real_path(const char *raw_path, const char *comp_dir,
>>             ^
>> cc1: all warnings being treated as errors
>> make[3]: *** [/tmp/build/perf/util/probe-finder.o] Error 1
>> make[3]: *** Waiting for unfinished jobs....
>>   CC       /tmp/build/perf/tests/sw-clock.o
>>
>> Also please refrain from using 'extern' in front of function prototypes, its just noise.1
>
> Ooops! Sorry, I missed this ...
>
> Naohiro, could you fix this?
>
> Thanks,

Ooops, I must have messed the things up during rebasing. I'll soon send fix.

>
>>
>> - Arnaldo
>>
>>>>  struct probe_finder {
>>>>     struct perf_probe_event *pev;           /* Target probe event */
>>>>
>>>>
>>>
>>>
>>> --
>>> Masami HIRAMATSU
>>> Software Platform Research Dept. Linux Technology Research Center
>>> Hitachi, Ltd., Yokohama Research Laboratory
>>> E-mail: masami.hiramatsu.pt@hitachi.com
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
>>
>
>
> --
> Masami HIRAMATSU
> Software Platform Research Dept. Linux Technology Research Center
> Hitachi, Ltd., Yokohama Research Laboratory
> E-mail: masami.hiramatsu.pt@hitachi.com
>
>

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

* [PATCH v3] perf probe: Find compilation directory path for lazy matching
  2015-03-11 13:30     ` Arnaldo Carvalho de Melo
  2015-03-12  1:42       ` Masami Hiramatsu
@ 2015-03-13  5:18       ` Naohiro Aota
  2015-03-13 12:21         ` Masami Hiramatsu
                           ` (2 more replies)
  1 sibling, 3 replies; 18+ messages in thread
From: Naohiro Aota @ 2015-03-13  5:18 UTC (permalink / raw)
  To: Masami Hiramatsu, Arnaldo Carvalho de Melo
  Cc: Naohiro Aota, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Namhyung Kim, He Kuang, Jiri Olsa, open list:PERFORMANCE EVENT...

If we use lazy matching, it failed to open a souce file if perf command
is invoked outside of compilation directory:

$ perf probe -a '__schedule;clear_*'
Failed to open kernel/sched/core.c: No such file or directory
  Error: Failed to add events. (-2)

OTOH, other commands like "probe -L" can solve the souce directory by
themselves. Let's make it possible for lazy matching too!

Signed-off-by: Naohiro Aota <naota@elisp.net>
---
 tools/perf/util/probe-event.c  | 59 -----------------------------------
 tools/perf/util/probe-finder.c | 71 +++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/probe-finder.h |  4 +++
 3 files changed, 74 insertions(+), 60 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f272a71..32a429b 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -648,65 +648,6 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
 	return ntevs;
 }
 
-/*
- * Find a src file from a DWARF tag path. Prepend optional source path prefix
- * and chop off leading directories that do not exist. Result is passed back as
- * a newly allocated path on success.
- * Return 0 if file was found and readable, -errno otherwise.
- */
-static int get_real_path(const char *raw_path, const char *comp_dir,
-			 char **new_path)
-{
-	const char *prefix = symbol_conf.source_prefix;
-
-	if (!prefix) {
-		if (raw_path[0] != '/' && comp_dir)
-			/* If not an absolute path, try to use comp_dir */
-			prefix = comp_dir;
-		else {
-			if (access(raw_path, R_OK) == 0) {
-				*new_path = strdup(raw_path);
-				return *new_path ? 0 : -ENOMEM;
-			} else
-				return -errno;
-		}
-	}
-
-	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
-	if (!*new_path)
-		return -ENOMEM;
-
-	for (;;) {
-		sprintf(*new_path, "%s/%s", prefix, raw_path);
-
-		if (access(*new_path, R_OK) == 0)
-			return 0;
-
-		if (!symbol_conf.source_prefix) {
-			/* In case of searching comp_dir, don't retry */
-			zfree(new_path);
-			return -errno;
-		}
-
-		switch (errno) {
-		case ENAMETOOLONG:
-		case ENOENT:
-		case EROFS:
-		case EFAULT:
-			raw_path = strchr(++raw_path, '/');
-			if (!raw_path) {
-				zfree(new_path);
-				return -ENOENT;
-			}
-			continue;
-
-		default:
-			zfree(new_path);
-			return -errno;
-		}
-	}
-}
-
 #define LINEBUF_SIZE 256
 #define NR_ADDITIONAL_LINES 2
 
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 46f009a..0fd2df4 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
 {
 	int ret = 0;
+	char *fpath;
 
 	if (intlist__empty(pf->lcache)) {
+		const char *comp_dir;
+
+		comp_dir = cu_get_comp_dir(&pf->cu_die);
+		ret = get_real_path(pf->fname, comp_dir, &fpath);
+		if (ret < 0) {
+			pr_warning("Failed to find source file path.\n");
+			return ret;
+		}
+
 		/* Matching lazy line pattern */
-		ret = find_lazy_match_lines(pf->lcache, pf->fname,
+		ret = find_lazy_match_lines(pf->lcache, fpath,
 					    pf->pev->point.lazy_line);
+		free(fpath);
 		if (ret <= 0)
 			return ret;
 	}
@@ -1616,3 +1627,61 @@ found:
 	return (ret < 0) ? ret : lf.found;
 }
 
+/*
+ * Find a src file from a DWARF tag path. Prepend optional source path prefix
+ * and chop off leading directories that do not exist. Result is passed back as
+ * a newly allocated path on success.
+ * Return 0 if file was found and readable, -errno otherwise.
+ */
+int get_real_path(const char *raw_path, const char *comp_dir,
+			 char **new_path)
+{
+	const char *prefix = symbol_conf.source_prefix;
+
+	if (!prefix) {
+		if (raw_path[0] != '/' && comp_dir)
+			/* If not an absolute path, try to use comp_dir */
+			prefix = comp_dir;
+		else {
+			if (access(raw_path, R_OK) == 0) {
+				*new_path = strdup(raw_path);
+				return *new_path ? 0 : -ENOMEM;
+			} else
+				return -errno;
+		}
+	}
+
+	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
+	if (!*new_path)
+		return -ENOMEM;
+
+	for (;;) {
+		sprintf(*new_path, "%s/%s", prefix, raw_path);
+
+		if (access(*new_path, R_OK) == 0)
+			return 0;
+
+		if (!symbol_conf.source_prefix) {
+			/* In case of searching comp_dir, don't retry */
+			zfree(new_path);
+			return -errno;
+		}
+
+		switch (errno) {
+		case ENAMETOOLONG:
+		case ENOENT:
+		case EROFS:
+		case EFAULT:
+			raw_path = strchr(++raw_path, '/');
+			if (!raw_path) {
+				zfree(new_path);
+				return -ENOENT;
+			}
+			continue;
+
+		default:
+			zfree(new_path);
+			return -errno;
+		}
+	}
+}
diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
index 92590b2..ebf8c8c 100644
--- a/tools/perf/util/probe-finder.h
+++ b/tools/perf/util/probe-finder.h
@@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
 					     struct variable_list **vls,
 					     int max_points, bool externs);
 
+/* Find a src file from a DWARF tag path */
+int get_real_path(const char *raw_path, const char *comp_dir,
+			 char **new_path);
+
 struct probe_finder {
 	struct perf_probe_event	*pev;		/* Target probe event */
 
-- 
2.3.1


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

* Re: [PATCH v3] perf probe: Find compilation directory path for lazy matching
  2015-03-13  5:18       ` [PATCH v3] " Naohiro Aota
@ 2015-03-13 12:21         ` Masami Hiramatsu
  2015-04-13 23:10         ` Arnaldo Carvalho de Melo
  2015-04-14 12:17         ` [tip:perf/urgent] " tip-bot for Naohiro Aota
  2 siblings, 0 replies; 18+ messages in thread
From: Masami Hiramatsu @ 2015-03-13 12:21 UTC (permalink / raw)
  To: Naohiro Aota
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, He Kuang, Jiri Olsa,
	open list:PERFORMANCE EVENT...

(2015/03/13 14:18), Naohiro Aota wrote:
> If we use lazy matching, it failed to open a souce file if perf command
> is invoked outside of compilation directory:
> 
> $ perf probe -a '__schedule;clear_*'
> Failed to open kernel/sched/core.c: No such file or directory
>   Error: Failed to add events. (-2)
> 
> OTOH, other commands like "probe -L" can solve the souce directory by
> themselves. Let's make it possible for lazy matching too!
> 

Ok, I've built and tested it.
----
[mhiramat@localhost opt]$ sudo /home/mhiramat/ksrc/linux-3/tools/perf/perf probe -fna '__schedule;clear_*'
Added new event:
  probe:__schedule     (on __schedule)

You can now use it in all perf tools, such as:

        perf record -e probe:__schedule -aR sleep 1

----
So now it can go :)

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>


Thank you!

> Signed-off-by: Naohiro Aota <naota@elisp.net>
> ---
>  tools/perf/util/probe-event.c  | 59 -----------------------------------
>  tools/perf/util/probe-finder.c | 71 +++++++++++++++++++++++++++++++++++++++++-
>  tools/perf/util/probe-finder.h |  4 +++
>  3 files changed, 74 insertions(+), 60 deletions(-)
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index f272a71..32a429b 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -648,65 +648,6 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
>  	return ntevs;
>  }
>  
> -/*
> - * Find a src file from a DWARF tag path. Prepend optional source path prefix
> - * and chop off leading directories that do not exist. Result is passed back as
> - * a newly allocated path on success.
> - * Return 0 if file was found and readable, -errno otherwise.
> - */
> -static int get_real_path(const char *raw_path, const char *comp_dir,
> -			 char **new_path)
> -{
> -	const char *prefix = symbol_conf.source_prefix;
> -
> -	if (!prefix) {
> -		if (raw_path[0] != '/' && comp_dir)
> -			/* If not an absolute path, try to use comp_dir */
> -			prefix = comp_dir;
> -		else {
> -			if (access(raw_path, R_OK) == 0) {
> -				*new_path = strdup(raw_path);
> -				return *new_path ? 0 : -ENOMEM;
> -			} else
> -				return -errno;
> -		}
> -	}
> -
> -	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
> -	if (!*new_path)
> -		return -ENOMEM;
> -
> -	for (;;) {
> -		sprintf(*new_path, "%s/%s", prefix, raw_path);
> -
> -		if (access(*new_path, R_OK) == 0)
> -			return 0;
> -
> -		if (!symbol_conf.source_prefix) {
> -			/* In case of searching comp_dir, don't retry */
> -			zfree(new_path);
> -			return -errno;
> -		}
> -
> -		switch (errno) {
> -		case ENAMETOOLONG:
> -		case ENOENT:
> -		case EROFS:
> -		case EFAULT:
> -			raw_path = strchr(++raw_path, '/');
> -			if (!raw_path) {
> -				zfree(new_path);
> -				return -ENOENT;
> -			}
> -			continue;
> -
> -		default:
> -			zfree(new_path);
> -			return -errno;
> -		}
> -	}
> -}
> -
>  #define LINEBUF_SIZE 256
>  #define NR_ADDITIONAL_LINES 2
>  
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 46f009a..0fd2df4 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
>  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
>  {
>  	int ret = 0;
> +	char *fpath;
>  
>  	if (intlist__empty(pf->lcache)) {
> +		const char *comp_dir;
> +
> +		comp_dir = cu_get_comp_dir(&pf->cu_die);
> +		ret = get_real_path(pf->fname, comp_dir, &fpath);
> +		if (ret < 0) {
> +			pr_warning("Failed to find source file path.\n");
> +			return ret;
> +		}
> +
>  		/* Matching lazy line pattern */
> -		ret = find_lazy_match_lines(pf->lcache, pf->fname,
> +		ret = find_lazy_match_lines(pf->lcache, fpath,
>  					    pf->pev->point.lazy_line);
> +		free(fpath);
>  		if (ret <= 0)
>  			return ret;
>  	}
> @@ -1616,3 +1627,61 @@ found:
>  	return (ret < 0) ? ret : lf.found;
>  }
>  
> +/*
> + * Find a src file from a DWARF tag path. Prepend optional source path prefix
> + * and chop off leading directories that do not exist. Result is passed back as
> + * a newly allocated path on success.
> + * Return 0 if file was found and readable, -errno otherwise.
> + */
> +int get_real_path(const char *raw_path, const char *comp_dir,
> +			 char **new_path)
> +{
> +	const char *prefix = symbol_conf.source_prefix;
> +
> +	if (!prefix) {
> +		if (raw_path[0] != '/' && comp_dir)
> +			/* If not an absolute path, try to use comp_dir */
> +			prefix = comp_dir;
> +		else {
> +			if (access(raw_path, R_OK) == 0) {
> +				*new_path = strdup(raw_path);
> +				return *new_path ? 0 : -ENOMEM;
> +			} else
> +				return -errno;
> +		}
> +	}
> +
> +	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
> +	if (!*new_path)
> +		return -ENOMEM;
> +
> +	for (;;) {
> +		sprintf(*new_path, "%s/%s", prefix, raw_path);
> +
> +		if (access(*new_path, R_OK) == 0)
> +			return 0;
> +
> +		if (!symbol_conf.source_prefix) {
> +			/* In case of searching comp_dir, don't retry */
> +			zfree(new_path);
> +			return -errno;
> +		}
> +
> +		switch (errno) {
> +		case ENAMETOOLONG:
> +		case ENOENT:
> +		case EROFS:
> +		case EFAULT:
> +			raw_path = strchr(++raw_path, '/');
> +			if (!raw_path) {
> +				zfree(new_path);
> +				return -ENOENT;
> +			}
> +			continue;
> +
> +		default:
> +			zfree(new_path);
> +			return -errno;
> +		}
> +	}
> +}
> diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
> index 92590b2..ebf8c8c 100644
> --- a/tools/perf/util/probe-finder.h
> +++ b/tools/perf/util/probe-finder.h
> @@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
>  					     struct variable_list **vls,
>  					     int max_points, bool externs);
>  
> +/* Find a src file from a DWARF tag path */
> +int get_real_path(const char *raw_path, const char *comp_dir,
> +			 char **new_path);
> +
>  struct probe_finder {
>  	struct perf_probe_event	*pev;		/* Target probe event */
>  
> 


-- 
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com



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

* Re: [PATCH v3] perf probe: Find compilation directory path for lazy matching
  2015-03-13  5:18       ` [PATCH v3] " Naohiro Aota
  2015-03-13 12:21         ` Masami Hiramatsu
@ 2015-04-13 23:10         ` Arnaldo Carvalho de Melo
  2015-04-14  6:35           ` Masami Hiramatsu
  2015-04-14 12:17         ` [tip:perf/urgent] " tip-bot for Naohiro Aota
  2 siblings, 1 reply; 18+ messages in thread
From: Arnaldo Carvalho de Melo @ 2015-04-13 23:10 UTC (permalink / raw)
  To: Naohiro Aota
  Cc: Masami Hiramatsu, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Namhyung Kim, He Kuang, Jiri Olsa, open list:PERFORMANCE EVENT...

Em Fri, Mar 13, 2015 at 02:18:40PM +0900, Naohiro Aota escreveu:
> If we use lazy matching, it failed to open a souce file if perf command
> is invoked outside of compilation directory:
> 
> $ perf probe -a '__schedule;clear_*'
> Failed to open kernel/sched/core.c: No such file or directory
>   Error: Failed to add events. (-2)

Masami, you mean this one, right?

- Arnaldo
 
> OTOH, other commands like "probe -L" can solve the souce directory by
> themselves. Let's make it possible for lazy matching too!
> 
> Signed-off-by: Naohiro Aota <naota@elisp.net>
> ---
>  tools/perf/util/probe-event.c  | 59 -----------------------------------
>  tools/perf/util/probe-finder.c | 71 +++++++++++++++++++++++++++++++++++++++++-
>  tools/perf/util/probe-finder.h |  4 +++
>  3 files changed, 74 insertions(+), 60 deletions(-)
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index f272a71..32a429b 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -648,65 +648,6 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
>  	return ntevs;
>  }
>  
> -/*
> - * Find a src file from a DWARF tag path. Prepend optional source path prefix
> - * and chop off leading directories that do not exist. Result is passed back as
> - * a newly allocated path on success.
> - * Return 0 if file was found and readable, -errno otherwise.
> - */
> -static int get_real_path(const char *raw_path, const char *comp_dir,
> -			 char **new_path)
> -{
> -	const char *prefix = symbol_conf.source_prefix;
> -
> -	if (!prefix) {
> -		if (raw_path[0] != '/' && comp_dir)
> -			/* If not an absolute path, try to use comp_dir */
> -			prefix = comp_dir;
> -		else {
> -			if (access(raw_path, R_OK) == 0) {
> -				*new_path = strdup(raw_path);
> -				return *new_path ? 0 : -ENOMEM;
> -			} else
> -				return -errno;
> -		}
> -	}
> -
> -	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
> -	if (!*new_path)
> -		return -ENOMEM;
> -
> -	for (;;) {
> -		sprintf(*new_path, "%s/%s", prefix, raw_path);
> -
> -		if (access(*new_path, R_OK) == 0)
> -			return 0;
> -
> -		if (!symbol_conf.source_prefix) {
> -			/* In case of searching comp_dir, don't retry */
> -			zfree(new_path);
> -			return -errno;
> -		}
> -
> -		switch (errno) {
> -		case ENAMETOOLONG:
> -		case ENOENT:
> -		case EROFS:
> -		case EFAULT:
> -			raw_path = strchr(++raw_path, '/');
> -			if (!raw_path) {
> -				zfree(new_path);
> -				return -ENOENT;
> -			}
> -			continue;
> -
> -		default:
> -			zfree(new_path);
> -			return -errno;
> -		}
> -	}
> -}
> -
>  #define LINEBUF_SIZE 256
>  #define NR_ADDITIONAL_LINES 2
>  
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 46f009a..0fd2df4 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
>  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
>  {
>  	int ret = 0;
> +	char *fpath;
>  
>  	if (intlist__empty(pf->lcache)) {
> +		const char *comp_dir;
> +
> +		comp_dir = cu_get_comp_dir(&pf->cu_die);
> +		ret = get_real_path(pf->fname, comp_dir, &fpath);
> +		if (ret < 0) {
> +			pr_warning("Failed to find source file path.\n");
> +			return ret;
> +		}
> +
>  		/* Matching lazy line pattern */
> -		ret = find_lazy_match_lines(pf->lcache, pf->fname,
> +		ret = find_lazy_match_lines(pf->lcache, fpath,
>  					    pf->pev->point.lazy_line);
> +		free(fpath);
>  		if (ret <= 0)
>  			return ret;
>  	}
> @@ -1616,3 +1627,61 @@ found:
>  	return (ret < 0) ? ret : lf.found;
>  }
>  
> +/*
> + * Find a src file from a DWARF tag path. Prepend optional source path prefix
> + * and chop off leading directories that do not exist. Result is passed back as
> + * a newly allocated path on success.
> + * Return 0 if file was found and readable, -errno otherwise.
> + */
> +int get_real_path(const char *raw_path, const char *comp_dir,
> +			 char **new_path)
> +{
> +	const char *prefix = symbol_conf.source_prefix;
> +
> +	if (!prefix) {
> +		if (raw_path[0] != '/' && comp_dir)
> +			/* If not an absolute path, try to use comp_dir */
> +			prefix = comp_dir;
> +		else {
> +			if (access(raw_path, R_OK) == 0) {
> +				*new_path = strdup(raw_path);
> +				return *new_path ? 0 : -ENOMEM;
> +			} else
> +				return -errno;
> +		}
> +	}
> +
> +	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
> +	if (!*new_path)
> +		return -ENOMEM;
> +
> +	for (;;) {
> +		sprintf(*new_path, "%s/%s", prefix, raw_path);
> +
> +		if (access(*new_path, R_OK) == 0)
> +			return 0;
> +
> +		if (!symbol_conf.source_prefix) {
> +			/* In case of searching comp_dir, don't retry */
> +			zfree(new_path);
> +			return -errno;
> +		}
> +
> +		switch (errno) {
> +		case ENAMETOOLONG:
> +		case ENOENT:
> +		case EROFS:
> +		case EFAULT:
> +			raw_path = strchr(++raw_path, '/');
> +			if (!raw_path) {
> +				zfree(new_path);
> +				return -ENOENT;
> +			}
> +			continue;
> +
> +		default:
> +			zfree(new_path);
> +			return -errno;
> +		}
> +	}
> +}
> diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
> index 92590b2..ebf8c8c 100644
> --- a/tools/perf/util/probe-finder.h
> +++ b/tools/perf/util/probe-finder.h
> @@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
>  					     struct variable_list **vls,
>  					     int max_points, bool externs);
>  
> +/* Find a src file from a DWARF tag path */
> +int get_real_path(const char *raw_path, const char *comp_dir,
> +			 char **new_path);
> +
>  struct probe_finder {
>  	struct perf_probe_event	*pev;		/* Target probe event */
>  
> -- 
> 2.3.1

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

* Re: [PATCH v3] perf probe: Find compilation directory path for lazy matching
  2015-04-13 23:10         ` Arnaldo Carvalho de Melo
@ 2015-04-14  6:35           ` Masami Hiramatsu
  0 siblings, 0 replies; 18+ messages in thread
From: Masami Hiramatsu @ 2015-04-14  6:35 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Naohiro Aota, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Namhyung Kim, He Kuang, Jiri Olsa, open list:PERFORMANCE EVENT...

(2015/04/14 8:10), Arnaldo Carvalho de Melo wrote:
> Em Fri, Mar 13, 2015 at 02:18:40PM +0900, Naohiro Aota escreveu:
>> If we use lazy matching, it failed to open a souce file if perf command
>> is invoked outside of compilation directory:
>>
>> $ perf probe -a '__schedule;clear_*'
>> Failed to open kernel/sched/core.c: No such file or directory
>>   Error: Failed to add events. (-2)
> 
> Masami, you mean this one, right?

Yes, this is what I meant :)

Thank you!

> 
> - Arnaldo
>  
>> OTOH, other commands like "probe -L" can solve the souce directory by
>> themselves. Let's make it possible for lazy matching too!
>>
>> Signed-off-by: Naohiro Aota <naota@elisp.net>
>> ---
>>  tools/perf/util/probe-event.c  | 59 -----------------------------------
>>  tools/perf/util/probe-finder.c | 71 +++++++++++++++++++++++++++++++++++++++++-
>>  tools/perf/util/probe-finder.h |  4 +++
>>  3 files changed, 74 insertions(+), 60 deletions(-)
>>
>> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
>> index f272a71..32a429b 100644
>> --- a/tools/perf/util/probe-event.c
>> +++ b/tools/perf/util/probe-event.c
>> @@ -648,65 +648,6 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
>>  	return ntevs;
>>  }
>>  
>> -/*
>> - * Find a src file from a DWARF tag path. Prepend optional source path prefix
>> - * and chop off leading directories that do not exist. Result is passed back as
>> - * a newly allocated path on success.
>> - * Return 0 if file was found and readable, -errno otherwise.
>> - */
>> -static int get_real_path(const char *raw_path, const char *comp_dir,
>> -			 char **new_path)
>> -{
>> -	const char *prefix = symbol_conf.source_prefix;
>> -
>> -	if (!prefix) {
>> -		if (raw_path[0] != '/' && comp_dir)
>> -			/* If not an absolute path, try to use comp_dir */
>> -			prefix = comp_dir;
>> -		else {
>> -			if (access(raw_path, R_OK) == 0) {
>> -				*new_path = strdup(raw_path);
>> -				return *new_path ? 0 : -ENOMEM;
>> -			} else
>> -				return -errno;
>> -		}
>> -	}
>> -
>> -	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
>> -	if (!*new_path)
>> -		return -ENOMEM;
>> -
>> -	for (;;) {
>> -		sprintf(*new_path, "%s/%s", prefix, raw_path);
>> -
>> -		if (access(*new_path, R_OK) == 0)
>> -			return 0;
>> -
>> -		if (!symbol_conf.source_prefix) {
>> -			/* In case of searching comp_dir, don't retry */
>> -			zfree(new_path);
>> -			return -errno;
>> -		}
>> -
>> -		switch (errno) {
>> -		case ENAMETOOLONG:
>> -		case ENOENT:
>> -		case EROFS:
>> -		case EFAULT:
>> -			raw_path = strchr(++raw_path, '/');
>> -			if (!raw_path) {
>> -				zfree(new_path);
>> -				return -ENOENT;
>> -			}
>> -			continue;
>> -
>> -		default:
>> -			zfree(new_path);
>> -			return -errno;
>> -		}
>> -	}
>> -}
>> -
>>  #define LINEBUF_SIZE 256
>>  #define NR_ADDITIONAL_LINES 2
>>  
>> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
>> index 46f009a..0fd2df4 100644
>> --- a/tools/perf/util/probe-finder.c
>> +++ b/tools/perf/util/probe-finder.c
>> @@ -849,11 +849,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
>>  static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
>>  {
>>  	int ret = 0;
>> +	char *fpath;
>>  
>>  	if (intlist__empty(pf->lcache)) {
>> +		const char *comp_dir;
>> +
>> +		comp_dir = cu_get_comp_dir(&pf->cu_die);
>> +		ret = get_real_path(pf->fname, comp_dir, &fpath);
>> +		if (ret < 0) {
>> +			pr_warning("Failed to find source file path.\n");
>> +			return ret;
>> +		}
>> +
>>  		/* Matching lazy line pattern */
>> -		ret = find_lazy_match_lines(pf->lcache, pf->fname,
>> +		ret = find_lazy_match_lines(pf->lcache, fpath,
>>  					    pf->pev->point.lazy_line);
>> +		free(fpath);
>>  		if (ret <= 0)
>>  			return ret;
>>  	}
>> @@ -1616,3 +1627,61 @@ found:
>>  	return (ret < 0) ? ret : lf.found;
>>  }
>>  
>> +/*
>> + * Find a src file from a DWARF tag path. Prepend optional source path prefix
>> + * and chop off leading directories that do not exist. Result is passed back as
>> + * a newly allocated path on success.
>> + * Return 0 if file was found and readable, -errno otherwise.
>> + */
>> +int get_real_path(const char *raw_path, const char *comp_dir,
>> +			 char **new_path)
>> +{
>> +	const char *prefix = symbol_conf.source_prefix;
>> +
>> +	if (!prefix) {
>> +		if (raw_path[0] != '/' && comp_dir)
>> +			/* If not an absolute path, try to use comp_dir */
>> +			prefix = comp_dir;
>> +		else {
>> +			if (access(raw_path, R_OK) == 0) {
>> +				*new_path = strdup(raw_path);
>> +				return *new_path ? 0 : -ENOMEM;
>> +			} else
>> +				return -errno;
>> +		}
>> +	}
>> +
>> +	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
>> +	if (!*new_path)
>> +		return -ENOMEM;
>> +
>> +	for (;;) {
>> +		sprintf(*new_path, "%s/%s", prefix, raw_path);
>> +
>> +		if (access(*new_path, R_OK) == 0)
>> +			return 0;
>> +
>> +		if (!symbol_conf.source_prefix) {
>> +			/* In case of searching comp_dir, don't retry */
>> +			zfree(new_path);
>> +			return -errno;
>> +		}
>> +
>> +		switch (errno) {
>> +		case ENAMETOOLONG:
>> +		case ENOENT:
>> +		case EROFS:
>> +		case EFAULT:
>> +			raw_path = strchr(++raw_path, '/');
>> +			if (!raw_path) {
>> +				zfree(new_path);
>> +				return -ENOENT;
>> +			}
>> +			continue;
>> +
>> +		default:
>> +			zfree(new_path);
>> +			return -errno;
>> +		}
>> +	}
>> +}
>> diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
>> index 92590b2..ebf8c8c 100644
>> --- a/tools/perf/util/probe-finder.h
>> +++ b/tools/perf/util/probe-finder.h
>> @@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
>>  					     struct variable_list **vls,
>>  					     int max_points, bool externs);
>>  
>> +/* Find a src file from a DWARF tag path */
>> +int get_real_path(const char *raw_path, const char *comp_dir,
>> +			 char **new_path);
>> +
>>  struct probe_finder {
>>  	struct perf_probe_event	*pev;		/* Target probe event */
>>  
>> -- 
>> 2.3.1
> 


-- 
Masami HIRAMATSU
Linux Technology Research Center, System Productivity Research Dept.
Center for Technology Innovation - Systems Engineering
Hitachi, Ltd., Research & Development Group
E-mail: masami.hiramatsu.pt@hitachi.com



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

* [tip:perf/urgent] perf probe: Find compilation directory path for lazy matching
  2015-03-13  5:18       ` [PATCH v3] " Naohiro Aota
  2015-03-13 12:21         ` Masami Hiramatsu
  2015-04-13 23:10         ` Arnaldo Carvalho de Melo
@ 2015-04-14 12:17         ` tip-bot for Naohiro Aota
  2 siblings, 0 replies; 18+ messages in thread
From: tip-bot for Naohiro Aota @ 2015-04-14 12:17 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: hekuang, hpa, paulus, acme, tglx, a.p.zijlstra, naota,
	linux-kernel, mingo, namhyung, jolsa, masami.hiramatsu.pt

Commit-ID:  09ed8975c4b13be4469899b210f0e0936021ee8f
Gitweb:     http://git.kernel.org/tip/09ed8975c4b13be4469899b210f0e0936021ee8f
Author:     Naohiro Aota <naota@elisp.net>
AuthorDate: Fri, 13 Mar 2015 14:18:40 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 13 Apr 2015 20:11:05 -0300

perf probe: Find compilation directory path for lazy matching

If we use lazy matching, it failed to open a souce file if perf command
is invoked outside of compilation directory:

$ perf probe -a '__schedule;clear_*'
Failed to open kernel/sched/core.c: No such file or directory
  Error: Failed to add events. (-2)

OTOH, other commands like "probe -L" can solve the souce directory by
themselves. Let's make it possible for lazy matching too!

Signed-off-by: Naohiro Aota <naota@elisp.net>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1426223923-1493-1-git-send-email-naota@elisp.net
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-event.c  | 59 -----------------------------------
 tools/perf/util/probe-finder.c | 71 +++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/probe-finder.h |  4 +++
 3 files changed, 74 insertions(+), 60 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 5483d98..d8bb616 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -655,65 +655,6 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
 	return ntevs;
 }
 
-/*
- * Find a src file from a DWARF tag path. Prepend optional source path prefix
- * and chop off leading directories that do not exist. Result is passed back as
- * a newly allocated path on success.
- * Return 0 if file was found and readable, -errno otherwise.
- */
-static int get_real_path(const char *raw_path, const char *comp_dir,
-			 char **new_path)
-{
-	const char *prefix = symbol_conf.source_prefix;
-
-	if (!prefix) {
-		if (raw_path[0] != '/' && comp_dir)
-			/* If not an absolute path, try to use comp_dir */
-			prefix = comp_dir;
-		else {
-			if (access(raw_path, R_OK) == 0) {
-				*new_path = strdup(raw_path);
-				return *new_path ? 0 : -ENOMEM;
-			} else
-				return -errno;
-		}
-	}
-
-	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
-	if (!*new_path)
-		return -ENOMEM;
-
-	for (;;) {
-		sprintf(*new_path, "%s/%s", prefix, raw_path);
-
-		if (access(*new_path, R_OK) == 0)
-			return 0;
-
-		if (!symbol_conf.source_prefix) {
-			/* In case of searching comp_dir, don't retry */
-			zfree(new_path);
-			return -errno;
-		}
-
-		switch (errno) {
-		case ENAMETOOLONG:
-		case ENOENT:
-		case EROFS:
-		case EFAULT:
-			raw_path = strchr(++raw_path, '/');
-			if (!raw_path) {
-				zfree(new_path);
-				return -ENOENT;
-			}
-			continue;
-
-		default:
-			zfree(new_path);
-			return -errno;
-		}
-	}
-}
-
 #define LINEBUF_SIZE 256
 #define NR_ADDITIONAL_LINES 2
 
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 7831e2d..ff7865c 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -855,11 +855,22 @@ static int probe_point_lazy_walker(const char *fname, int lineno,
 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
 {
 	int ret = 0;
+	char *fpath;
 
 	if (intlist__empty(pf->lcache)) {
+		const char *comp_dir;
+
+		comp_dir = cu_get_comp_dir(&pf->cu_die);
+		ret = get_real_path(pf->fname, comp_dir, &fpath);
+		if (ret < 0) {
+			pr_warning("Failed to find source file path.\n");
+			return ret;
+		}
+
 		/* Matching lazy line pattern */
-		ret = find_lazy_match_lines(pf->lcache, pf->fname,
+		ret = find_lazy_match_lines(pf->lcache, fpath,
 					    pf->pev->point.lazy_line);
+		free(fpath);
 		if (ret <= 0)
 			return ret;
 	}
@@ -1622,3 +1633,61 @@ found:
 	return (ret < 0) ? ret : lf.found;
 }
 
+/*
+ * Find a src file from a DWARF tag path. Prepend optional source path prefix
+ * and chop off leading directories that do not exist. Result is passed back as
+ * a newly allocated path on success.
+ * Return 0 if file was found and readable, -errno otherwise.
+ */
+int get_real_path(const char *raw_path, const char *comp_dir,
+			 char **new_path)
+{
+	const char *prefix = symbol_conf.source_prefix;
+
+	if (!prefix) {
+		if (raw_path[0] != '/' && comp_dir)
+			/* If not an absolute path, try to use comp_dir */
+			prefix = comp_dir;
+		else {
+			if (access(raw_path, R_OK) == 0) {
+				*new_path = strdup(raw_path);
+				return *new_path ? 0 : -ENOMEM;
+			} else
+				return -errno;
+		}
+	}
+
+	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
+	if (!*new_path)
+		return -ENOMEM;
+
+	for (;;) {
+		sprintf(*new_path, "%s/%s", prefix, raw_path);
+
+		if (access(*new_path, R_OK) == 0)
+			return 0;
+
+		if (!symbol_conf.source_prefix) {
+			/* In case of searching comp_dir, don't retry */
+			zfree(new_path);
+			return -errno;
+		}
+
+		switch (errno) {
+		case ENAMETOOLONG:
+		case ENOENT:
+		case EROFS:
+		case EFAULT:
+			raw_path = strchr(++raw_path, '/');
+			if (!raw_path) {
+				zfree(new_path);
+				return -ENOENT;
+			}
+			continue;
+
+		default:
+			zfree(new_path);
+			return -errno;
+		}
+	}
+}
diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
index 92590b2..ebf8c8c 100644
--- a/tools/perf/util/probe-finder.h
+++ b/tools/perf/util/probe-finder.h
@@ -55,6 +55,10 @@ extern int debuginfo__find_available_vars_at(struct debuginfo *dbg,
 					     struct variable_list **vls,
 					     int max_points, bool externs);
 
+/* Find a src file from a DWARF tag path */
+int get_real_path(const char *raw_path, const char *comp_dir,
+			 char **new_path);
+
 struct probe_finder {
 	struct perf_probe_event	*pev;		/* Target probe event */
 

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

end of thread, other threads:[~2015-04-14 12:19 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-26  7:12 [PATCH 1/2] perf probe: export get_real_path Naohiro Aota
2015-02-26  7:12 ` [PATCH 2/2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
2015-02-26  8:08   ` Masami Hiramatsu
2015-02-26  8:25     ` [PATCH perf/core ] [BUGFIX] perf-probe: Fix get_real_path to free allocated memory in error path Masami Hiramatsu
2015-02-26 14:46       ` Arnaldo Carvalho de Melo
2015-02-27  0:58         ` Masami Hiramatsu
2015-02-28  9:31       ` [tip:perf/core] perf probe: " tip-bot for Masami Hiramatsu
2015-02-26  7:50 ` [PATCH 1/2] perf probe: export get_real_path Masami Hiramatsu
2015-03-04  7:52 ` [PATCH v2] perf probe: Find compilation directory path for lazy matching Naohiro Aota
2015-03-04 12:34   ` Masami Hiramatsu
2015-03-11 13:30     ` Arnaldo Carvalho de Melo
2015-03-12  1:42       ` Masami Hiramatsu
2015-03-13  5:13         ` Naohiro Aota
2015-03-13  5:18       ` [PATCH v3] " Naohiro Aota
2015-03-13 12:21         ` Masami Hiramatsu
2015-04-13 23:10         ` Arnaldo Carvalho de Melo
2015-04-14  6:35           ` Masami Hiramatsu
2015-04-14 12:17         ` [tip:perf/urgent] " tip-bot for Naohiro Aota

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