 9df38e82e2
			
		
	
	
	9df38e82e2
	
	
	
		
			
			Move 'struct perf_counts' allocation|free|reset code into separate functions. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1434269985-521-13-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
			
				
	
	
		
			132 lines
		
	
	
	
		
			2.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			2.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <math.h>
 | |
| #include "stat.h"
 | |
| #include "evsel.h"
 | |
| 
 | |
| void update_stats(struct stats *stats, u64 val)
 | |
| {
 | |
| 	double delta;
 | |
| 
 | |
| 	stats->n++;
 | |
| 	delta = val - stats->mean;
 | |
| 	stats->mean += delta / stats->n;
 | |
| 	stats->M2 += delta*(val - stats->mean);
 | |
| 
 | |
| 	if (val > stats->max)
 | |
| 		stats->max = val;
 | |
| 
 | |
| 	if (val < stats->min)
 | |
| 		stats->min = val;
 | |
| }
 | |
| 
 | |
| double avg_stats(struct stats *stats)
 | |
| {
 | |
| 	return stats->mean;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
 | |
|  *
 | |
|  *       (\Sum n_i^2) - ((\Sum n_i)^2)/n
 | |
|  * s^2 = -------------------------------
 | |
|  *                  n - 1
 | |
|  *
 | |
|  * http://en.wikipedia.org/wiki/Stddev
 | |
|  *
 | |
|  * The std dev of the mean is related to the std dev by:
 | |
|  *
 | |
|  *             s
 | |
|  * s_mean = -------
 | |
|  *          sqrt(n)
 | |
|  *
 | |
|  */
 | |
| double stddev_stats(struct stats *stats)
 | |
| {
 | |
| 	double variance, variance_mean;
 | |
| 
 | |
| 	if (stats->n < 2)
 | |
| 		return 0.0;
 | |
| 
 | |
| 	variance = stats->M2 / (stats->n - 1);
 | |
| 	variance_mean = variance / stats->n;
 | |
| 
 | |
| 	return sqrt(variance_mean);
 | |
| }
 | |
| 
 | |
| double rel_stddev_stats(double stddev, double avg)
 | |
| {
 | |
| 	double pct = 0.0;
 | |
| 
 | |
| 	if (avg)
 | |
| 		pct = 100.0 * stddev/avg;
 | |
| 
 | |
| 	return pct;
 | |
| }
 | |
| 
 | |
| bool __perf_evsel_stat__is(struct perf_evsel *evsel,
 | |
| 			   enum perf_stat_evsel_id id)
 | |
| {
 | |
| 	struct perf_stat *ps = evsel->priv;
 | |
| 
 | |
| 	return ps->id == id;
 | |
| }
 | |
| 
 | |
| #define ID(id, name) [PERF_STAT_EVSEL_ID__##id] = #name
 | |
| static const char *id_str[PERF_STAT_EVSEL_ID__MAX] = {
 | |
| 	ID(NONE,		x),
 | |
| 	ID(CYCLES_IN_TX,	cpu/cycles-t/),
 | |
| 	ID(TRANSACTION_START,	cpu/tx-start/),
 | |
| 	ID(ELISION_START,	cpu/el-start/),
 | |
| 	ID(CYCLES_IN_TX_CP,	cpu/cycles-ct/),
 | |
| };
 | |
| #undef ID
 | |
| 
 | |
| void perf_stat_evsel_id_init(struct perf_evsel *evsel)
 | |
| {
 | |
| 	struct perf_stat *ps = evsel->priv;
 | |
| 	int i;
 | |
| 
 | |
| 	/* ps->id is 0 hence PERF_STAT_EVSEL_ID__NONE by default */
 | |
| 
 | |
| 	for (i = 0; i < PERF_STAT_EVSEL_ID__MAX; i++) {
 | |
| 		if (!strcmp(perf_evsel__name(evsel), id_str[i])) {
 | |
| 			ps->id = i;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| struct perf_counts *perf_counts__new(int ncpus)
 | |
| {
 | |
| 	int size = sizeof(struct perf_counts) +
 | |
| 		   ncpus * sizeof(struct perf_counts_values);
 | |
| 
 | |
| 	return zalloc(size);
 | |
| }
 | |
| 
 | |
| void perf_counts__delete(struct perf_counts *counts)
 | |
| {
 | |
| 	free(counts);
 | |
| }
 | |
| 
 | |
| static void perf_counts__reset(struct perf_counts *counts, int ncpus)
 | |
| {
 | |
| 	memset(counts, 0, (sizeof(*counts) +
 | |
| 	       (ncpus * sizeof(struct perf_counts_values))));
 | |
| }
 | |
| 
 | |
| void perf_evsel__reset_counts(struct perf_evsel *evsel, int ncpus)
 | |
| {
 | |
| 	perf_counts__reset(evsel->counts, ncpus);
 | |
| }
 | |
| 
 | |
| int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus)
 | |
| {
 | |
| 	evsel->counts = perf_counts__new(ncpus);
 | |
| 	return evsel->counts != NULL ? 0 : -ENOMEM;
 | |
| }
 | |
| 
 | |
| void perf_evsel__free_counts(struct perf_evsel *evsel)
 | |
| {
 | |
| 	perf_counts__delete(evsel->counts);
 | |
| 	evsel->counts = NULL;
 | |
| }
 |