Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-28 Thread Masami Hiramatsu
On Thu, 28 Apr 2016 11:12:19 +0900
Namhyung Kim  wrote:

> On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> > From: Masami Hiramatsu 
> > 
> > Add --cache option to cache the probe definitions. This
> > just saves the result of the dwarf analysis to probe cache.
> > 
> > Signed-off-by: Masami Hiramatsu 
> > Signed-off-by: Masami Hiramatsu 
> > ---
> >  Changes in v5:
> >   - Move probe_cache* definitions. (code cleanup)
> > 
> >  Changes in v4:
> >   - Remove cache saving failure message.
> > ---
> 
> [snip]
> > +static int probe_cache__load(struct probe_cache *pcache)
> > +{
> > +   struct probe_cache_entry *entry = NULL;
> > +   char buf[MAX_CMDLEN], *p;
> > +   int ret = 0;
> > +   FILE *fp;
> > +
> > +   fp = fdopen(dup(pcache->fd), "r");
> > +   while (!feof(fp)) {
> > +   if (!fgets(buf, MAX_CMDLEN, fp))
> > +   break;
> > +   p = strchr(buf, '\n');
> > +   if (p)
> > +   *p = '\0';
> > +   if (buf[0] == '#') {/* #perf_probe_event */
> > +   entry = probe_cache_entry__new(NULL);
> 
> The probe_cache_entry__new() can fail.

Good catch!

> 
> Thanks,
> Namhyung
> 
> 
> > +   entry->spev = strdup(buf + 1);

Moreover, if this strdup fail, this goes to return but retvalue is 0...

I'll fix this too.

Thank you!

-- 
Masami Hiramatsu 


Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-28 Thread Masami Hiramatsu
On Thu, 28 Apr 2016 11:12:19 +0900
Namhyung Kim  wrote:

> On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> > From: Masami Hiramatsu 
> > 
> > Add --cache option to cache the probe definitions. This
> > just saves the result of the dwarf analysis to probe cache.
> > 
> > Signed-off-by: Masami Hiramatsu 
> > Signed-off-by: Masami Hiramatsu 
> > ---
> >  Changes in v5:
> >   - Move probe_cache* definitions. (code cleanup)
> > 
> >  Changes in v4:
> >   - Remove cache saving failure message.
> > ---
> 
> [snip]
> > +static int probe_cache__load(struct probe_cache *pcache)
> > +{
> > +   struct probe_cache_entry *entry = NULL;
> > +   char buf[MAX_CMDLEN], *p;
> > +   int ret = 0;
> > +   FILE *fp;
> > +
> > +   fp = fdopen(dup(pcache->fd), "r");
> > +   while (!feof(fp)) {
> > +   if (!fgets(buf, MAX_CMDLEN, fp))
> > +   break;
> > +   p = strchr(buf, '\n');
> > +   if (p)
> > +   *p = '\0';
> > +   if (buf[0] == '#') {/* #perf_probe_event */
> > +   entry = probe_cache_entry__new(NULL);
> 
> The probe_cache_entry__new() can fail.

Good catch!

> 
> Thanks,
> Namhyung
> 
> 
> > +   entry->spev = strdup(buf + 1);

Moreover, if this strdup fail, this goes to return but retvalue is 0...

I'll fix this too.

Thank you!

-- 
Masami Hiramatsu 


Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-28 Thread Masami Hiramatsu
On Thu, 28 Apr 2016 11:32:18 +0900
Namhyung Kim  wrote:

> On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> > From: Masami Hiramatsu 
> > 
> > Add --cache option to cache the probe definitions. This
> > just saves the result of the dwarf analysis to probe cache.
> > 
> > Signed-off-by: Masami Hiramatsu 
> > Signed-off-by: Masami Hiramatsu 
> > ---
> >  Changes in v5:
> >   - Move probe_cache* definitions. (code cleanup)
> > 
> >  Changes in v4:
> >   - Remove cache saving failure message.
> > ---
> 
> [SNIP]
> > +/* For the kernel probe caches, pass target = NULL */
> > +static int probe_cache__open(struct probe_cache *pcache, const char 
> > *target)
> > +{
> > +   char cpath[PATH_MAX];
> > +   char sbuildid[SBUILD_ID_SIZE];
> > +   char *dir_name;
> > +   bool is_kallsyms = !target;
> > +   int ret, fd;
> > +
> > +   if (target)
> > +   ret = filename__sprintf_build_id(target, sbuildid);
> > +   else {
> > +   target = "[kernel.kallsyms]";
> > +   ret = sysfs__sprintf_build_id("/", sbuildid);
> > +   }
> > +   if (ret < 0) {
> > +   pr_debug("Failed to get build-id from %s.\n", target ?: 
> > "kernel");
> > +   return ret;
> > +   }
> > +
> > +   /* If we have no buildid cache, make it */
> > +   if (!build_id_cache__cached(sbuildid)) {
> > +   ret = build_id_cache__add_s(sbuildid, target,
> > +   is_kallsyms, NULL);
> > +   if (ret < 0) {
> > +   pr_debug("Failed to add build-id cache: %s\n", target);
> > +   return ret;
> > +   }
> > +   }
> > +
> > +   dir_name = build_id_cache__dirname_from_path(sbuildid, target,
> > +is_kallsyms, false);
> > +   if (!dir_name)
> > +   return -ENOMEM;
> > +
> > +   snprintf(cpath, PATH_MAX, "%s/probes", dir_name);
> > +   fd = open(cpath, O_CREAT | O_RDWR | O_APPEND, 0644);
> > +   if (fd < 0)
> > +   pr_debug("Failed to open cache(%d): %s\n", fd, cpath);
> > +   free(dir_name);
> > +   pcache->fd = fd;
> > +
> > +   return fd;
> > +}
> 
> [SNIP]
> > +
> > +int probe_cache__commit(struct probe_cache *pcache)
> > +{
> > +   struct probe_cache_entry *entry;
> > +   int ret = 0;
> > +
> > +   /* TBD: if we do not update existing entries, skip it */
> > +   ret = lseek(pcache->fd, 0, SEEK_SET);
> > +   if (ret < 0)
> > +   goto out;
> > +
> > +   ret = ftruncate(pcache->fd, 0);
> > +   if (ret < 0)
> > +   goto out;
> 
> What is this doing?  Does it truncate old contents on write?  Opening
> with O_APPEND looks strange to me..

Ah, right. I forget the reason why :(, but I guess it maybe because just
changing the design while coding.
I'll remove O_APPEND flag then.

Thank you!

-- 
Masami Hiramatsu 


Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-28 Thread Masami Hiramatsu
On Thu, 28 Apr 2016 11:32:18 +0900
Namhyung Kim  wrote:

> On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> > From: Masami Hiramatsu 
> > 
> > Add --cache option to cache the probe definitions. This
> > just saves the result of the dwarf analysis to probe cache.
> > 
> > Signed-off-by: Masami Hiramatsu 
> > Signed-off-by: Masami Hiramatsu 
> > ---
> >  Changes in v5:
> >   - Move probe_cache* definitions. (code cleanup)
> > 
> >  Changes in v4:
> >   - Remove cache saving failure message.
> > ---
> 
> [SNIP]
> > +/* For the kernel probe caches, pass target = NULL */
> > +static int probe_cache__open(struct probe_cache *pcache, const char 
> > *target)
> > +{
> > +   char cpath[PATH_MAX];
> > +   char sbuildid[SBUILD_ID_SIZE];
> > +   char *dir_name;
> > +   bool is_kallsyms = !target;
> > +   int ret, fd;
> > +
> > +   if (target)
> > +   ret = filename__sprintf_build_id(target, sbuildid);
> > +   else {
> > +   target = "[kernel.kallsyms]";
> > +   ret = sysfs__sprintf_build_id("/", sbuildid);
> > +   }
> > +   if (ret < 0) {
> > +   pr_debug("Failed to get build-id from %s.\n", target ?: 
> > "kernel");
> > +   return ret;
> > +   }
> > +
> > +   /* If we have no buildid cache, make it */
> > +   if (!build_id_cache__cached(sbuildid)) {
> > +   ret = build_id_cache__add_s(sbuildid, target,
> > +   is_kallsyms, NULL);
> > +   if (ret < 0) {
> > +   pr_debug("Failed to add build-id cache: %s\n", target);
> > +   return ret;
> > +   }
> > +   }
> > +
> > +   dir_name = build_id_cache__dirname_from_path(sbuildid, target,
> > +is_kallsyms, false);
> > +   if (!dir_name)
> > +   return -ENOMEM;
> > +
> > +   snprintf(cpath, PATH_MAX, "%s/probes", dir_name);
> > +   fd = open(cpath, O_CREAT | O_RDWR | O_APPEND, 0644);
> > +   if (fd < 0)
> > +   pr_debug("Failed to open cache(%d): %s\n", fd, cpath);
> > +   free(dir_name);
> > +   pcache->fd = fd;
> > +
> > +   return fd;
> > +}
> 
> [SNIP]
> > +
> > +int probe_cache__commit(struct probe_cache *pcache)
> > +{
> > +   struct probe_cache_entry *entry;
> > +   int ret = 0;
> > +
> > +   /* TBD: if we do not update existing entries, skip it */
> > +   ret = lseek(pcache->fd, 0, SEEK_SET);
> > +   if (ret < 0)
> > +   goto out;
> > +
> > +   ret = ftruncate(pcache->fd, 0);
> > +   if (ret < 0)
> > +   goto out;
> 
> What is this doing?  Does it truncate old contents on write?  Opening
> with O_APPEND looks strange to me..

Ah, right. I forget the reason why :(, but I guess it maybe because just
changing the design while coding.
I'll remove O_APPEND flag then.

Thank you!

-- 
Masami Hiramatsu 


Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-27 Thread Namhyung Kim
On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> From: Masami Hiramatsu 
> 
> Add --cache option to cache the probe definitions. This
> just saves the result of the dwarf analysis to probe cache.
> 
> Signed-off-by: Masami Hiramatsu 
> Signed-off-by: Masami Hiramatsu 
> ---
>  Changes in v5:
>   - Move probe_cache* definitions. (code cleanup)
> 
>  Changes in v4:
>   - Remove cache saving failure message.
> ---

[SNIP]
> +/* For the kernel probe caches, pass target = NULL */
> +static int probe_cache__open(struct probe_cache *pcache, const char *target)
> +{
> + char cpath[PATH_MAX];
> + char sbuildid[SBUILD_ID_SIZE];
> + char *dir_name;
> + bool is_kallsyms = !target;
> + int ret, fd;
> +
> + if (target)
> + ret = filename__sprintf_build_id(target, sbuildid);
> + else {
> + target = "[kernel.kallsyms]";
> + ret = sysfs__sprintf_build_id("/", sbuildid);
> + }
> + if (ret < 0) {
> + pr_debug("Failed to get build-id from %s.\n", target ?: 
> "kernel");
> + return ret;
> + }
> +
> + /* If we have no buildid cache, make it */
> + if (!build_id_cache__cached(sbuildid)) {
> + ret = build_id_cache__add_s(sbuildid, target,
> + is_kallsyms, NULL);
> + if (ret < 0) {
> + pr_debug("Failed to add build-id cache: %s\n", target);
> + return ret;
> + }
> + }
> +
> + dir_name = build_id_cache__dirname_from_path(sbuildid, target,
> +  is_kallsyms, false);
> + if (!dir_name)
> + return -ENOMEM;
> +
> + snprintf(cpath, PATH_MAX, "%s/probes", dir_name);
> + fd = open(cpath, O_CREAT | O_RDWR | O_APPEND, 0644);
> + if (fd < 0)
> + pr_debug("Failed to open cache(%d): %s\n", fd, cpath);
> + free(dir_name);
> + pcache->fd = fd;
> +
> + return fd;
> +}

[SNIP]
> +
> +int probe_cache__commit(struct probe_cache *pcache)
> +{
> + struct probe_cache_entry *entry;
> + int ret = 0;
> +
> + /* TBD: if we do not update existing entries, skip it */
> + ret = lseek(pcache->fd, 0, SEEK_SET);
> + if (ret < 0)
> + goto out;
> +
> + ret = ftruncate(pcache->fd, 0);
> + if (ret < 0)
> + goto out;

What is this doing?  Does it truncate old contents on write?  Opening
with O_APPEND looks strange to me..

Thanks,
Namhyung


> +
> + list_for_each_entry(entry, >list, list) {
> + ret = probe_cache_entry__write(entry, pcache->fd);
> + pr_debug("Cache committed: %d\n", ret);
> + if (ret < 0)
> + break;
> + }
> +out:
> + return ret;
> +}
> diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
> index 18ac9cf..d2b8791d 100644
> --- a/tools/perf/util/probe-file.h
> +++ b/tools/perf/util/probe-file.h
> @@ -5,6 +5,19 @@
>  #include "strfilter.h"
>  #include "probe-event.h"
>  
> +/* Cache of probe definitions */
> +struct probe_cache_entry {
> + struct list_headlist;
> + struct perf_probe_event pev;
> + char*spev;
> + struct strlist  *tevlist;
> +};
> +
> +struct probe_cache {
> + int fd;
> + struct list_head list;
> +};
> +
>  #define PF_FL_UPROBE 1
>  #define PF_FL_RW 2
>  
> @@ -18,5 +31,11 @@ int probe_file__get_events(int fd, struct strfilter 
> *filter,
> struct strlist *plist);
>  int probe_file__del_strlist(int fd, struct strlist *namelist);
>  
> +struct probe_cache *probe_cache__new(const char *target);
> +int probe_cache__add_entry(struct probe_cache *pcache,
> +struct perf_probe_event *pev,
> +struct probe_trace_event *tevs, int ntevs);
> +int probe_cache__commit(struct probe_cache *pcache);
> +void probe_cache__delete(struct probe_cache *pcache);
>  
>  #endif
> 


Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-27 Thread Namhyung Kim
On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> From: Masami Hiramatsu 
> 
> Add --cache option to cache the probe definitions. This
> just saves the result of the dwarf analysis to probe cache.
> 
> Signed-off-by: Masami Hiramatsu 
> Signed-off-by: Masami Hiramatsu 
> ---
>  Changes in v5:
>   - Move probe_cache* definitions. (code cleanup)
> 
>  Changes in v4:
>   - Remove cache saving failure message.
> ---

[SNIP]
> +/* For the kernel probe caches, pass target = NULL */
> +static int probe_cache__open(struct probe_cache *pcache, const char *target)
> +{
> + char cpath[PATH_MAX];
> + char sbuildid[SBUILD_ID_SIZE];
> + char *dir_name;
> + bool is_kallsyms = !target;
> + int ret, fd;
> +
> + if (target)
> + ret = filename__sprintf_build_id(target, sbuildid);
> + else {
> + target = "[kernel.kallsyms]";
> + ret = sysfs__sprintf_build_id("/", sbuildid);
> + }
> + if (ret < 0) {
> + pr_debug("Failed to get build-id from %s.\n", target ?: 
> "kernel");
> + return ret;
> + }
> +
> + /* If we have no buildid cache, make it */
> + if (!build_id_cache__cached(sbuildid)) {
> + ret = build_id_cache__add_s(sbuildid, target,
> + is_kallsyms, NULL);
> + if (ret < 0) {
> + pr_debug("Failed to add build-id cache: %s\n", target);
> + return ret;
> + }
> + }
> +
> + dir_name = build_id_cache__dirname_from_path(sbuildid, target,
> +  is_kallsyms, false);
> + if (!dir_name)
> + return -ENOMEM;
> +
> + snprintf(cpath, PATH_MAX, "%s/probes", dir_name);
> + fd = open(cpath, O_CREAT | O_RDWR | O_APPEND, 0644);
> + if (fd < 0)
> + pr_debug("Failed to open cache(%d): %s\n", fd, cpath);
> + free(dir_name);
> + pcache->fd = fd;
> +
> + return fd;
> +}

[SNIP]
> +
> +int probe_cache__commit(struct probe_cache *pcache)
> +{
> + struct probe_cache_entry *entry;
> + int ret = 0;
> +
> + /* TBD: if we do not update existing entries, skip it */
> + ret = lseek(pcache->fd, 0, SEEK_SET);
> + if (ret < 0)
> + goto out;
> +
> + ret = ftruncate(pcache->fd, 0);
> + if (ret < 0)
> + goto out;

What is this doing?  Does it truncate old contents on write?  Opening
with O_APPEND looks strange to me..

Thanks,
Namhyung


> +
> + list_for_each_entry(entry, >list, list) {
> + ret = probe_cache_entry__write(entry, pcache->fd);
> + pr_debug("Cache committed: %d\n", ret);
> + if (ret < 0)
> + break;
> + }
> +out:
> + return ret;
> +}
> diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
> index 18ac9cf..d2b8791d 100644
> --- a/tools/perf/util/probe-file.h
> +++ b/tools/perf/util/probe-file.h
> @@ -5,6 +5,19 @@
>  #include "strfilter.h"
>  #include "probe-event.h"
>  
> +/* Cache of probe definitions */
> +struct probe_cache_entry {
> + struct list_headlist;
> + struct perf_probe_event pev;
> + char*spev;
> + struct strlist  *tevlist;
> +};
> +
> +struct probe_cache {
> + int fd;
> + struct list_head list;
> +};
> +
>  #define PF_FL_UPROBE 1
>  #define PF_FL_RW 2
>  
> @@ -18,5 +31,11 @@ int probe_file__get_events(int fd, struct strfilter 
> *filter,
> struct strlist *plist);
>  int probe_file__del_strlist(int fd, struct strlist *namelist);
>  
> +struct probe_cache *probe_cache__new(const char *target);
> +int probe_cache__add_entry(struct probe_cache *pcache,
> +struct perf_probe_event *pev,
> +struct probe_trace_event *tevs, int ntevs);
> +int probe_cache__commit(struct probe_cache *pcache);
> +void probe_cache__delete(struct probe_cache *pcache);
>  
>  #endif
> 


Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-27 Thread Namhyung Kim
On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> From: Masami Hiramatsu 
> 
> Add --cache option to cache the probe definitions. This
> just saves the result of the dwarf analysis to probe cache.
> 
> Signed-off-by: Masami Hiramatsu 
> Signed-off-by: Masami Hiramatsu 
> ---
>  Changes in v5:
>   - Move probe_cache* definitions. (code cleanup)
> 
>  Changes in v4:
>   - Remove cache saving failure message.
> ---

[snip]
> +static int probe_cache__load(struct probe_cache *pcache)
> +{
> + struct probe_cache_entry *entry = NULL;
> + char buf[MAX_CMDLEN], *p;
> + int ret = 0;
> + FILE *fp;
> +
> + fp = fdopen(dup(pcache->fd), "r");
> + while (!feof(fp)) {
> + if (!fgets(buf, MAX_CMDLEN, fp))
> + break;
> + p = strchr(buf, '\n');
> + if (p)
> + *p = '\0';
> + if (buf[0] == '#') {/* #perf_probe_event */
> + entry = probe_cache_entry__new(NULL);

The probe_cache_entry__new() can fail.

Thanks,
Namhyung


> + entry->spev = strdup(buf + 1);
> + ret = parse_perf_probe_command(buf + 1, >pev);
> + if (!entry->spev || ret < 0) {
> + probe_cache_entry__delete(entry);
> + goto out;
> + }
> + list_add_tail(>list, >list);
> + } else {/* trace_probe_event */
> + if (!entry) {
> + ret = -EINVAL;
> + goto out;
> + }
> + strlist__add(entry->tevlist, buf);
> + }
> + }
> +out:
> + fclose(fp);
> + return ret;
> +}


Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-27 Thread Namhyung Kim
On Thu, Apr 28, 2016 at 03:37:42AM +0900, Masami Hiramatsu wrote:
> From: Masami Hiramatsu 
> 
> Add --cache option to cache the probe definitions. This
> just saves the result of the dwarf analysis to probe cache.
> 
> Signed-off-by: Masami Hiramatsu 
> Signed-off-by: Masami Hiramatsu 
> ---
>  Changes in v5:
>   - Move probe_cache* definitions. (code cleanup)
> 
>  Changes in v4:
>   - Remove cache saving failure message.
> ---

[snip]
> +static int probe_cache__load(struct probe_cache *pcache)
> +{
> + struct probe_cache_entry *entry = NULL;
> + char buf[MAX_CMDLEN], *p;
> + int ret = 0;
> + FILE *fp;
> +
> + fp = fdopen(dup(pcache->fd), "r");
> + while (!feof(fp)) {
> + if (!fgets(buf, MAX_CMDLEN, fp))
> + break;
> + p = strchr(buf, '\n');
> + if (p)
> + *p = '\0';
> + if (buf[0] == '#') {/* #perf_probe_event */
> + entry = probe_cache_entry__new(NULL);

The probe_cache_entry__new() can fail.

Thanks,
Namhyung


> + entry->spev = strdup(buf + 1);
> + ret = parse_perf_probe_command(buf + 1, >pev);
> + if (!entry->spev || ret < 0) {
> + probe_cache_entry__delete(entry);
> + goto out;
> + }
> + list_add_tail(>list, >list);
> + } else {/* trace_probe_event */
> + if (!entry) {
> + ret = -EINVAL;
> + goto out;
> + }
> + strlist__add(entry->tevlist, buf);
> + }
> + }
> +out:
> + fclose(fp);
> + return ret;
> +}


[PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-27 Thread Masami Hiramatsu
From: Masami Hiramatsu 

Add --cache option to cache the probe definitions. This
just saves the result of the dwarf analysis to probe cache.

Signed-off-by: Masami Hiramatsu 
Signed-off-by: Masami Hiramatsu 
---
 Changes in v5:
  - Move probe_cache* definitions. (code cleanup)

 Changes in v4:
  - Remove cache saving failure message.
---
 tools/perf/Documentation/perf-probe.txt |4 
 tools/perf/builtin-probe.c  |1 
 tools/perf/util/build-id.c  |   13 +
 tools/perf/util/build-id.h  |2 
 tools/perf/util/probe-event.c   |  126 +++--
 tools/perf/util/probe-event.h   |5 +
 tools/perf/util/probe-file.c|  299 +++
 tools/perf/util/probe-file.h|   19 ++
 8 files changed, 441 insertions(+), 28 deletions(-)

diff --git a/tools/perf/Documentation/perf-probe.txt 
b/tools/perf/Documentation/perf-probe.txt
index 3a8a9ba..947db6f 100644
--- a/tools/perf/Documentation/perf-probe.txt
+++ b/tools/perf/Documentation/perf-probe.txt
@@ -109,6 +109,10 @@ OPTIONS
Dry run. With this option, --add and --del doesn't execute actual
adding and removal operations.
 
+--cache::
+   Cache the probes (with --add option). Any events which successfully 
added
+   are also stored in the cache file.
+
 --max-probes=NUM::
Set the maximum number of probe points for an event. Default is 128.
 
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 9af859b..6d7ab431 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -512,6 +512,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix 
__maybe_unused)
"Enable symbol demangling"),
OPT_BOOLEAN(0, "demangle-kernel", _conf.demangle_kernel,
"Enable kernel symbol demangling"),
+   OPT_BOOLEAN(0, "cache", _conf.cache, "Manipulate probe cache"),
OPT_END()
};
int ret;
diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
index 848e05f..588ff01 100644
--- a/tools/perf/util/build-id.c
+++ b/tools/perf/util/build-id.c
@@ -371,9 +371,8 @@ void disable_buildid_cache(void)
no_buildid_cache = true;
 }
 
-static char *build_id_cache__dirname_from_path(const char *name,
-  bool is_kallsyms, bool is_vdso,
-  const char *sbuild_id)
+char *build_id_cache__dirname_from_path(const char *sbuild_id, const char 
*name,
+   bool is_kallsyms, bool is_vdso)
 {
char *realname = (char *)name, *filename;
bool slash = is_kallsyms || is_vdso;
@@ -402,8 +401,8 @@ int build_id_cache__list_build_ids(const char *pathname,
char *dir_name;
int ret = 0;
 
-   dir_name = build_id_cache__dirname_from_path(pathname, false, false,
-NULL);
+   dir_name = build_id_cache__dirname_from_path(NULL, pathname,
+false, false);
if (!dir_name)
return -ENOMEM;
 
@@ -430,8 +429,8 @@ int build_id_cache__add_s(const char *sbuild_id, const char 
*name,
goto out_free;
}
 
-   dir_name = build_id_cache__dirname_from_path(name, is_kallsyms,
-is_vdso, sbuild_id);
+   dir_name = build_id_cache__dirname_from_path(sbuild_id, name,
+is_kallsyms, is_vdso);
if (!dir_name)
goto out_free;
 
diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h
index 64af3e2..1841524 100644
--- a/tools/perf/util/build-id.h
+++ b/tools/perf/util/build-id.h
@@ -28,6 +28,8 @@ bool perf_session__read_build_ids(struct perf_session 
*session, bool with_hits);
 int perf_session__write_buildid_table(struct perf_session *session, int fd);
 int perf_session__cache_build_ids(struct perf_session *session);
 
+char *build_id_cache__dirname_from_path(const char *sbuild_id, const char 
*name,
+   bool is_kallsyms, bool is_vdso);
 int build_id_cache__list_build_ids(const char *pathname,
   struct strlist **result);
 bool build_id_cache__cached(const char *sbuild_id);
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 85d82f4..dc0265e 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -67,7 +67,6 @@ int e_snprintf(char *str, size_t size, const char *format, 
...)
return ret;
 }
 
-static char *synthesize_perf_probe_point(struct perf_probe_point *pp);
 static struct machine *host_machine;
 
 /* Initialize symbol maps and path of vmlinux/modules */
@@ -1703,7 +1702,7 @@ char *synthesize_perf_probe_arg(struct 

[PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions

2016-04-27 Thread Masami Hiramatsu
From: Masami Hiramatsu 

Add --cache option to cache the probe definitions. This
just saves the result of the dwarf analysis to probe cache.

Signed-off-by: Masami Hiramatsu 
Signed-off-by: Masami Hiramatsu 
---
 Changes in v5:
  - Move probe_cache* definitions. (code cleanup)

 Changes in v4:
  - Remove cache saving failure message.
---
 tools/perf/Documentation/perf-probe.txt |4 
 tools/perf/builtin-probe.c  |1 
 tools/perf/util/build-id.c  |   13 +
 tools/perf/util/build-id.h  |2 
 tools/perf/util/probe-event.c   |  126 +++--
 tools/perf/util/probe-event.h   |5 +
 tools/perf/util/probe-file.c|  299 +++
 tools/perf/util/probe-file.h|   19 ++
 8 files changed, 441 insertions(+), 28 deletions(-)

diff --git a/tools/perf/Documentation/perf-probe.txt 
b/tools/perf/Documentation/perf-probe.txt
index 3a8a9ba..947db6f 100644
--- a/tools/perf/Documentation/perf-probe.txt
+++ b/tools/perf/Documentation/perf-probe.txt
@@ -109,6 +109,10 @@ OPTIONS
Dry run. With this option, --add and --del doesn't execute actual
adding and removal operations.
 
+--cache::
+   Cache the probes (with --add option). Any events which successfully 
added
+   are also stored in the cache file.
+
 --max-probes=NUM::
Set the maximum number of probe points for an event. Default is 128.
 
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 9af859b..6d7ab431 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -512,6 +512,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix 
__maybe_unused)
"Enable symbol demangling"),
OPT_BOOLEAN(0, "demangle-kernel", _conf.demangle_kernel,
"Enable kernel symbol demangling"),
+   OPT_BOOLEAN(0, "cache", _conf.cache, "Manipulate probe cache"),
OPT_END()
};
int ret;
diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
index 848e05f..588ff01 100644
--- a/tools/perf/util/build-id.c
+++ b/tools/perf/util/build-id.c
@@ -371,9 +371,8 @@ void disable_buildid_cache(void)
no_buildid_cache = true;
 }
 
-static char *build_id_cache__dirname_from_path(const char *name,
-  bool is_kallsyms, bool is_vdso,
-  const char *sbuild_id)
+char *build_id_cache__dirname_from_path(const char *sbuild_id, const char 
*name,
+   bool is_kallsyms, bool is_vdso)
 {
char *realname = (char *)name, *filename;
bool slash = is_kallsyms || is_vdso;
@@ -402,8 +401,8 @@ int build_id_cache__list_build_ids(const char *pathname,
char *dir_name;
int ret = 0;
 
-   dir_name = build_id_cache__dirname_from_path(pathname, false, false,
-NULL);
+   dir_name = build_id_cache__dirname_from_path(NULL, pathname,
+false, false);
if (!dir_name)
return -ENOMEM;
 
@@ -430,8 +429,8 @@ int build_id_cache__add_s(const char *sbuild_id, const char 
*name,
goto out_free;
}
 
-   dir_name = build_id_cache__dirname_from_path(name, is_kallsyms,
-is_vdso, sbuild_id);
+   dir_name = build_id_cache__dirname_from_path(sbuild_id, name,
+is_kallsyms, is_vdso);
if (!dir_name)
goto out_free;
 
diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h
index 64af3e2..1841524 100644
--- a/tools/perf/util/build-id.h
+++ b/tools/perf/util/build-id.h
@@ -28,6 +28,8 @@ bool perf_session__read_build_ids(struct perf_session 
*session, bool with_hits);
 int perf_session__write_buildid_table(struct perf_session *session, int fd);
 int perf_session__cache_build_ids(struct perf_session *session);
 
+char *build_id_cache__dirname_from_path(const char *sbuild_id, const char 
*name,
+   bool is_kallsyms, bool is_vdso);
 int build_id_cache__list_build_ids(const char *pathname,
   struct strlist **result);
 bool build_id_cache__cached(const char *sbuild_id);
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 85d82f4..dc0265e 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -67,7 +67,6 @@ int e_snprintf(char *str, size_t size, const char *format, 
...)
return ret;
 }
 
-static char *synthesize_perf_probe_point(struct perf_probe_point *pp);
 static struct machine *host_machine;
 
 /* Initialize symbol maps and path of vmlinux/modules */
@@ -1703,7 +1702,7 @@ char *synthesize_perf_probe_arg(struct perf_probe_arg *pa)
 }
 
 /* Compose only probe point (not argument) */
-static char