Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf probe: Introduce probe_conf global configs

Introduce probe_conf global configuration parameters for probe-event and
probe-finder, and removes related parameters from APIs.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150508010330.24812.21095.stgit@localhost.localdomain
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Masami Hiramatsu and committed by
Arnaldo Carvalho de Melo
ddb2f58f 44225521

+48 -63
+7 -14
tools/perf/builtin-probe.c
··· 50 50 static struct { 51 51 int command; /* Command short_name */ 52 52 bool list_events; 53 - bool force_add; 54 - bool show_ext_vars; 55 53 bool uprobes; 56 54 bool quiet; 57 55 bool target_used; ··· 57 59 struct perf_probe_event events[MAX_PROBES]; 58 60 struct line_range line_range; 59 61 char *target; 60 - int max_probe_points; 61 62 struct strfilter *filter; 62 63 } params; 63 64 ··· 361 364 "\t\tARG:\tProbe argument (kprobe-tracer argument format.)\n", 362 365 #endif 363 366 opt_add_probe_event), 364 - OPT_BOOLEAN('f', "force", &params.force_add, "forcibly add events" 367 + OPT_BOOLEAN('f', "force", &probe_conf.force_add, "forcibly add events" 365 368 " with existing name"), 366 369 #ifdef HAVE_DWARF_SUPPORT 367 370 OPT_CALLBACK('L', "line", NULL, ··· 370 373 OPT_CALLBACK('V', "vars", NULL, 371 374 "FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT", 372 375 "Show accessible variables on PROBEDEF", opt_show_vars), 373 - OPT_BOOLEAN('\0', "externs", &params.show_ext_vars, 376 + OPT_BOOLEAN('\0', "externs", &probe_conf.show_ext_vars, 374 377 "Show external variables too (with --vars only)"), 375 378 OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name, 376 379 "file", "vmlinux pathname"), ··· 381 384 opt_set_target), 382 385 #endif 383 386 OPT__DRY_RUN(&probe_event_dry_run), 384 - OPT_INTEGER('\0', "max-probes", &params.max_probe_points, 387 + OPT_INTEGER('\0', "max-probes", &probe_conf.max_probes, 385 388 "Set how many probe points can be found for a probe."), 386 389 OPT_CALLBACK_DEFAULT('F', "funcs", NULL, "[FILTER]", 387 390 "Show potential probe-able functions.", ··· 437 440 verbose = -1; 438 441 } 439 442 440 - if (params.max_probe_points == 0) 441 - params.max_probe_points = MAX_PROBES; 443 + if (probe_conf.max_probes == 0) 444 + probe_conf.max_probes = MAX_PROBES; 442 445 443 446 /* 444 447 * Only consider the user's kernel image path if given. ··· 474 477 NULL); 475 478 476 479 ret = show_available_vars(params.events, params.nevents, 477 - params.max_probe_points, 478 - params.filter, 479 - params.show_ext_vars); 480 + params.filter); 480 481 if (ret < 0) 481 482 pr_err_with_code(" Error: Failed to show vars.", ret); 482 483 return ret; ··· 493 498 usage_with_options(probe_usage, options); 494 499 } 495 500 496 - ret = add_perf_probe_events(params.events, params.nevents, 497 - params.max_probe_points, 498 - params.force_add); 501 + ret = add_perf_probe_events(params.events, params.nevents); 499 502 if (ret < 0) { 500 503 pr_err_with_code(" Error: Failed to add events.", ret); 501 504 return ret;
+22 -31
tools/perf/util/probe-event.c
··· 51 51 #define PERFPROBE_GROUP "probe" 52 52 53 53 bool probe_event_dry_run; /* Dry run flag */ 54 + struct probe_conf probe_conf; 54 55 55 56 #define semantic_error(msg ...) pr_err("Semantic error :" msg) 56 57 ··· 600 599 601 600 /* Try to find perf_probe_event with debuginfo */ 602 601 static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 603 - struct probe_trace_event **tevs, 604 - int max_tevs) 602 + struct probe_trace_event **tevs) 605 603 { 606 604 bool need_dwarf = perf_probe_event_need_dwarf(pev); 607 605 struct perf_probe_point tmp; ··· 617 617 618 618 pr_debug("Try to find probe point from debuginfo.\n"); 619 619 /* Searching trace events corresponding to a probe event */ 620 - ntevs = debuginfo__find_trace_events(dinfo, pev, tevs, max_tevs); 620 + ntevs = debuginfo__find_trace_events(dinfo, pev, tevs); 621 621 622 622 if (ntevs == 0) { /* Not found, retry with an alternative */ 623 623 ret = get_alternative_probe_event(dinfo, pev, &tmp); 624 624 if (!ret) { 625 - ntevs = debuginfo__find_trace_events(dinfo, pev, 626 - tevs, max_tevs); 625 + ntevs = debuginfo__find_trace_events(dinfo, pev, tevs); 627 626 /* 628 627 * Write back to the original probe_event for 629 628 * setting appropriate (user given) event name ··· 820 821 821 822 static int show_available_vars_at(struct debuginfo *dinfo, 822 823 struct perf_probe_event *pev, 823 - int max_vls, struct strfilter *_filter, 824 - bool externs) 824 + struct strfilter *_filter) 825 825 { 826 826 char *buf; 827 827 int ret, i, nvars; ··· 834 836 return -EINVAL; 835 837 pr_debug("Searching variables at %s\n", buf); 836 838 837 - ret = debuginfo__find_available_vars_at(dinfo, pev, &vls, 838 - max_vls, externs); 839 + ret = debuginfo__find_available_vars_at(dinfo, pev, &vls); 839 840 if (!ret) { /* Not found, retry with an alternative */ 840 841 ret = get_alternative_probe_event(dinfo, pev, &tmp); 841 842 if (!ret) { 842 843 ret = debuginfo__find_available_vars_at(dinfo, pev, 843 - &vls, max_vls, externs); 844 + &vls); 844 845 /* Release the old probe_point */ 845 846 clear_perf_probe_point(&tmp); 846 847 } ··· 886 889 887 890 /* Show available variables on given probe point */ 888 891 int show_available_vars(struct perf_probe_event *pevs, int npevs, 889 - int max_vls, struct strfilter *_filter, bool externs) 892 + struct strfilter *_filter) 890 893 { 891 894 int i, ret = 0; 892 895 struct debuginfo *dinfo; ··· 904 907 setup_pager(); 905 908 906 909 for (i = 0; i < npevs && ret >= 0; i++) 907 - ret = show_available_vars_at(dinfo, &pevs[i], max_vls, _filter, 908 - externs); 910 + ret = show_available_vars_at(dinfo, &pevs[i], _filter); 909 911 910 912 debuginfo__delete(dinfo); 911 913 out: ··· 923 927 } 924 928 925 929 static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 926 - struct probe_trace_event **tevs __maybe_unused, 927 - int max_tevs __maybe_unused) 930 + struct probe_trace_event **tevs __maybe_unused) 928 931 { 929 932 if (perf_probe_event_need_dwarf(pev)) { 930 933 pr_warning("Debuginfo-analysis is not supported.\n"); ··· 942 947 } 943 948 944 949 int show_available_vars(struct perf_probe_event *pevs __maybe_unused, 945 - int npevs __maybe_unused, int max_vls __maybe_unused, 946 - struct strfilter *filter __maybe_unused, 947 - bool externs __maybe_unused) 950 + int npevs __maybe_unused, 951 + struct strfilter *filter __maybe_unused) 948 952 { 949 953 pr_warning("Debuginfo-analysis is not supported.\n"); 950 954 return -ENOSYS; ··· 2508 2514 * Return an error or the number of found probe_trace_event 2509 2515 */ 2510 2516 static int find_probe_trace_events_from_map(struct perf_probe_event *pev, 2511 - struct probe_trace_event **tevs, 2512 - int max_tevs) 2517 + struct probe_trace_event **tevs) 2513 2518 { 2514 2519 struct map *map = NULL; 2515 2520 struct ref_reloc_sym *reloc_sym = NULL; ··· 2535 2542 pev->target ? : "kernel"); 2536 2543 ret = -ENOENT; 2537 2544 goto out; 2538 - } else if (num_matched_functions > max_tevs) { 2545 + } else if (num_matched_functions > probe_conf.max_probes) { 2539 2546 pr_err("Too many functions matched in %s\n", 2540 2547 pev->target ? : "kernel"); 2541 2548 ret = -E2BIG; ··· 2627 2634 bool __weak arch__prefers_symtab(void) { return false; } 2628 2635 2629 2636 static int convert_to_probe_trace_events(struct perf_probe_event *pev, 2630 - struct probe_trace_event **tevs, 2631 - int max_tevs) 2637 + struct probe_trace_event **tevs) 2632 2638 { 2633 2639 int ret; 2634 2640 ··· 2641 2649 } 2642 2650 2643 2651 if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) { 2644 - ret = find_probe_trace_events_from_map(pev, tevs, max_tevs); 2652 + ret = find_probe_trace_events_from_map(pev, tevs); 2645 2653 if (ret > 0) 2646 2654 return ret; /* Found in symbol table */ 2647 2655 } 2648 2656 2649 2657 /* Convert perf_probe_event with debuginfo */ 2650 - ret = try_to_find_probe_trace_events(pev, tevs, max_tevs); 2658 + ret = try_to_find_probe_trace_events(pev, tevs); 2651 2659 if (ret != 0) 2652 2660 return ret; /* Found in debuginfo or got an error */ 2653 2661 2654 - return find_probe_trace_events_from_map(pev, tevs, max_tevs); 2662 + return find_probe_trace_events_from_map(pev, tevs); 2655 2663 } 2656 2664 2657 2665 struct __event_package { ··· 2660 2668 int ntevs; 2661 2669 }; 2662 2670 2663 - int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, 2664 - int max_tevs, bool force_add) 2671 + int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) 2665 2672 { 2666 2673 int i, j, ret; 2667 2674 struct __event_package *pkgs; ··· 2682 2691 pkgs[i].pev = &pevs[i]; 2683 2692 /* Convert with or without debuginfo */ 2684 2693 ret = convert_to_probe_trace_events(pkgs[i].pev, 2685 - &pkgs[i].tevs, 2686 - max_tevs); 2694 + &pkgs[i].tevs); 2687 2695 if (ret < 0) 2688 2696 goto end; 2689 2697 pkgs[i].ntevs = ret; ··· 2691 2701 /* Loop 2: add all events */ 2692 2702 for (i = 0; i < npevs; i++) { 2693 2703 ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, 2694 - pkgs[i].ntevs, force_add); 2704 + pkgs[i].ntevs, 2705 + probe_conf.force_add); 2695 2706 if (ret < 0) 2696 2707 break; 2697 2708 }
+9 -4
tools/perf/util/probe-event.h
··· 6 6 #include "strlist.h" 7 7 #include "strfilter.h" 8 8 9 + /* Probe related configurations */ 10 + struct probe_conf { 11 + bool show_ext_vars; 12 + bool force_add; 13 + int max_probes; 14 + }; 15 + extern struct probe_conf probe_conf; 9 16 extern bool probe_event_dry_run; 10 17 11 18 /* kprobe-tracer and uprobe-tracer tracing point */ ··· 131 124 /* Internal use: Return kernel/module path */ 132 125 extern const char *kernel_get_module_path(const char *module); 133 126 134 - extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, 135 - int max_probe_points, bool force_add); 127 + extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs); 136 128 extern int del_perf_probe_events(struct strfilter *filter); 137 129 extern int show_perf_probe_events(struct strfilter *filter); 138 130 extern int show_line_range(struct line_range *lr, const char *module, 139 131 bool user); 140 132 extern int show_available_vars(struct perf_probe_event *pevs, int npevs, 141 - int max_probe_points, struct strfilter *filter, 142 - bool externs); 133 + struct strfilter *filter); 143 134 extern int show_available_funcs(const char *module, struct strfilter *filter, 144 135 bool user); 145 136 bool arch__prefers_symtab(void);
+8 -9
tools/perf/util/probe-finder.c
··· 1214 1214 /* Find probe_trace_events specified by perf_probe_event from debuginfo */ 1215 1215 int debuginfo__find_trace_events(struct debuginfo *dbg, 1216 1216 struct perf_probe_event *pev, 1217 - struct probe_trace_event **tevs, int max_tevs) 1217 + struct probe_trace_event **tevs) 1218 1218 { 1219 1219 struct trace_event_finder tf = { 1220 1220 .pf = {.pev = pev, .callback = add_probe_trace_event}, 1221 - .mod = dbg->mod, .max_tevs = max_tevs}; 1221 + .max_tevs = probe_conf.max_probes, .mod = dbg->mod}; 1222 1222 int ret; 1223 1223 1224 1224 /* Allocate result tevs array */ 1225 - *tevs = zalloc(sizeof(struct probe_trace_event) * max_tevs); 1225 + *tevs = zalloc(sizeof(struct probe_trace_event) * tf.max_tevs); 1226 1226 if (*tevs == NULL) 1227 1227 return -ENOMEM; 1228 1228 ··· 1303 1303 die_find_child(sc_die, collect_variables_cb, (void *)af, &die_mem); 1304 1304 1305 1305 /* Find external variables */ 1306 - if (!af->externs) 1306 + if (!probe_conf.show_ext_vars) 1307 1307 goto out; 1308 - /* Don't need to search child DIE for externs. */ 1308 + /* Don't need to search child DIE for external vars. */ 1309 1309 af->child = false; 1310 1310 die_find_child(&pf->cu_die, collect_variables_cb, (void *)af, &die_mem); 1311 1311 ··· 1325 1325 */ 1326 1326 int debuginfo__find_available_vars_at(struct debuginfo *dbg, 1327 1327 struct perf_probe_event *pev, 1328 - struct variable_list **vls, 1329 - int max_vls, bool externs) 1328 + struct variable_list **vls) 1330 1329 { 1331 1330 struct available_var_finder af = { 1332 1331 .pf = {.pev = pev, .callback = add_available_vars}, 1333 1332 .mod = dbg->mod, 1334 - .max_vls = max_vls, .externs = externs}; 1333 + .max_vls = probe_conf.max_probes}; 1335 1334 int ret; 1336 1335 1337 1336 /* Allocate result vls array */ 1338 - *vls = zalloc(sizeof(struct variable_list) * max_vls); 1337 + *vls = zalloc(sizeof(struct variable_list) * af.max_vls); 1339 1338 if (*vls == NULL) 1340 1339 return -ENOMEM; 1341 1340
+2 -5
tools/perf/util/probe-finder.h
··· 40 40 /* Find probe_trace_events specified by perf_probe_event from debuginfo */ 41 41 extern int debuginfo__find_trace_events(struct debuginfo *dbg, 42 42 struct perf_probe_event *pev, 43 - struct probe_trace_event **tevs, 44 - int max_tevs); 43 + struct probe_trace_event **tevs); 45 44 46 45 /* Find a perf_probe_point from debuginfo */ 47 46 extern int debuginfo__find_probe_point(struct debuginfo *dbg, ··· 54 55 /* Find available variables */ 55 56 extern int debuginfo__find_available_vars_at(struct debuginfo *dbg, 56 57 struct perf_probe_event *pev, 57 - struct variable_list **vls, 58 - int max_points, bool externs); 58 + struct variable_list **vls); 59 59 60 60 /* Find a src file from a DWARF tag path */ 61 61 int get_real_path(const char *raw_path, const char *comp_dir, ··· 97 99 struct variable_list *vls; /* Found variable lists */ 98 100 int nvls; /* Number of variable lists */ 99 101 int max_vls; /* Max no. of variable lists */ 100 - bool externs; /* Find external vars too */ 101 102 bool child; /* Search child scopes */ 102 103 }; 103 104