mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 15:42:32 +00:00
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: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
ebf294bf4f
commit
50d08e47bc
3 changed files with 48 additions and 33 deletions
|
@ -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)
|
||||||
|
|
|
@ -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 @@ error:
|
||||||
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue