|
@@ -490,6 +490,31 @@ parse_multiple_tracepoint_event(char *sys_name, const char *evt_exp,
|
|
return EVT_HANDLED_ALL;
|
|
return EVT_HANDLED_ALL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int store_event_type(const char *orgname)
|
|
|
|
+{
|
|
|
|
+ char filename[PATH_MAX], *c;
|
|
|
|
+ FILE *file;
|
|
|
|
+ int id, n;
|
|
|
|
+
|
|
|
|
+ sprintf(filename, "%s/", debugfs_path);
|
|
|
|
+ strncat(filename, orgname, strlen(orgname));
|
|
|
|
+ strcat(filename, "/id");
|
|
|
|
+
|
|
|
|
+ c = strchr(filename, ':');
|
|
|
|
+ if (c)
|
|
|
|
+ *c = '/';
|
|
|
|
+
|
|
|
|
+ file = fopen(filename, "r");
|
|
|
|
+ if (!file)
|
|
|
|
+ return 0;
|
|
|
|
+ n = fscanf(file, "%i", &id);
|
|
|
|
+ fclose(file);
|
|
|
|
+ if (n < 1) {
|
|
|
|
+ pr_err("cannot store event ID\n");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ return perf_header__push_event(id, orgname);
|
|
|
|
+}
|
|
|
|
|
|
static enum event_result parse_tracepoint_event(const char **strp,
|
|
static enum event_result parse_tracepoint_event(const char **strp,
|
|
struct perf_event_attr *attr)
|
|
struct perf_event_attr *attr)
|
|
@@ -533,9 +558,13 @@ static enum event_result parse_tracepoint_event(const char **strp,
|
|
*strp += strlen(sys_name) + evt_length;
|
|
*strp += strlen(sys_name) + evt_length;
|
|
return parse_multiple_tracepoint_event(sys_name, evt_name,
|
|
return parse_multiple_tracepoint_event(sys_name, evt_name,
|
|
flags);
|
|
flags);
|
|
- } else
|
|
|
|
|
|
+ } else {
|
|
|
|
+ if (store_event_type(evt_name) < 0)
|
|
|
|
+ return EVT_FAILED;
|
|
|
|
+
|
|
return parse_single_tracepoint_event(sys_name, evt_name,
|
|
return parse_single_tracepoint_event(sys_name, evt_name,
|
|
evt_length, attr, strp);
|
|
evt_length, attr, strp);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static enum event_result
|
|
static enum event_result
|
|
@@ -778,41 +807,11 @@ modifier:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static int store_event_type(const char *orgname)
|
|
|
|
-{
|
|
|
|
- char filename[PATH_MAX], *c;
|
|
|
|
- FILE *file;
|
|
|
|
- int id, n;
|
|
|
|
-
|
|
|
|
- sprintf(filename, "%s/", debugfs_path);
|
|
|
|
- strncat(filename, orgname, strlen(orgname));
|
|
|
|
- strcat(filename, "/id");
|
|
|
|
-
|
|
|
|
- c = strchr(filename, ':');
|
|
|
|
- if (c)
|
|
|
|
- *c = '/';
|
|
|
|
-
|
|
|
|
- file = fopen(filename, "r");
|
|
|
|
- if (!file)
|
|
|
|
- return 0;
|
|
|
|
- n = fscanf(file, "%i", &id);
|
|
|
|
- fclose(file);
|
|
|
|
- if (n < 1) {
|
|
|
|
- pr_err("cannot store event ID\n");
|
|
|
|
- return -EINVAL;
|
|
|
|
- }
|
|
|
|
- return perf_header__push_event(id, orgname);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
int parse_events(const struct option *opt __used, const char *str, int unset __used)
|
|
int parse_events(const struct option *opt __used, const char *str, int unset __used)
|
|
{
|
|
{
|
|
struct perf_event_attr attr;
|
|
struct perf_event_attr attr;
|
|
enum event_result ret;
|
|
enum event_result ret;
|
|
|
|
|
|
- if (strchr(str, ':'))
|
|
|
|
- if (store_event_type(str) < 0)
|
|
|
|
- return -1;
|
|
|
|
-
|
|
|
|
for (;;) {
|
|
for (;;) {
|
|
memset(&attr, 0, sizeof(attr));
|
|
memset(&attr, 0, sizeof(attr));
|
|
ret = parse_event_symbols(&str, &attr);
|
|
ret = parse_event_symbols(&str, &attr);
|