Re: [PATCH perf/core v5 04/15] perf probe: Add --cache option to cache the probe definitions
On Thu, 28 Apr 2016 11:12:19 +0900 Namhyung Kimwrote: > 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
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
On Thu, 28 Apr 2016 11:32:18 +0900 Namhyung Kimwrote: > 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
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
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
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
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
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
From: Masami HiramatsuAdd --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
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