| From: Tom Zanussi <tom.zanussi@linux.intel.com> |
| Date: Tue, 5 Sep 2017 16:57:24 -0500 |
| Subject: [PATCH 12/40] tracing: Break out hist trigger assignment parsing |
| |
| 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> |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| kernel/trace/trace_events_hist.c | 56 ++++++++++++++++++++++++--------------- |
| 1 file changed, 35 insertions(+), 21 deletions(-) |
| |
| --- a/kernel/trace/trace_events_hist.c |
| +++ b/kernel/trace/trace_events_hist.c |
| @@ -251,6 +251,35 @@ static void destroy_hist_trigger_attrs(s |
| kfree(attrs); |
| } |
| |
| +static int parse_assignment(char *str, struct hist_trigger_attrs *attrs) |
| +{ |
| + int ret = 0; |
| + |
| + 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 (strncmp(str, "size=", strlen("size=")) == 0) { |
| + 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; |
| @@ -263,33 +292,18 @@ static struct hist_trigger_attrs *parse_ |
| 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; |
| } |