perf parse: Refactor 'struct perf_evsel_config_term'
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>
This commit is contained in:
parent
0cc4bd8f70
commit
e884602b57
|
@ -226,7 +226,7 @@ static int cs_etm_set_sink_attr(struct perf_pmu *pmu,
|
||||||
if (term->type != PERF_EVSEL__CONFIG_TERM_DRV_CFG)
|
if (term->type != PERF_EVSEL__CONFIG_TERM_DRV_CFG)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
sink = term->val.drv_cfg;
|
sink = term->val.str;
|
||||||
snprintf(path, PATH_MAX, "sinks/%s", sink);
|
snprintf(path, PATH_MAX, "sinks/%s", sink);
|
||||||
|
|
||||||
ret = perf_pmu__scan_file(pmu, path, "%x", &hash);
|
ret = perf_pmu__scan_file(pmu, path, "%x", &hash);
|
||||||
|
|
|
@ -808,12 +808,12 @@ static void apply_config_terms(struct evsel *evsel,
|
||||||
perf_evsel__reset_sample_bit(evsel, TIME);
|
perf_evsel__reset_sample_bit(evsel, TIME);
|
||||||
break;
|
break;
|
||||||
case PERF_EVSEL__CONFIG_TERM_CALLGRAPH:
|
case PERF_EVSEL__CONFIG_TERM_CALLGRAPH:
|
||||||
callgraph_buf = term->val.callgraph;
|
callgraph_buf = term->val.str;
|
||||||
break;
|
break;
|
||||||
case PERF_EVSEL__CONFIG_TERM_BRANCH:
|
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);
|
perf_evsel__set_sample_bit(evsel, BRANCH_STACK);
|
||||||
parse_branch_str(term->val.branch,
|
parse_branch_str(term->val.str,
|
||||||
&attr->branch_sample_type);
|
&attr->branch_sample_type);
|
||||||
} else
|
} else
|
||||||
perf_evsel__reset_sample_bit(evsel, BRANCH_STACK);
|
perf_evsel__reset_sample_bit(evsel, BRANCH_STACK);
|
||||||
|
|
|
@ -36,18 +36,16 @@ struct perf_evsel_config_term {
|
||||||
u64 period;
|
u64 period;
|
||||||
u64 freq;
|
u64 freq;
|
||||||
bool time;
|
bool time;
|
||||||
char *callgraph;
|
|
||||||
char *drv_cfg;
|
|
||||||
u64 stack_user;
|
u64 stack_user;
|
||||||
int max_stack;
|
int max_stack;
|
||||||
bool inherit;
|
bool inherit;
|
||||||
bool overwrite;
|
bool overwrite;
|
||||||
char *branch;
|
|
||||||
unsigned long max_events;
|
unsigned long max_events;
|
||||||
bool percore;
|
bool percore;
|
||||||
bool aux_output;
|
bool aux_output;
|
||||||
u32 aux_sample_size;
|
u32 aux_sample_size;
|
||||||
u64 cfg_chg;
|
u64 cfg_chg;
|
||||||
|
char *str;
|
||||||
} val;
|
} val;
|
||||||
bool weak;
|
bool weak;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1219,8 +1219,7 @@ static int config_attr(struct perf_event_attr *attr,
|
||||||
static int get_config_terms(struct list_head *head_config,
|
static int get_config_terms(struct list_head *head_config,
|
||||||
struct list_head *head_terms __maybe_unused)
|
struct list_head *head_terms __maybe_unused)
|
||||||
{
|
{
|
||||||
#define ADD_CONFIG_TERM(__type, __name, __val) \
|
#define ADD_CONFIG_TERM(__type) \
|
||||||
do { \
|
|
||||||
struct perf_evsel_config_term *__t; \
|
struct perf_evsel_config_term *__t; \
|
||||||
\
|
\
|
||||||
__t = zalloc(sizeof(*__t)); \
|
__t = zalloc(sizeof(*__t)); \
|
||||||
|
@ -1229,9 +1228,19 @@ do { \
|
||||||
\
|
\
|
||||||
INIT_LIST_HEAD(&__t->list); \
|
INIT_LIST_HEAD(&__t->list); \
|
||||||
__t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \
|
__t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \
|
||||||
__t->val.__name = __val; \
|
|
||||||
__t->weak = term->weak; \
|
__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)
|
} while (0)
|
||||||
|
|
||||||
struct parse_events_term *term;
|
struct parse_events_term *term;
|
||||||
|
@ -1239,53 +1248,62 @@ do { \
|
||||||
list_for_each_entry(term, head_config, list) {
|
list_for_each_entry(term, head_config, list) {
|
||||||
switch (term->type_term) {
|
switch (term->type_term) {
|
||||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_TIME:
|
case PARSE_EVENTS__TERM_TYPE_TIME:
|
||||||
ADD_CONFIG_TERM(TIME, time, term->val.num);
|
ADD_CONFIG_TERM_VAL(TIME, time, term->val.num);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
|
case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
|
||||||
ADD_CONFIG_TERM(CALLGRAPH, callgraph, term->val.str);
|
ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_INHERIT:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_PERCORE:
|
case PARSE_EVENTS__TERM_TYPE_PERCORE:
|
||||||
ADD_CONFIG_TERM(PERCORE, percore,
|
ADD_CONFIG_TERM_VAL(PERCORE, percore,
|
||||||
term->val.num ? true : false);
|
term->val.num ? true : false);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
|
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;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1322,7 +1340,7 @@ static int get_config_chgs(struct perf_pmu *pmu, struct list_head *head_config,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bits)
|
if (bits)
|
||||||
ADD_CONFIG_TERM(CFG_CHG, cfg_chg, bits);
|
ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits);
|
||||||
|
|
||||||
#undef ADD_CONFIG_TERM
|
#undef ADD_CONFIG_TERM
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue