diff options
author | Masami Hiramatsu <mhiramat@redhat.com> | 2010-03-16 18:05:30 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-03-17 06:32:29 -0400 |
commit | 31facc5f1ac674fbcc29f212377e589396bb934c (patch) | |
tree | b89ad49ac394299501d247efe82c3a409f74a110 /tools/perf/util | |
parent | a1d37d5285bcda07f9c0b80a2634ca20ab545297 (diff) |
perf probe: Use wrapper functions
Use wrapped functions as much as possible, to check out of
memory conditions in perf probe.
Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20100316220530.32050.53951.stgit@localhost6.localdomain6>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util')
-rw-r--r-- | tools/perf/util/probe-event.c | 46 | ||||
-rw-r--r-- | tools/perf/util/probe-finder.c | 14 |
2 files changed, 23 insertions, 37 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 7c004b6ef24f..88a3b6d75c7c 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <limits.h> | 33 | #include <limits.h> |
34 | 34 | ||
35 | #undef _GNU_SOURCE | 35 | #undef _GNU_SOURCE |
36 | #include "util.h" | ||
36 | #include "event.h" | 37 | #include "event.h" |
37 | #include "string.h" | 38 | #include "string.h" |
38 | #include "strlist.h" | 39 | #include "strlist.h" |
@@ -90,9 +91,9 @@ void parse_line_range_desc(const char *arg, struct line_range *lr) | |||
90 | if (*tmp != '\0') | 91 | if (*tmp != '\0') |
91 | semantic_error("Tailing with invalid character '%d'.", | 92 | semantic_error("Tailing with invalid character '%d'.", |
92 | *tmp); | 93 | *tmp); |
93 | tmp = strndup(arg, (ptr - arg)); | 94 | tmp = xstrndup(arg, (ptr - arg)); |
94 | } else | 95 | } else |
95 | tmp = strdup(arg); | 96 | tmp = xstrdup(arg); |
96 | 97 | ||
97 | if (strchr(tmp, '.')) | 98 | if (strchr(tmp, '.')) |
98 | lr->file = tmp; | 99 | lr->file = tmp; |
@@ -135,7 +136,7 @@ static void parse_perf_probe_probepoint(char *arg, struct probe_point *pp) | |||
135 | if (!check_event_name(arg)) | 136 | if (!check_event_name(arg)) |
136 | semantic_error("%s is bad for event name -it must " | 137 | semantic_error("%s is bad for event name -it must " |
137 | "follow C symbol-naming rule.", arg); | 138 | "follow C symbol-naming rule.", arg); |
138 | pp->event = strdup(arg); | 139 | pp->event = xstrdup(arg); |
139 | arg = tmp; | 140 | arg = tmp; |
140 | } | 141 | } |
141 | 142 | ||
@@ -147,17 +148,16 @@ static void parse_perf_probe_probepoint(char *arg, struct probe_point *pp) | |||
147 | 148 | ||
148 | /* Check arg is function or file and copy it */ | 149 | /* Check arg is function or file and copy it */ |
149 | if (strchr(arg, '.')) /* File */ | 150 | if (strchr(arg, '.')) /* File */ |
150 | pp->file = strdup(arg); | 151 | pp->file = xstrdup(arg); |
151 | else /* Function */ | 152 | else /* Function */ |
152 | pp->function = strdup(arg); | 153 | pp->function = xstrdup(arg); |
153 | DIE_IF(pp->file == NULL && pp->function == NULL); | ||
154 | 154 | ||
155 | /* Parse other options */ | 155 | /* Parse other options */ |
156 | while (ptr) { | 156 | while (ptr) { |
157 | arg = ptr; | 157 | arg = ptr; |
158 | c = nc; | 158 | c = nc; |
159 | if (c == ';') { /* Lazy pattern must be the last part */ | 159 | if (c == ';') { /* Lazy pattern must be the last part */ |
160 | pp->lazy_line = strdup(arg); | 160 | pp->lazy_line = xstrdup(arg); |
161 | break; | 161 | break; |
162 | } | 162 | } |
163 | ptr = strpbrk(arg, ";:+@%"); | 163 | ptr = strpbrk(arg, ";:+@%"); |
@@ -181,8 +181,7 @@ static void parse_perf_probe_probepoint(char *arg, struct probe_point *pp) | |||
181 | case '@': /* File name */ | 181 | case '@': /* File name */ |
182 | if (pp->file) | 182 | if (pp->file) |
183 | semantic_error("SRC@SRC is not allowed."); | 183 | semantic_error("SRC@SRC is not allowed."); |
184 | pp->file = strdup(arg); | 184 | pp->file = xstrdup(arg); |
185 | DIE_IF(pp->file == NULL); | ||
186 | break; | 185 | break; |
187 | case '%': /* Probe places */ | 186 | case '%': /* Probe places */ |
188 | if (strcmp(arg, "return") == 0) { | 187 | if (strcmp(arg, "return") == 0) { |
@@ -247,11 +246,9 @@ void parse_perf_probe_event(const char *str, struct probe_point *pp, | |||
247 | 246 | ||
248 | /* Copy arguments and ensure return probe has no C argument */ | 247 | /* Copy arguments and ensure return probe has no C argument */ |
249 | pp->nr_args = argc - 1; | 248 | pp->nr_args = argc - 1; |
250 | pp->args = zalloc(sizeof(char *) * pp->nr_args); | 249 | pp->args = xzalloc(sizeof(char *) * pp->nr_args); |
251 | for (i = 0; i < pp->nr_args; i++) { | 250 | for (i = 0; i < pp->nr_args; i++) { |
252 | pp->args[i] = strdup(argv[i + 1]); | 251 | pp->args[i] = xstrdup(argv[i + 1]); |
253 | if (!pp->args[i]) | ||
254 | die("Failed to copy argument."); | ||
255 | if (is_c_varname(pp->args[i])) { | 252 | if (is_c_varname(pp->args[i])) { |
256 | if (pp->retprobe) | 253 | if (pp->retprobe) |
257 | semantic_error("You can't specify local" | 254 | semantic_error("You can't specify local" |
@@ -299,14 +296,12 @@ void parse_trace_kprobe_event(const char *str, struct probe_point *pp) | |||
299 | pp->file = NULL; | 296 | pp->file = NULL; |
300 | 297 | ||
301 | pp->nr_args = argc - 2; | 298 | pp->nr_args = argc - 2; |
302 | pp->args = zalloc(sizeof(char *) * pp->nr_args); | 299 | pp->args = xzalloc(sizeof(char *) * pp->nr_args); |
303 | for (i = 0; i < pp->nr_args; i++) { | 300 | for (i = 0; i < pp->nr_args; i++) { |
304 | p = strchr(argv[i + 2], '='); | 301 | p = strchr(argv[i + 2], '='); |
305 | if (p) /* We don't need which register is assigned. */ | 302 | if (p) /* We don't need which register is assigned. */ |
306 | *p = '\0'; | 303 | *p = '\0'; |
307 | pp->args[i] = strdup(argv[i + 2]); | 304 | pp->args[i] = xstrdup(argv[i + 2]); |
308 | if (!pp->args[i]) | ||
309 | die("Failed to copy argument."); | ||
310 | } | 305 | } |
311 | 306 | ||
312 | argv_free(argv); | 307 | argv_free(argv); |
@@ -319,10 +314,8 @@ int synthesize_perf_probe_point(struct probe_point *pp) | |||
319 | char offs[64] = "", line[64] = ""; | 314 | char offs[64] = "", line[64] = ""; |
320 | int ret; | 315 | int ret; |
321 | 316 | ||
322 | pp->probes[0] = buf = zalloc(MAX_CMDLEN); | 317 | pp->probes[0] = buf = xzalloc(MAX_CMDLEN); |
323 | pp->found = 1; | 318 | pp->found = 1; |
324 | if (!buf) | ||
325 | die("Failed to allocate memory by zalloc."); | ||
326 | if (pp->offset) { | 319 | if (pp->offset) { |
327 | ret = e_snprintf(offs, 64, "+%d", pp->offset); | 320 | ret = e_snprintf(offs, 64, "+%d", pp->offset); |
328 | if (ret <= 0) | 321 | if (ret <= 0) |
@@ -380,9 +373,7 @@ int synthesize_trace_kprobe_event(struct probe_point *pp) | |||
380 | char *buf; | 373 | char *buf; |
381 | int i, len, ret; | 374 | int i, len, ret; |
382 | 375 | ||
383 | pp->probes[0] = buf = zalloc(MAX_CMDLEN); | 376 | pp->probes[0] = buf = xzalloc(MAX_CMDLEN); |
384 | if (!buf) | ||
385 | die("Failed to allocate memory by zalloc."); | ||
386 | ret = e_snprintf(buf, MAX_CMDLEN, "%s+%d", pp->function, pp->offset); | 377 | ret = e_snprintf(buf, MAX_CMDLEN, "%s+%d", pp->function, pp->offset); |
387 | if (ret <= 0) | 378 | if (ret <= 0) |
388 | goto error; | 379 | goto error; |
@@ -612,10 +603,9 @@ void add_trace_kprobe_events(struct probe_point *probes, int nr_probes, | |||
612 | for (j = 0; j < nr_probes; j++) { | 603 | for (j = 0; j < nr_probes; j++) { |
613 | pp = probes + j; | 604 | pp = probes + j; |
614 | if (!pp->event) | 605 | if (!pp->event) |
615 | pp->event = strdup(pp->function); | 606 | pp->event = xstrdup(pp->function); |
616 | if (!pp->group) | 607 | if (!pp->group) |
617 | pp->group = strdup(PERFPROBE_GROUP); | 608 | pp->group = xstrdup(PERFPROBE_GROUP); |
618 | DIE_IF(!pp->event || !pp->group); | ||
619 | /* If force_add is true, suffix search is allowed */ | 609 | /* If force_add is true, suffix search is allowed */ |
620 | allow_suffix = force_add; | 610 | allow_suffix = force_add; |
621 | for (i = 0; i < pp->found; i++) { | 611 | for (i = 0; i < pp->found; i++) { |
@@ -709,9 +699,7 @@ void del_trace_kprobe_events(struct strlist *dellist) | |||
709 | namelist = get_perf_event_names(fd, true); | 699 | namelist = get_perf_event_names(fd, true); |
710 | 700 | ||
711 | strlist__for_each(ent, dellist) { | 701 | strlist__for_each(ent, dellist) { |
712 | str = strdup(ent->s); | 702 | str = xstrdup(ent->s); |
713 | if (!str) | ||
714 | die("Failed to copy event."); | ||
715 | pr_debug("Parsing: %s\n", str); | 703 | pr_debug("Parsing: %s\n", str); |
716 | p = strchr(str, ':'); | 704 | p = strchr(str, ':'); |
717 | if (p) { | 705 | if (p) { |
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index c171a243d05b..e887bb6157cd 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c | |||
@@ -125,8 +125,7 @@ static void line_list__add_line(struct list_head *head, unsigned int line) | |||
125 | p = head; | 125 | p = head; |
126 | found: | 126 | found: |
127 | pr_debug("line list: add a line %u\n", line); | 127 | pr_debug("line list: add a line %u\n", line); |
128 | ln = zalloc(sizeof(struct line_node)); | 128 | ln = xzalloc(sizeof(struct line_node)); |
129 | DIE_IF(ln == NULL); | ||
130 | ln->line = line; | 129 | ln->line = line; |
131 | INIT_LIST_HEAD(&ln->list); | 130 | INIT_LIST_HEAD(&ln->list); |
132 | list_add(&ln->list, p); | 131 | list_add(&ln->list, p); |
@@ -416,7 +415,7 @@ static void show_probe_point(Dwarf_Die *sp_die, struct probe_finder *pf) | |||
416 | (unsigned long)(pf->addr - eaddr)); | 415 | (unsigned long)(pf->addr - eaddr)); |
417 | /* Copy the function name if possible */ | 416 | /* Copy the function name if possible */ |
418 | if (!pp->function) { | 417 | if (!pp->function) { |
419 | pp->function = strdup(name); | 418 | pp->function = xstrdup(name); |
420 | pp->offset = (size_t)(pf->addr - eaddr); | 419 | pp->offset = (size_t)(pf->addr - eaddr); |
421 | } | 420 | } |
422 | } else { | 421 | } else { |
@@ -425,7 +424,7 @@ static void show_probe_point(Dwarf_Die *sp_die, struct probe_finder *pf) | |||
425 | (uintmax_t)pf->addr); | 424 | (uintmax_t)pf->addr); |
426 | if (!pp->function) { | 425 | if (!pp->function) { |
427 | /* TODO: Use _stext */ | 426 | /* TODO: Use _stext */ |
428 | pp->function = strdup(""); | 427 | pp->function = xstrdup(""); |
429 | pp->offset = (size_t)pf->addr; | 428 | pp->offset = (size_t)pf->addr; |
430 | } | 429 | } |
431 | } | 430 | } |
@@ -456,7 +455,7 @@ static void show_probe_point(Dwarf_Die *sp_die, struct probe_finder *pf) | |||
456 | if (pp->found == MAX_PROBES) | 455 | if (pp->found == MAX_PROBES) |
457 | die("Too many( > %d) probe point found.\n", MAX_PROBES); | 456 | die("Too many( > %d) probe point found.\n", MAX_PROBES); |
458 | 457 | ||
459 | pp->probes[pp->found] = strdup(tmp); | 458 | pp->probes[pp->found] = xstrdup(tmp); |
460 | pp->found++; | 459 | pp->found++; |
461 | } | 460 | } |
462 | 461 | ||
@@ -506,8 +505,7 @@ static int find_lazy_match_lines(struct list_head *head, | |||
506 | if (fd < 0) | 505 | if (fd < 0) |
507 | die("failed to open %s", fname); | 506 | die("failed to open %s", fname); |
508 | DIE_IF(fstat(fd, &st) < 0); | 507 | DIE_IF(fstat(fd, &st) < 0); |
509 | fbuf = malloc(st.st_size + 2); | 508 | fbuf = xmalloc(st.st_size + 2); |
510 | DIE_IF(fbuf == NULL); | ||
511 | DIE_IF(read(fd, fbuf, st.st_size) < 0); | 509 | DIE_IF(read(fd, fbuf, st.st_size) < 0); |
512 | close(fd); | 510 | close(fd); |
513 | fbuf[st.st_size] = '\n'; /* Dummy line */ | 511 | fbuf[st.st_size] = '\n'; /* Dummy line */ |
@@ -727,7 +725,7 @@ static void find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf) | |||
727 | 725 | ||
728 | /* Copy real path */ | 726 | /* Copy real path */ |
729 | if (!lf->lr->path) | 727 | if (!lf->lr->path) |
730 | lf->lr->path = strdup(src); | 728 | lf->lr->path = xstrdup(src); |
731 | line_list__add_line(&lf->lr->line_list, (unsigned int)lineno); | 729 | line_list__add_line(&lf->lr->line_list, (unsigned int)lineno); |
732 | } | 730 | } |
733 | /* Update status */ | 731 | /* Update status */ |