diff options
Diffstat (limited to 'tools/perf/tests/code-reading.c')
| -rw-r--r-- | tools/perf/tests/code-reading.c | 43 | 
1 files changed, 37 insertions, 6 deletions
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c index 3bf7b145b826..99936352df4f 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -409,15 +409,21 @@ static int process_events(struct machine *machine, struct perf_evlist *evlist,  			  struct state *state)  {  	union perf_event *event; +	struct perf_mmap *md;  	int i, ret;  	for (i = 0; i < evlist->nr_mmaps; i++) { -		while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) { +		md = &evlist->mmap[i]; +		if (perf_mmap__read_init(md) < 0) +			continue; + +		while ((event = perf_mmap__read_event(md)) != NULL) {  			ret = process_event(machine, evlist, event, state); -			perf_evlist__mmap_consume(evlist, i); +			perf_mmap__consume(md);  			if (ret < 0)  				return ret;  		} +		perf_mmap__read_done(md);  	}  	return 0;  } @@ -482,6 +488,34 @@ static void fs_something(void)  	}  } +static const char *do_determine_event(bool excl_kernel) +{ +	const char *event = excl_kernel ? "cycles:u" : "cycles"; + +#ifdef __s390x__ +	char cpuid[128], model[16], model_c[16], cpum_cf_v[16]; +	unsigned int family; +	int ret, cpum_cf_a; + +	if (get_cpuid(cpuid, sizeof(cpuid))) +		goto out_clocks; +	ret = sscanf(cpuid, "%*[^,],%u,%[^,],%[^,],%[^,],%x", &family, model_c, +		     model, cpum_cf_v, &cpum_cf_a); +	if (ret != 5)		 /* Not available */ +		goto out_clocks; +	if (excl_kernel && (cpum_cf_a & 4)) +		return event; +	if (!excl_kernel && (cpum_cf_a & 2)) +		return event; + +	/* Fall through: missing authorization */ +out_clocks: +	event = excl_kernel ? "cpu-clock:u" : "cpu-clock"; + +#endif +	return event; +} +  static void do_something(void)  {  	fs_something(); @@ -592,10 +626,7 @@ static int do_test_code_reading(bool try_kcore)  		perf_evlist__set_maps(evlist, cpus, threads); -		if (excl_kernel) -			str = "cycles:u"; -		else -			str = "cycles"; +		str = do_determine_event(excl_kernel);  		pr_debug("Parsing event '%s'\n", str);  		ret = parse_events(evlist, str, NULL);  		if (ret < 0) {  | 
