|
@@ -877,35 +877,31 @@ int probe_cache__show_all_caches(struct strfilter *filter)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+enum ftrace_readme {
|
|
|
+ FTRACE_README_PROBE_TYPE_X = 0,
|
|
|
+ FTRACE_README_END,
|
|
|
+};
|
|
|
+
|
|
|
static struct {
|
|
|
const char *pattern;
|
|
|
- bool avail;
|
|
|
- bool checked;
|
|
|
-} probe_type_table[] = {
|
|
|
-#define DEFINE_TYPE(idx, pat, def_avail) \
|
|
|
- [idx] = {.pattern = pat, .avail = (def_avail)}
|
|
|
- DEFINE_TYPE(PROBE_TYPE_U, "* u8/16/32/64,*", true),
|
|
|
- DEFINE_TYPE(PROBE_TYPE_S, "* s8/16/32/64,*", true),
|
|
|
- DEFINE_TYPE(PROBE_TYPE_X, "* x8/16/32/64,*", false),
|
|
|
- DEFINE_TYPE(PROBE_TYPE_STRING, "* string,*", true),
|
|
|
- DEFINE_TYPE(PROBE_TYPE_BITFIELD,
|
|
|
- "* b<bit-width>@<bit-offset>/<container-size>", true),
|
|
|
+ bool avail;
|
|
|
+} ftrace_readme_table[] = {
|
|
|
+#define DEFINE_TYPE(idx, pat) \
|
|
|
+ [idx] = {.pattern = pat, .avail = false}
|
|
|
+ DEFINE_TYPE(FTRACE_README_PROBE_TYPE_X, "*type: * x8/16/32/64,*"),
|
|
|
};
|
|
|
|
|
|
-bool probe_type_is_available(enum probe_type type)
|
|
|
+static bool scan_ftrace_readme(enum ftrace_readme type)
|
|
|
{
|
|
|
+ int fd;
|
|
|
FILE *fp;
|
|
|
char *buf = NULL;
|
|
|
size_t len = 0;
|
|
|
- bool target_line = false;
|
|
|
- bool ret = probe_type_table[type].avail;
|
|
|
- int fd;
|
|
|
+ bool ret = false;
|
|
|
+ static bool scanned = false;
|
|
|
|
|
|
- if (type >= PROBE_TYPE_END)
|
|
|
- return false;
|
|
|
- /* We don't have to check the type which supported by default */
|
|
|
- if (ret || probe_type_table[type].checked)
|
|
|
- return ret;
|
|
|
+ if (scanned)
|
|
|
+ goto result;
|
|
|
|
|
|
fd = open_trace_file("README", false);
|
|
|
if (fd < 0)
|
|
@@ -917,21 +913,29 @@ bool probe_type_is_available(enum probe_type type)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- while (getline(&buf, &len, fp) > 0 && !ret) {
|
|
|
- if (!target_line) {
|
|
|
- target_line = !!strstr(buf, " type: ");
|
|
|
- if (!target_line)
|
|
|
- continue;
|
|
|
- } else if (strstr(buf, "\t ") != buf)
|
|
|
- break;
|
|
|
- ret = strglobmatch(buf, probe_type_table[type].pattern);
|
|
|
- }
|
|
|
- /* Cache the result */
|
|
|
- probe_type_table[type].checked = true;
|
|
|
- probe_type_table[type].avail = ret;
|
|
|
+ while (getline(&buf, &len, fp) > 0)
|
|
|
+ for (enum ftrace_readme i = 0; i < FTRACE_README_END; i++)
|
|
|
+ if (!ftrace_readme_table[i].avail)
|
|
|
+ ftrace_readme_table[i].avail =
|
|
|
+ strglobmatch(buf, ftrace_readme_table[i].pattern);
|
|
|
+ scanned = true;
|
|
|
|
|
|
fclose(fp);
|
|
|
free(buf);
|
|
|
|
|
|
- return ret;
|
|
|
+result:
|
|
|
+ if (type >= FTRACE_README_END)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return ftrace_readme_table[type].avail;
|
|
|
+}
|
|
|
+
|
|
|
+bool probe_type_is_available(enum probe_type type)
|
|
|
+{
|
|
|
+ if (type >= PROBE_TYPE_END)
|
|
|
+ return false;
|
|
|
+ else if (type == PROBE_TYPE_X)
|
|
|
+ return scan_ftrace_readme(FTRACE_README_PROBE_TYPE_X);
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|