aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/probe-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/probe-file.c')
-rw-r--r--tools/perf/util/probe-file.c77
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
880enum ftrace_readme {
881 FTRACE_README_PROBE_TYPE_X = 0,
882 FTRACE_README_KRETPROBE_OFFSET,
883 FTRACE_README_END,
884};
885
880static struct { 886static 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
895bool probe_type_is_available(enum probe_type type) 896static 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; 928result:
929 if (type >= FTRACE_README_END)
930 return false;
931
932 return ftrace_readme_table[type].avail;
933}
934
935bool 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
945bool kretprobe_offset_is_supported(void)
946{
947 return scan_ftrace_readme(FTRACE_README_KRETPROBE_OFFSET);
937} 948}