aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/parse-events.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2012-03-20 14:15:40 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-03-22 14:11:38 -0400
commit5d7be90ed5cfb5dd3c9ab726d7daa91b86b81747 (patch)
tree9b40166a00566af8bef1c388d51b8863a92cc6fe /tools/perf/util/parse-events.c
parent9fafd98f1bf14276f95b69f0186ad5675f1e1a18 (diff)
perf tools: Fix modifier to be applied on correct events
The event modifier needs to be applied only on the event definition it is attached to. The current state is that in case of multiple events definition (in single '-e' option, separated by ',') all will get modifier of the last one. Fixing this by adding separated list for each event definition, so the modifier is applied only to proper event(s). Added automated test to catch this, plus some other modifier tests. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1332267341-26338-3-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/parse-events.c')
-rw-r--r--tools/perf/util/parse-events.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index f542a631388b..5b3a0ef4e232 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -23,7 +23,8 @@ struct event_symbol {
23 const char *alias; 23 const char *alias;
24}; 24};
25 25
26int parse_events_parse(struct list_head *list, int *idx); 26int parse_events_parse(struct list_head *list, struct list_head *list_tmp,
27 int *idx);
27 28
28#define CHW(x) .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_##x 29#define CHW(x) .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_##x
29#define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x 30#define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x
@@ -671,6 +672,18 @@ int parse_events_add_pmu(struct list_head *list, int *idx,
671 return add_event(list, idx, &attr, (char *) "pmu"); 672 return add_event(list, idx, &attr, (char *) "pmu");
672} 673}
673 674
675void parse_events_update_lists(struct list_head *list_event,
676 struct list_head *list_all)
677{
678 /*
679 * Called for single event definition. Update the
680 * 'all event' list, and reinit the 'signle event'
681 * list, for next event definition.
682 */
683 list_splice_tail(list_event, list_all);
684 INIT_LIST_HEAD(list_event);
685}
686
674int parse_events_modifier(struct list_head *list, char *str) 687int parse_events_modifier(struct list_head *list, char *str)
675{ 688{
676 struct perf_evsel *evsel; 689 struct perf_evsel *evsel;
@@ -736,14 +749,14 @@ int parse_events_modifier(struct list_head *list, char *str)
736 749
737int parse_events(struct perf_evlist *evlist, const char *str, int unset __used) 750int parse_events(struct perf_evlist *evlist, const char *str, int unset __used)
738{ 751{
739 struct perf_evsel *evsel, *h;
740 LIST_HEAD(list); 752 LIST_HEAD(list);
753 LIST_HEAD(list_tmp);
741 YY_BUFFER_STATE buffer; 754 YY_BUFFER_STATE buffer;
742 int ret, idx = evlist->nr_entries; 755 int ret, idx = evlist->nr_entries;
743 756
744 buffer = parse_events__scan_string(str); 757 buffer = parse_events__scan_string(str);
745 758
746 ret = parse_events_parse(&list, &idx); 759 ret = parse_events_parse(&list, &list_tmp, &idx);
747 760
748 parse_events__flush_buffer(buffer); 761 parse_events__flush_buffer(buffer);
749 parse_events__delete_buffer(buffer); 762 parse_events__delete_buffer(buffer);
@@ -754,9 +767,11 @@ int parse_events(struct perf_evlist *evlist, const char *str, int unset __used)
754 return 0; 767 return 0;
755 } 768 }
756 769
757 list_for_each_entry_safe(evsel, h, &list, node) 770 /*
758 perf_evsel__delete(evsel); 771 * There are 2 users - builtin-record and builtin-test objects.
759 772 * Both call perf_evlist__delete in case of error, so we dont
773 * need to bother.
774 */
760 fprintf(stderr, "invalid or unsupported event: '%s'\n", str); 775 fprintf(stderr, "invalid or unsupported event: '%s'\n", str);
761 fprintf(stderr, "Run 'perf list' for a list of valid events\n"); 776 fprintf(stderr, "Run 'perf list' for a list of valid events\n");
762 return ret; 777 return ret;