lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Sun, 25 Apr 2021 18:17:37 +0200
From:   Jiri Olsa <jolsa@...hat.com>
To:     Jin Yao <yao.jin@...ux.intel.com>
Cc:     acme@...nel.org, jolsa@...nel.org, peterz@...radead.org,
        mingo@...hat.com, alexander.shishkin@...ux.intel.com,
        Linux-kernel@...r.kernel.org, ak@...ux.intel.com,
        kan.liang@...el.com, yao.jin@...el.com
Subject: Re: [PATCH v5 12/26] perf parse-events: Support event inside hybrid
 pmu

On Fri, Apr 23, 2021 at 01:35:27PM +0800, Jin Yao wrote:

SNIP

> +static int parse_events__inside_hybrid_pmu(struct parse_events_state *parse_state,
> +					   struct list_head *list, char *name,
> +					   struct list_head *head_config)
> +{
> +	struct parse_events_term *term;
> +	int ret = -1;
> +
> +	if (parse_state->fake_pmu || !head_config || list_empty(head_config) ||
> +	    !perf_pmu__is_hybrid(name)) {
> +		return -1;
> +	}
> +
> +	/*
> +	 * More than one term in list.
> +	 */
> +	if (head_config->next && head_config->next->next != head_config)
> +		return -1;
> +
> +	term = list_first_entry(head_config, struct parse_events_term, list);
> +	if (term && term->config && strcmp(term->config, "event")) {

so 'event' is set only for HW events, I don't see it being for other
types.. also should the check be !strcmp ?

also please add some tests for cache events with pmu syntax

jirka

> +		ret = parse_events__with_hybrid_pmu(parse_state, term->config,
> +						    name, list);
> +	}
> +
> +	return ret;
> +}
> +
>  int parse_events_add_pmu(struct parse_events_state *parse_state,
>  			 struct list_head *list, char *name,
>  			 struct list_head *head_config,
> @@ -1567,6 +1598,11 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
>  	if (pmu->default_config && get_config_chgs(pmu, head_config, &config_terms))
>  		return -ENOMEM;
>  
> +	if (!parse_events__inside_hybrid_pmu(parse_state, list, name,
> +					     head_config)) {
> +		return 0;
> +	}
> +
>  	if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) {
>  		struct evsel_config_term *pos, *tmp;
>  
> @@ -2183,6 +2219,33 @@ int parse_events_terms(struct list_head *terms, const char *str)
>  	return ret;
>  }
>  
> +static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
> +					 const char *str, char *pmu_name,
> +					 struct list_head *list)
> +{
> +	struct parse_events_state ps = {
> +		.list            = LIST_HEAD_INIT(ps.list),
> +		.stoken          = PE_START_EVENTS,
> +		.hybrid_pmu_name = pmu_name,
> +		.idx             = parse_state->idx,
> +	};
> +	int ret;
> +
> +	ret = parse_events__scanner(str, &ps);
> +	perf_pmu__parse_cleanup();
> +
> +	if (!ret) {
> +		if (!list_empty(&ps.list)) {
> +			list_splice(&ps.list, list);
> +			parse_state->idx = ps.idx;
> +			return 0;
> +		} else
> +			return -1;
> +	}
> +
> +	return ret;
> +}
> +
>  int __parse_events(struct evlist *evlist, const char *str,
>  		   struct parse_events_error *err, struct perf_pmu *fake_pmu)
>  {
> -- 
> 2.17.1
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ