perf/x86/pt, coresight: Clean up address filter structure
This is a cosmetic patch that deals with the address filter structure's ambiguous fields 'filter' and 'range'. The former stands to mean that the filter's *action* should be to filter the traces to its address range if it's set or stop tracing if it's unset. This is confusing and hard on the eyes, so this patch replaces it with 'action' enum. The 'range' field is completely redundant (meaning that the filter is an address range as opposed to a single address trigger), as we can use zero size to mean the same thing. Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Acked-by: Mathieu Poirier <mathieu.poirier@linaro.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Stephane Eranian <eranian@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Cc: Will Deacon <will.deacon@arm.com> Link: http://lkml.kernel.org/r/20180329120648.11902-1-alexander.shishkin@linux.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:

committed by
Ingo Molnar

parent
2d074918fb
commit
6ed70cf342
@@ -8803,7 +8803,8 @@ restart:
|
||||
* * for kernel addresses: <start address>[/<size>]
|
||||
* * for object files: <start address>[/<size>]@</path/to/object/file>
|
||||
*
|
||||
* if <size> is not specified, the range is treated as a single address.
|
||||
* if <size> is not specified or is zero, the range is treated as a single
|
||||
* address; not valid for ACTION=="filter".
|
||||
*/
|
||||
enum {
|
||||
IF_ACT_NONE = -1,
|
||||
@@ -8853,6 +8854,11 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
||||
return -ENOMEM;
|
||||
|
||||
while ((start = strsep(&fstr, " ,\n")) != NULL) {
|
||||
static const enum perf_addr_filter_action_t actions[] = {
|
||||
[IF_ACT_FILTER] = PERF_ADDR_FILTER_ACTION_FILTER,
|
||||
[IF_ACT_START] = PERF_ADDR_FILTER_ACTION_START,
|
||||
[IF_ACT_STOP] = PERF_ADDR_FILTER_ACTION_STOP,
|
||||
};
|
||||
ret = -EINVAL;
|
||||
|
||||
if (!*start)
|
||||
@@ -8869,12 +8875,11 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
||||
switch (token) {
|
||||
case IF_ACT_FILTER:
|
||||
case IF_ACT_START:
|
||||
filter->filter = 1;
|
||||
|
||||
case IF_ACT_STOP:
|
||||
if (state != IF_STATE_ACTION)
|
||||
goto fail;
|
||||
|
||||
filter->action = actions[token];
|
||||
state = IF_STATE_SOURCE;
|
||||
break;
|
||||
|
||||
@@ -8887,15 +8892,12 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
||||
if (state != IF_STATE_SOURCE)
|
||||
goto fail;
|
||||
|
||||
if (token == IF_SRC_FILE || token == IF_SRC_KERNEL)
|
||||
filter->range = 1;
|
||||
|
||||
*args[0].to = 0;
|
||||
ret = kstrtoul(args[0].from, 0, &filter->offset);
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
if (filter->range) {
|
||||
if (token == IF_SRC_KERNEL || token == IF_SRC_FILE) {
|
||||
*args[1].to = 0;
|
||||
ret = kstrtoul(args[1].from, 0, &filter->size);
|
||||
if (ret)
|
||||
@@ -8903,7 +8905,7 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
||||
}
|
||||
|
||||
if (token == IF_SRC_FILE || token == IF_SRC_FILEADDR) {
|
||||
int fpos = filter->range ? 2 : 1;
|
||||
int fpos = token == IF_SRC_FILE ? 2 : 1;
|
||||
|
||||
filename = match_strdup(&args[fpos]);
|
||||
if (!filename) {
|
||||
@@ -8929,6 +8931,14 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
||||
if (kernel && event->attr.exclude_kernel)
|
||||
goto fail;
|
||||
|
||||
/*
|
||||
* ACTION "filter" must have a non-zero length region
|
||||
* specified.
|
||||
*/
|
||||
if (filter->action == PERF_ADDR_FILTER_ACTION_FILTER &&
|
||||
!filter->size)
|
||||
goto fail;
|
||||
|
||||
if (!kernel) {
|
||||
if (!filename)
|
||||
goto fail;
|
||||
|
Reference in New Issue
Block a user