diff options
Diffstat (limited to 'tools/perf/util/probe-file.c')
| -rw-r--r-- | tools/perf/util/probe-file.c | 77 |
1 files changed, 44 insertions, 33 deletions
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index 1a62daceb028..1542cd0d6799 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c | |||
| @@ -877,35 +877,33 @@ int probe_cache__show_all_caches(struct strfilter *filter) | |||
| 877 | return 0; | 877 | return 0; |
| 878 | } | 878 | } |
| 879 | 879 | ||
| 880 | enum ftrace_readme { | ||
| 881 | FTRACE_README_PROBE_TYPE_X = 0, | ||
| 882 | FTRACE_README_KRETPROBE_OFFSET, | ||
| 883 | FTRACE_README_END, | ||
| 884 | }; | ||
| 885 | |||
| 880 | static struct { | 886 | static struct { |
| 881 | const char *pattern; | 887 | const char *pattern; |
| 882 | bool avail; | 888 | bool avail; |
| 883 | bool checked; | 889 | } ftrace_readme_table[] = { |
| 884 | } probe_type_table[] = { | 890 | #define DEFINE_TYPE(idx, pat) \ |
| 885 | #define DEFINE_TYPE(idx, pat, def_avail) \ | 891 | [idx] = {.pattern = pat, .avail = false} |
| 886 | [idx] = {.pattern = pat, .avail = (def_avail)} | 892 | DEFINE_TYPE(FTRACE_README_PROBE_TYPE_X, "*type: * x8/16/32/64,*"), |
| 887 | DEFINE_TYPE(PROBE_TYPE_U, "* u8/16/32/64,*", true), | 893 | DEFINE_TYPE(FTRACE_README_KRETPROBE_OFFSET, "*place (kretprobe): *"), |
| 888 | DEFINE_TYPE(PROBE_TYPE_S, "* s8/16/32/64,*", true), | ||
| 889 | DEFINE_TYPE(PROBE_TYPE_X, "* x8/16/32/64,*", false), | ||
| 890 | DEFINE_TYPE(PROBE_TYPE_STRING, "* string,*", true), | ||
| 891 | DEFINE_TYPE(PROBE_TYPE_BITFIELD, | ||
| 892 | "* b<bit-width>@<bit-offset>/<container-size>", true), | ||
| 893 | }; | 894 | }; |
| 894 | 895 | ||
| 895 | bool probe_type_is_available(enum probe_type type) | 896 | static bool scan_ftrace_readme(enum ftrace_readme type) |
| 896 | { | 897 | { |
| 898 | int fd; | ||
| 897 | FILE *fp; | 899 | FILE *fp; |
| 898 | char *buf = NULL; | 900 | char *buf = NULL; |
| 899 | size_t len = 0; | 901 | size_t len = 0; |
| 900 | bool target_line = false; | 902 | bool ret = false; |
| 901 | bool ret = probe_type_table[type].avail; | 903 | static bool scanned = false; |
| 902 | int fd; | ||
| 903 | 904 | ||
| 904 | if (type >= PROBE_TYPE_END) | 905 | if (scanned) |
| 905 | return false; | 906 | goto result; |
| 906 | /* We don't have to check the type which supported by default */ | ||
| 907 | if (ret || probe_type_table[type].checked) | ||
| 908 | return ret; | ||
| 909 | 907 | ||
| 910 | fd = open_trace_file("README", false); | 908 | fd = open_trace_file("README", false); |
| 911 | if (fd < 0) | 909 | if (fd < 0) |
| @@ -917,21 +915,34 @@ bool probe_type_is_available(enum probe_type type) | |||
| 917 | return ret; | 915 | return ret; |
| 918 | } | 916 | } |
| 919 | 917 | ||
| 920 | while (getline(&buf, &len, fp) > 0 && !ret) { | 918 | while (getline(&buf, &len, fp) > 0) |
| 921 | if (!target_line) { | 919 | for (enum ftrace_readme i = 0; i < FTRACE_README_END; i++) |
| 922 | target_line = !!strstr(buf, " type: "); | 920 | if (!ftrace_readme_table[i].avail) |
| 923 | if (!target_line) | 921 | ftrace_readme_table[i].avail = |
| 924 | continue; | 922 | strglobmatch(buf, ftrace_readme_table[i].pattern); |
| 925 | } else if (strstr(buf, "\t ") != buf) | 923 | scanned = true; |
| 926 | break; | ||
| 927 | ret = strglobmatch(buf, probe_type_table[type].pattern); | ||
| 928 | } | ||
| 929 | /* Cache the result */ | ||
| 930 | probe_type_table[type].checked = true; | ||
| 931 | probe_type_table[type].avail = ret; | ||
| 932 | 924 | ||
| 933 | fclose(fp); | 925 | fclose(fp); |
| 934 | free(buf); | 926 | free(buf); |
| 935 | 927 | ||
| 936 | return ret; | 928 | result: |
| 929 | if (type >= FTRACE_README_END) | ||
| 930 | return false; | ||
| 931 | |||
| 932 | return ftrace_readme_table[type].avail; | ||
| 933 | } | ||
| 934 | |||
| 935 | bool probe_type_is_available(enum probe_type type) | ||
| 936 | { | ||
| 937 | if (type >= PROBE_TYPE_END) | ||
| 938 | return false; | ||
| 939 | else if (type == PROBE_TYPE_X) | ||
| 940 | return scan_ftrace_readme(FTRACE_README_PROBE_TYPE_X); | ||
| 941 | |||
| 942 | return true; | ||
| 943 | } | ||
| 944 | |||
| 945 | bool kretprobe_offset_is_supported(void) | ||
| 946 | { | ||
| 947 | return scan_ftrace_readme(FTRACE_README_KRETPROBE_OFFSET); | ||
| 937 | } | 948 | } |
