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) | ||||
| 			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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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; | ||||
| }; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user