2017-07-09 11:42:39 +00:00
|
|
|
From: Tom Zanussi <tom.zanussi@linux.intel.com>
|
2017-11-20 14:16:49 +00:00
|
|
|
Date: Fri, 22 Sep 2017 14:59:47 -0500
|
|
|
|
Subject: [PATCH 16/42] tracing: Break out hist trigger assignment parsing
|
|
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz
|
2017-07-09 11:42:39 +00:00
|
|
|
|
|
|
|
This will make it easier to add variables, and makes the parsing code
|
|
|
|
cleaner regardless.
|
|
|
|
|
|
|
|
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
|
2017-11-20 14:16:49 +00:00
|
|
|
Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
|
2017-07-09 11:42:39 +00:00
|
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
|
|
---
|
2017-11-20 14:16:49 +00:00
|
|
|
kernel/trace/trace_events_hist.c | 72 +++++++++++++++++++++++++++------------
|
|
|
|
1 file changed, 51 insertions(+), 21 deletions(-)
|
2017-07-09 11:42:39 +00:00
|
|
|
|
|
|
|
--- a/kernel/trace/trace_events_hist.c
|
|
|
|
+++ b/kernel/trace/trace_events_hist.c
|
2017-11-20 14:16:49 +00:00
|
|
|
@@ -251,6 +251,51 @@ static void destroy_hist_trigger_attrs(s
|
2017-07-09 11:42:39 +00:00
|
|
|
kfree(attrs);
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int parse_assignment(char *str, struct hist_trigger_attrs *attrs)
|
|
|
|
+{
|
|
|
|
+ int ret = 0;
|
|
|
|
+
|
|
|
|
+ if ((strncmp(str, "key=", strlen("key=")) == 0) ||
|
2017-11-20 14:16:49 +00:00
|
|
|
+ (strncmp(str, "keys=", strlen("keys=")) == 0)) {
|
2017-07-09 11:42:39 +00:00
|
|
|
+ attrs->keys_str = kstrdup(str, GFP_KERNEL);
|
2017-11-20 14:16:49 +00:00
|
|
|
+ if (!attrs->keys_str) {
|
|
|
|
+ ret = -ENOMEM;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ } else if ((strncmp(str, "val=", strlen("val=")) == 0) ||
|
2017-07-09 11:42:39 +00:00
|
|
|
+ (strncmp(str, "vals=", strlen("vals=")) == 0) ||
|
2017-11-20 14:16:49 +00:00
|
|
|
+ (strncmp(str, "values=", strlen("values=")) == 0)) {
|
2017-07-09 11:42:39 +00:00
|
|
|
+ attrs->vals_str = kstrdup(str, GFP_KERNEL);
|
2017-11-20 14:16:49 +00:00
|
|
|
+ if (!attrs->vals_str) {
|
|
|
|
+ ret = -ENOMEM;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ } else if (strncmp(str, "sort=", strlen("sort=")) == 0) {
|
2017-07-09 11:42:39 +00:00
|
|
|
+ attrs->sort_key_str = kstrdup(str, GFP_KERNEL);
|
2017-11-20 14:16:49 +00:00
|
|
|
+ if (!attrs->sort_key_str) {
|
|
|
|
+ ret = -ENOMEM;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ } else if (strncmp(str, "name=", strlen("name=")) == 0) {
|
2017-07-09 11:42:39 +00:00
|
|
|
+ attrs->name = kstrdup(str, GFP_KERNEL);
|
2017-11-20 14:16:49 +00:00
|
|
|
+ if (!attrs->name) {
|
|
|
|
+ ret = -ENOMEM;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ } else if (strncmp(str, "size=", strlen("size=")) == 0) {
|
2017-07-09 11:42:39 +00:00
|
|
|
+ int map_bits = parse_map_size(str);
|
|
|
|
+
|
|
|
|
+ if (map_bits < 0) {
|
|
|
|
+ ret = map_bits;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ attrs->map_bits = map_bits;
|
|
|
|
+ } else
|
|
|
|
+ ret = -EINVAL;
|
|
|
|
+ out:
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static struct hist_trigger_attrs *parse_hist_trigger_attrs(char *trigger_str)
|
|
|
|
{
|
|
|
|
struct hist_trigger_attrs *attrs;
|
2017-11-20 14:16:49 +00:00
|
|
|
@@ -263,33 +308,18 @@ static struct hist_trigger_attrs *parse_
|
2017-07-09 11:42:39 +00:00
|
|
|
while (trigger_str) {
|
|
|
|
char *str = strsep(&trigger_str, ":");
|
|
|
|
|
|
|
|
- if ((strncmp(str, "key=", strlen("key=")) == 0) ||
|
|
|
|
- (strncmp(str, "keys=", strlen("keys=")) == 0))
|
|
|
|
- attrs->keys_str = kstrdup(str, GFP_KERNEL);
|
|
|
|
- else if ((strncmp(str, "val=", strlen("val=")) == 0) ||
|
|
|
|
- (strncmp(str, "vals=", strlen("vals=")) == 0) ||
|
|
|
|
- (strncmp(str, "values=", strlen("values=")) == 0))
|
|
|
|
- attrs->vals_str = kstrdup(str, GFP_KERNEL);
|
|
|
|
- else if (strncmp(str, "sort=", strlen("sort=")) == 0)
|
|
|
|
- attrs->sort_key_str = kstrdup(str, GFP_KERNEL);
|
|
|
|
- else if (strncmp(str, "name=", strlen("name=")) == 0)
|
|
|
|
- attrs->name = kstrdup(str, GFP_KERNEL);
|
|
|
|
- else if (strcmp(str, "pause") == 0)
|
|
|
|
+ if (strchr(str, '=')) {
|
|
|
|
+ ret = parse_assignment(str, attrs);
|
|
|
|
+ if (ret)
|
|
|
|
+ goto free;
|
|
|
|
+ } else if (strcmp(str, "pause") == 0)
|
|
|
|
attrs->pause = true;
|
|
|
|
else if ((strcmp(str, "cont") == 0) ||
|
|
|
|
(strcmp(str, "continue") == 0))
|
|
|
|
attrs->cont = true;
|
|
|
|
else if (strcmp(str, "clear") == 0)
|
|
|
|
attrs->clear = true;
|
|
|
|
- else if (strncmp(str, "size=", strlen("size=")) == 0) {
|
|
|
|
- int map_bits = parse_map_size(str);
|
|
|
|
-
|
|
|
|
- if (map_bits < 0) {
|
|
|
|
- ret = map_bits;
|
|
|
|
- goto free;
|
|
|
|
- }
|
|
|
|
- attrs->map_bits = map_bits;
|
|
|
|
- } else {
|
|
|
|
+ else {
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto free;
|
|
|
|
}
|