perf parse: Refactor 'struct perf_evsel_config_term'
authorLeo Yan <leo.yan@linaro.org>
Fri, 17 Jan 2020 05:52:50 +0000 (13:52 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 30 Jan 2020 10:55:02 +0000 (11:55 +0100)
The struct perf_evsel_config_term::val is a union which contains fields
'callgraph', 'drv_cfg' and 'branch' as string pointers.  This leads to
the complex code logic for handling every type's string separately, and
it's hard to release string as a general way.

This patch refactors the structure to add a common field 'str' in the
'val' union as string pointer and remove the other three fields
'callgraph', 'drv_cfg' and 'branch'.  Without passing field name, the
patch simplifies the string handling with macro ADD_CONFIG_TERM_STR()
for string pointer assignment.

This patch fixes multiple warnings of line over 80 characters detected
by checkpatch tool.

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lore.kernel.org/lkml/20200117055251.24058-1-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/arm/util/cs-etm.c
tools/perf/util/evsel.c
tools/perf/util/evsel_config.h
tools/perf/util/parse-events.c

index ede040cf82ad8dfc9bfbfa98e485e74fceefb1cd..2898cfdf8fe18f3640351329a920a2f04df35aca 100644 (file)
@@ -226,7 +226,7 @@ static int cs_etm_set_sink_attr(struct perf_pmu *pmu,
                if (term->type != PERF_EVSEL__CONFIG_TERM_DRV_CFG)
                        continue;
 
-               sink = term->val.drv_cfg;
+               sink = term->val.str;
                snprintf(path, PATH_MAX, "sinks/%s", sink);
 
                ret = perf_pmu__scan_file(pmu, path, "%x", &hash);
index a69e64236120a7d4c8bf4ceb84434a439b51f6ac..549abd43816f2656ff983c68f75cc2800f63c523 100644 (file)
@@ -808,12 +808,12 @@ static void apply_config_terms(struct evsel *evsel,
                                perf_evsel__reset_sample_bit(evsel, TIME);
                        break;
                case PERF_EVSEL__CONFIG_TERM_CALLGRAPH:
-                       callgraph_buf = term->val.callgraph;
+                       callgraph_buf = term->val.str;
                        break;
                case PERF_EVSEL__CONFIG_TERM_BRANCH:
-                       if (term->val.branch && strcmp(term->val.branch, "no")) {
+                       if (term->val.str && strcmp(term->val.str, "no")) {
                                perf_evsel__set_sample_bit(evsel, BRANCH_STACK);
-                               parse_branch_str(term->val.branch,
+                               parse_branch_str(term->val.str,
                                                 &attr->branch_sample_type);
                        } else
                                perf_evsel__reset_sample_bit(evsel, BRANCH_STACK);
index 1f8d2fe0b66eda531aaf33b02dbe6888076c943c..b4a65201e4f7bb285097832780aac934c0f82b58 100644 (file)
@@ -36,18 +36,16 @@ struct perf_evsel_config_term {
                u64           period;
                u64           freq;
                bool          time;
-               char          *callgraph;
-               char          *drv_cfg;
                u64           stack_user;
                int           max_stack;
                bool          inherit;
                bool          overwrite;
-               char          *branch;
                unsigned long max_events;
                bool          percore;
                bool          aux_output;
                u32           aux_sample_size;
                u64           cfg_chg;
+               char          *str;
        } val;
        bool weak;
 };
index ed7c008b9c8bd3161daeb3c378f281d27c33521c..f59f3c8da4737200133b45a03f6d36e2736d0f76 100644 (file)
@@ -1219,8 +1219,7 @@ static int config_attr(struct perf_event_attr *attr,
 static int get_config_terms(struct list_head *head_config,
                            struct list_head *head_terms __maybe_unused)
 {
-#define ADD_CONFIG_TERM(__type, __name, __val)                 \
-do {                                                           \
+#define ADD_CONFIG_TERM(__type)                                        \
        struct perf_evsel_config_term *__t;                     \
                                                                \
        __t = zalloc(sizeof(*__t));                             \
@@ -1229,9 +1228,19 @@ do {                                                             \
                                                                \
        INIT_LIST_HEAD(&__t->list);                             \
        __t->type       = PERF_EVSEL__CONFIG_TERM_ ## __type;   \
-       __t->val.__name = __val;                                \
        __t->weak       = term->weak;                           \
-       list_add_tail(&__t->list, head_terms);                  \
+       list_add_tail(&__t->list, head_terms)
+
+#define ADD_CONFIG_TERM_VAL(__type, __name, __val)             \
+do {                                                           \
+       ADD_CONFIG_TERM(__type);                                \
+       __t->val.__name = __val;                                \
+} while (0)
+
+#define ADD_CONFIG_TERM_STR(__type, __val)                     \
+do {                                                           \
+       ADD_CONFIG_TERM(__type);                                \
+       __t->val.str = __val;                                   \
 } while (0)
 
        struct parse_events_term *term;
@@ -1239,53 +1248,62 @@ do {                                                            \
        list_for_each_entry(term, head_config, list) {
                switch (term->type_term) {
                case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
-                       ADD_CONFIG_TERM(PERIOD, period, term->val.num);
+                       ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num);
                        break;
                case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
-                       ADD_CONFIG_TERM(FREQ, freq, term->val.num);
+                       ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num);
                        break;
                case PARSE_EVENTS__TERM_TYPE_TIME:
-                       ADD_CONFIG_TERM(TIME, time, term->val.num);
+                       ADD_CONFIG_TERM_VAL(TIME, time, term->val.num);
                        break;
                case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
-                       ADD_CONFIG_TERM(CALLGRAPH, callgraph, term->val.str);
+                       ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str);
                        break;
                case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
-                       ADD_CONFIG_TERM(BRANCH, branch, term->val.str);
+                       ADD_CONFIG_TERM_STR(BRANCH, term->val.str);
                        break;
                case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
-                       ADD_CONFIG_TERM(STACK_USER, stack_user, term->val.num);
+                       ADD_CONFIG_TERM_VAL(STACK_USER, stack_user,
+                                           term->val.num);
                        break;
                case PARSE_EVENTS__TERM_TYPE_INHERIT:
-                       ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 1 : 0);
+                       ADD_CONFIG_TERM_VAL(INHERIT, inherit,
+                                           term->val.num ? 1 : 0);
                        break;
                case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
-                       ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 0 : 1);
+                       ADD_CONFIG_TERM_VAL(INHERIT, inherit,
+                                           term->val.num ? 0 : 1);
                        break;
                case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
-                       ADD_CONFIG_TERM(MAX_STACK, max_stack, term->val.num);
+                       ADD_CONFIG_TERM_VAL(MAX_STACK, max_stack,
+                                           term->val.num);
                        break;
                case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
-                       ADD_CONFIG_TERM(MAX_EVENTS, max_events, term->val.num);
+                       ADD_CONFIG_TERM_VAL(MAX_EVENTS, max_events,
+                                           term->val.num);
                        break;
                case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
-                       ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 1 : 0);
+                       ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
+                                           term->val.num ? 1 : 0);
                        break;
                case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
-                       ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 0 : 1);
+                       ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
+                                           term->val.num ? 0 : 1);
                        break;
                case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
-                       ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str);
+                       ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str);
                        break;
                case PARSE_EVENTS__TERM_TYPE_PERCORE:
-                       ADD_CONFIG_TERM(PERCORE, percore,
-                                       term->val.num ? true : false);
+                       ADD_CONFIG_TERM_VAL(PERCORE, percore,
+                                           term->val.num ? true : false);
                        break;
                case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
-                       ADD_CONFIG_TERM(AUX_OUTPUT, aux_output, term->val.num ? 1 : 0);
+                       ADD_CONFIG_TERM_VAL(AUX_OUTPUT, aux_output,
+                                           term->val.num ? 1 : 0);
                        break;
                case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
-                       ADD_CONFIG_TERM(AUX_SAMPLE_SIZE, aux_sample_size, term->val.num);
+                       ADD_CONFIG_TERM_VAL(AUX_SAMPLE_SIZE, aux_sample_size,
+                                           term->val.num);
                        break;
                default:
                        break;
@@ -1322,7 +1340,7 @@ static int get_config_chgs(struct perf_pmu *pmu, struct list_head *head_config,
        }
 
        if (bits)
-               ADD_CONFIG_TERM(CFG_CHG, cfg_chg, bits);
+               ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits);
 
 #undef ADD_CONFIG_TERM
        return 0;