Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50d08e47 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf evlist: Introduce perf_evlist__add_attrs

Replacing the open coded equivalents in 'perf stat'.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-1btwadnf2tds2g07hsccsdse@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ebf294bf
Loading
Loading
Loading
Loading
+7 −33
Original line number Original line Diff line number Diff line
@@ -1107,22 +1107,13 @@ static const struct option options[] = {
 */
 */
static int add_default_attributes(void)
static int add_default_attributes(void)
{
{
	struct perf_evsel *pos;
	size_t attr_nr = 0;
	size_t c;

	/* Set attrs if no event is selected and !null_run: */
	/* Set attrs if no event is selected and !null_run: */
	if (null_run)
	if (null_run)
		return 0;
		return 0;


	if (!evsel_list->nr_entries) {
	if (!evsel_list->nr_entries) {
		for (c = 0; c < ARRAY_SIZE(default_attrs); c++) {
		if (perf_evlist__add_attrs_array(evsel_list, default_attrs) < 0)
			pos = perf_evsel__new(default_attrs + c, c + attr_nr);
			if (pos == NULL)
			return -1;
			return -1;
			perf_evlist__add(evsel_list, pos);
		}
		attr_nr += c;
	}
	}


	/* Detailed events get appended to the event list: */
	/* Detailed events get appended to the event list: */
@@ -1131,38 +1122,21 @@ static int add_default_attributes(void)
		return 0;
		return 0;


	/* Append detailed run extra attributes: */
	/* Append detailed run extra attributes: */
	for (c = 0; c < ARRAY_SIZE(detailed_attrs); c++) {
	if (perf_evlist__add_attrs_array(evsel_list, detailed_attrs) < 0)
		pos = perf_evsel__new(detailed_attrs + c, c + attr_nr);
		if (pos == NULL)
		return -1;
		return -1;
		perf_evlist__add(evsel_list, pos);
	}
	attr_nr += c;


	if (detailed_run < 2)
	if (detailed_run < 2)
		return 0;
		return 0;


	/* Append very detailed run extra attributes: */
	/* Append very detailed run extra attributes: */
	for (c = 0; c < ARRAY_SIZE(very_detailed_attrs); c++) {
	if (perf_evlist__add_attrs_array(evsel_list, very_detailed_attrs) < 0)
		pos = perf_evsel__new(very_detailed_attrs + c, c + attr_nr);
		if (pos == NULL)
		return -1;
		return -1;
		perf_evlist__add(evsel_list, pos);
	}


	if (detailed_run < 3)
	if (detailed_run < 3)
		return 0;
		return 0;


	/* Append very, very detailed run extra attributes: */
	/* Append very, very detailed run extra attributes: */
	for (c = 0; c < ARRAY_SIZE(very_very_detailed_attrs); c++) {
	return perf_evlist__add_attrs_array(evsel_list, very_very_detailed_attrs);
		pos = perf_evsel__new(very_very_detailed_attrs + c, c + attr_nr);
		if (pos == NULL)
			return -1;
		perf_evlist__add(evsel_list, pos);
	}


	return 0;
}
}


int cmd_stat(int argc, const char **argv, const char *prefix __used)
int cmd_stat(int argc, const char **argv, const char *prefix __used)
+34 −0
Original line number Original line Diff line number Diff line
@@ -13,6 +13,8 @@
#include "evsel.h"
#include "evsel.h"
#include "util.h"
#include "util.h"


#include "parse-events.h"

#include <sys/mman.h>
#include <sys/mman.h>


#include <linux/bitops.h>
#include <linux/bitops.h>
@@ -76,6 +78,14 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
	++evlist->nr_entries;
	++evlist->nr_entries;
}
}


static void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
					  struct list_head *list,
					  int nr_entries)
{
	list_splice_tail(list, &evlist->entries);
	evlist->nr_entries += nr_entries;
}

int perf_evlist__add_default(struct perf_evlist *evlist)
int perf_evlist__add_default(struct perf_evlist *evlist)
{
{
	struct perf_event_attr attr = {
	struct perf_event_attr attr = {
@@ -100,6 +110,30 @@ int perf_evlist__add_default(struct perf_evlist *evlist)
	return -ENOMEM;
	return -ENOMEM;
}
}


int perf_evlist__add_attrs(struct perf_evlist *evlist,
			   struct perf_event_attr *attrs, size_t nr_attrs)
{
	struct perf_evsel *evsel, *n;
	LIST_HEAD(head);
	size_t i;

	for (i = 0; i < nr_attrs; i++) {
		evsel = perf_evsel__new(attrs + i, evlist->nr_entries + i);
		if (evsel == NULL)
			goto out_delete_partial_list;
		list_add_tail(&evsel->node, &head);
	}

	perf_evlist__splice_list_tail(evlist, &head, nr_attrs);

	return 0;

out_delete_partial_list:
	list_for_each_entry_safe(evsel, n, &head, node)
		perf_evsel__delete(evsel);
	return -1;
}

void perf_evlist__disable(struct perf_evlist *evlist)
void perf_evlist__disable(struct perf_evlist *evlist)
{
{
	int cpu, thread;
	int cpu, thread;
+7 −0
Original line number Original line Diff line number Diff line
@@ -2,8 +2,10 @@
#define __PERF_EVLIST_H 1
#define __PERF_EVLIST_H 1


#include <linux/list.h>
#include <linux/list.h>
#include <stdio.h>
#include "../perf.h"
#include "../perf.h"
#include "event.h"
#include "event.h"
#include "util.h"


struct pollfd;
struct pollfd;
struct thread_map;
struct thread_map;
@@ -39,6 +41,11 @@ void perf_evlist__delete(struct perf_evlist *evlist);


void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry);
void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry);
int perf_evlist__add_default(struct perf_evlist *evlist);
int perf_evlist__add_default(struct perf_evlist *evlist);
int perf_evlist__add_attrs(struct perf_evlist *evlist,
			   struct perf_event_attr *attrs, size_t nr_attrs);

#define perf_evlist__add_attrs_array(evlist, array) \
	perf_evlist__add_attrs(evlist, array, ARRAY_SIZE(array))


void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
			 int cpu, int thread, u64 id);
			 int cpu, int thread, u64 id);