perf evsel: Precalculate the sample size
So that we don't have to store it in the perf_session instance, because in the future perf_session instances may have multiple evlists, each with different sample_type/sizes. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> 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-ptod86fxkpgq3h62m9refkv4@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>hifive-unleashed-5.1
parent
0ecf4f0c02
commit
bde09467b5
|
@ -478,7 +478,6 @@ static int test__basic_mmap(void)
|
||||||
unsigned int nr_events[nsyscalls],
|
unsigned int nr_events[nsyscalls],
|
||||||
expected_nr_events[nsyscalls], i, j;
|
expected_nr_events[nsyscalls], i, j;
|
||||||
struct perf_evsel *evsels[nsyscalls], *evsel;
|
struct perf_evsel *evsels[nsyscalls], *evsel;
|
||||||
int sample_size = __perf_evsel__sample_size(attr.sample_type);
|
|
||||||
|
|
||||||
for (i = 0; i < nsyscalls; ++i) {
|
for (i = 0; i < nsyscalls; ++i) {
|
||||||
char name[64];
|
char name[64];
|
||||||
|
@ -563,7 +562,8 @@ static int test__basic_mmap(void)
|
||||||
goto out_munmap;
|
goto out_munmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = perf_event__parse_sample(event, attr.sample_type, sample_size,
|
err = perf_event__parse_sample(event, attr.sample_type,
|
||||||
|
evsels[0]->sample_size,
|
||||||
false, &sample, false);
|
false, &sample, false);
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_err("Can't parse sample, err = %d\n", err);
|
pr_err("Can't parse sample, err = %d\n", err);
|
||||||
|
@ -666,7 +666,7 @@ static int test__PERF_RECORD(void)
|
||||||
found_libc_mmap = false,
|
found_libc_mmap = false,
|
||||||
found_vdso_mmap = false,
|
found_vdso_mmap = false,
|
||||||
found_ld_mmap = false;
|
found_ld_mmap = false;
|
||||||
int err = -1, errs = 0, i, wakeups = 0, sample_size;
|
int err = -1, errs = 0, i, wakeups = 0;
|
||||||
u32 cpu;
|
u32 cpu;
|
||||||
int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, };
|
int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, };
|
||||||
|
|
||||||
|
@ -761,7 +761,6 @@ static int test__PERF_RECORD(void)
|
||||||
* event.
|
* event.
|
||||||
*/
|
*/
|
||||||
sample_type = perf_evlist__sample_type(evlist);
|
sample_type = perf_evlist__sample_type(evlist);
|
||||||
sample_size = __perf_evsel__sample_size(sample_type);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now that all is properly set up, enable the events, they will
|
* Now that all is properly set up, enable the events, they will
|
||||||
|
@ -789,7 +788,7 @@ static int test__PERF_RECORD(void)
|
||||||
nr_events[type]++;
|
nr_events[type]++;
|
||||||
|
|
||||||
err = perf_event__parse_sample(event, sample_type,
|
err = perf_event__parse_sample(event, sample_type,
|
||||||
sample_size, true,
|
evsel->sample_size, true,
|
||||||
&sample, false);
|
&sample, false);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
|
#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
|
||||||
#define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0))
|
#define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0))
|
||||||
|
|
||||||
int __perf_evsel__sample_size(u64 sample_type)
|
static int __perf_evsel__sample_size(u64 sample_type)
|
||||||
{
|
{
|
||||||
u64 mask = sample_type & PERF_SAMPLE_MASK;
|
u64 mask = sample_type & PERF_SAMPLE_MASK;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
@ -53,6 +53,7 @@ void perf_evsel__init(struct perf_evsel *evsel,
|
||||||
evsel->attr = *attr;
|
evsel->attr = *attr;
|
||||||
INIT_LIST_HEAD(&evsel->node);
|
INIT_LIST_HEAD(&evsel->node);
|
||||||
hists__init(&evsel->hists);
|
hists__init(&evsel->hists);
|
||||||
|
evsel->sample_size = __perf_evsel__sample_size(attr->sample_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx)
|
struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx)
|
||||||
|
|
|
@ -65,6 +65,7 @@ struct perf_evsel {
|
||||||
void *func;
|
void *func;
|
||||||
void *data;
|
void *data;
|
||||||
} handler;
|
} handler;
|
||||||
|
unsigned int sample_size;
|
||||||
bool supported;
|
bool supported;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -177,13 +178,6 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel,
|
||||||
return __perf_evsel__read(evsel, ncpus, nthreads, true);
|
return __perf_evsel__read(evsel, ncpus, nthreads, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __perf_evsel__sample_size(u64 sample_type);
|
|
||||||
|
|
||||||
static inline int perf_evsel__sample_size(struct perf_evsel *evsel)
|
|
||||||
{
|
|
||||||
return __perf_evsel__sample_size(evsel->attr.sample_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void hists__init(struct hists *hists);
|
void hists__init(struct hists *hists);
|
||||||
|
|
||||||
#endif /* __PERF_EVSEL_H */
|
#endif /* __PERF_EVSEL_H */
|
||||||
|
|
|
@ -806,7 +806,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,
|
||||||
|
|
||||||
first = list_entry(evlist->entries.next, struct perf_evsel, node);
|
first = list_entry(evlist->entries.next, struct perf_evsel, node);
|
||||||
err = perf_event__parse_sample(event, first->attr.sample_type,
|
err = perf_event__parse_sample(event, first->attr.sample_type,
|
||||||
perf_evsel__sample_size(first),
|
first->sample_size,
|
||||||
sample_id_all, &pevent->sample, false);
|
sample_id_all, &pevent->sample, false);
|
||||||
if (err)
|
if (err)
|
||||||
return PyErr_Format(PyExc_OSError,
|
return PyErr_Format(PyExc_OSError,
|
||||||
|
|
|
@ -16,6 +16,19 @@
|
||||||
#include "cpumap.h"
|
#include "cpumap.h"
|
||||||
#include "event-parse.h"
|
#include "event-parse.h"
|
||||||
|
|
||||||
|
int perf_session__parse_sample(struct perf_session *session,
|
||||||
|
const union perf_event *event,
|
||||||
|
struct perf_sample *sample)
|
||||||
|
{
|
||||||
|
struct perf_evsel *first;
|
||||||
|
first = list_entry(session->evlist->entries.next, struct perf_evsel, node);
|
||||||
|
|
||||||
|
return perf_event__parse_sample(event, session->sample_type,
|
||||||
|
first->sample_size,
|
||||||
|
session->sample_id_all, sample,
|
||||||
|
session->header.needs_swap);
|
||||||
|
}
|
||||||
|
|
||||||
static int perf_session__open(struct perf_session *self, bool force)
|
static int perf_session__open(struct perf_session *self, bool force)
|
||||||
{
|
{
|
||||||
struct stat input_stat;
|
struct stat input_stat;
|
||||||
|
@ -83,7 +96,6 @@ out_close:
|
||||||
void perf_session__update_sample_type(struct perf_session *self)
|
void perf_session__update_sample_type(struct perf_session *self)
|
||||||
{
|
{
|
||||||
self->sample_type = perf_evlist__sample_type(self->evlist);
|
self->sample_type = perf_evlist__sample_type(self->evlist);
|
||||||
self->sample_size = __perf_evsel__sample_size(self->sample_type);
|
|
||||||
self->sample_id_all = perf_evlist__sample_id_all(self->evlist);
|
self->sample_id_all = perf_evlist__sample_id_all(self->evlist);
|
||||||
self->id_hdr_size = perf_evlist__id_hdr_size(self->evlist);
|
self->id_hdr_size = perf_evlist__id_hdr_size(self->evlist);
|
||||||
self->host_machine.id_hdr_size = self->id_hdr_size;
|
self->host_machine.id_hdr_size = self->id_hdr_size;
|
||||||
|
|
|
@ -42,7 +42,6 @@ struct perf_session {
|
||||||
*/
|
*/
|
||||||
struct hists hists;
|
struct hists hists;
|
||||||
u64 sample_type;
|
u64 sample_type;
|
||||||
int sample_size;
|
|
||||||
int fd;
|
int fd;
|
||||||
bool fd_pipe;
|
bool fd_pipe;
|
||||||
bool repipe;
|
bool repipe;
|
||||||
|
@ -130,15 +129,9 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *self,
|
||||||
|
|
||||||
size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp);
|
size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp);
|
||||||
|
|
||||||
static inline int perf_session__parse_sample(struct perf_session *session,
|
int perf_session__parse_sample(struct perf_session *session,
|
||||||
const union perf_event *event,
|
const union perf_event *event,
|
||||||
struct perf_sample *sample)
|
struct perf_sample *sample);
|
||||||
{
|
|
||||||
return perf_event__parse_sample(event, session->sample_type,
|
|
||||||
session->sample_size,
|
|
||||||
session->sample_id_all, sample,
|
|
||||||
session->header.needs_swap);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int perf_session__synthesize_sample(struct perf_session *session,
|
static inline int perf_session__synthesize_sample(struct perf_session *session,
|
||||||
union perf_event *event,
|
union perf_event *event,
|
||||||
|
|
Loading…
Reference in New Issue