perf ordered_events: Allow tools to specify a deliver method

So that we can simplify the deliver method to pass just:

 (ordered_events, ordered_event, sample);

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-j0s4bpxs5qza5tnkvjwom9rw@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent b7b61cbe
...@@ -181,8 +181,7 @@ static int __ordered_events__flush(struct ordered_events *oe) ...@@ -181,8 +181,7 @@ static int __ordered_events__flush(struct ordered_events *oe)
if (ret) if (ret)
pr_err("Can't parse sample, err = %d\n", ret); pr_err("Can't parse sample, err = %d\n", ret);
else { else {
ret = machines__deliver_event(oe->machines, oe->evlist, iter->event, ret = oe->deliver(oe, iter, &sample);
&sample, oe->tool, iter->file_offset);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -264,7 +263,8 @@ int ordered_events__flush(struct ordered_events *oe, enum oe_flush how) ...@@ -264,7 +263,8 @@ int ordered_events__flush(struct ordered_events *oe, enum oe_flush how)
} }
void ordered_events__init(struct ordered_events *oe, struct machines *machines, void ordered_events__init(struct ordered_events *oe, struct machines *machines,
struct perf_evlist *evlist, struct perf_tool *tool) struct perf_evlist *evlist, struct perf_tool *tool,
ordered_events__deliver_t deliver)
{ {
INIT_LIST_HEAD(&oe->events); INIT_LIST_HEAD(&oe->events);
INIT_LIST_HEAD(&oe->cache); INIT_LIST_HEAD(&oe->cache);
...@@ -274,6 +274,7 @@ void ordered_events__init(struct ordered_events *oe, struct machines *machines, ...@@ -274,6 +274,7 @@ void ordered_events__init(struct ordered_events *oe, struct machines *machines,
oe->evlist = evlist; oe->evlist = evlist;
oe->machines = machines; oe->machines = machines;
oe->tool = tool; oe->tool = tool;
oe->deliver = deliver;
} }
void ordered_events__free(struct ordered_events *oe) void ordered_events__free(struct ordered_events *oe)
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
struct perf_tool; struct perf_tool;
struct perf_evlist; struct perf_evlist;
struct perf_sample;
struct machines; struct machines;
struct ordered_event { struct ordered_event {
...@@ -21,6 +22,12 @@ enum oe_flush { ...@@ -21,6 +22,12 @@ enum oe_flush {
OE_FLUSH__HALF, OE_FLUSH__HALF,
}; };
struct ordered_events;
typedef int (*ordered_events__deliver_t)(struct ordered_events *oe,
struct ordered_event *event,
struct perf_sample *sample);
struct ordered_events { struct ordered_events {
u64 last_flush; u64 last_flush;
u64 next_flush; u64 next_flush;
...@@ -35,6 +42,7 @@ struct ordered_events { ...@@ -35,6 +42,7 @@ struct ordered_events {
struct machines *machines; struct machines *machines;
struct perf_evlist *evlist; struct perf_evlist *evlist;
struct perf_tool *tool; struct perf_tool *tool;
ordered_events__deliver_t deliver;
int buffer_idx; int buffer_idx;
unsigned int nr_events; unsigned int nr_events;
enum oe_flush last_flush_type; enum oe_flush last_flush_type;
...@@ -46,7 +54,8 @@ struct ordered_event *ordered_events__new(struct ordered_events *oe, u64 timesta ...@@ -46,7 +54,8 @@ struct ordered_event *ordered_events__new(struct ordered_events *oe, u64 timesta
void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event); void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event);
int ordered_events__flush(struct ordered_events *oe, enum oe_flush how); int ordered_events__flush(struct ordered_events *oe, enum oe_flush how);
void ordered_events__init(struct ordered_events *oe, struct machines *machines, void ordered_events__init(struct ordered_events *oe, struct machines *machines,
struct perf_evlist *evlsit, struct perf_tool *tool); struct perf_evlist *evlsit, struct perf_tool *tool,
ordered_events__deliver_t deliver);
void ordered_events__free(struct ordered_events *oe); void ordered_events__free(struct ordered_events *oe);
static inline static inline
......
...@@ -16,6 +16,12 @@ ...@@ -16,6 +16,12 @@
#include "perf_regs.h" #include "perf_regs.h"
#include "asm/bug.h" #include "asm/bug.h"
static int machines__deliver_event(struct machines *machines,
struct perf_evlist *evlist,
union perf_event *event,
struct perf_sample *sample,
struct perf_tool *tool, u64 file_offset);
static int perf_session__open(struct perf_session *session) static int perf_session__open(struct perf_session *session)
{ {
struct perf_data_file *file = session->file; struct perf_data_file *file = session->file;
...@@ -86,6 +92,14 @@ static void perf_session__set_comm_exec(struct perf_session *session) ...@@ -86,6 +92,14 @@ static void perf_session__set_comm_exec(struct perf_session *session)
machines__set_comm_exec(&session->machines, comm_exec); machines__set_comm_exec(&session->machines, comm_exec);
} }
static int ordered_events__deliver_event(struct ordered_events *oe,
struct ordered_event *event,
struct perf_sample *sample)
{
return machines__deliver_event(oe->machines, oe->evlist, event->event,
sample, oe->tool, event->file_offset);
}
struct perf_session *perf_session__new(struct perf_data_file *file, struct perf_session *perf_session__new(struct perf_data_file *file,
bool repipe, struct perf_tool *tool) bool repipe, struct perf_tool *tool)
{ {
...@@ -125,8 +139,10 @@ struct perf_session *perf_session__new(struct perf_data_file *file, ...@@ -125,8 +139,10 @@ struct perf_session *perf_session__new(struct perf_data_file *file,
tool->ordered_events && !perf_evlist__sample_id_all(session->evlist)) { tool->ordered_events && !perf_evlist__sample_id_all(session->evlist)) {
dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n"); dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n");
tool->ordered_events = false; tool->ordered_events = false;
} else } else {
ordered_events__init(&session->ordered_events, &session->machines, session->evlist, tool); ordered_events__init(&session->ordered_events, &session->machines,
session->evlist, tool, ordered_events__deliver_event);
}
return session; return session;
...@@ -888,11 +904,11 @@ static int ...@@ -888,11 +904,11 @@ static int
&sample->read.one, machine); &sample->read.one, machine);
} }
int machines__deliver_event(struct machines *machines, static int machines__deliver_event(struct machines *machines,
struct perf_evlist *evlist, struct perf_evlist *evlist,
union perf_event *event, union perf_event *event,
struct perf_sample *sample, struct perf_sample *sample,
struct perf_tool *tool, u64 file_offset) struct perf_tool *tool, u64 file_offset)
{ {
struct perf_evsel *evsel; struct perf_evsel *evsel;
struct machine *machine; struct machine *machine;
......
...@@ -55,12 +55,6 @@ int perf_session__queue_event(struct perf_session *s, union perf_event *event, ...@@ -55,12 +55,6 @@ int perf_session__queue_event(struct perf_session *s, union perf_event *event,
void perf_tool__fill_defaults(struct perf_tool *tool); void perf_tool__fill_defaults(struct perf_tool *tool);
int machines__deliver_event(struct machines *machines,
struct perf_evlist *evlist,
union perf_event *event,
struct perf_sample *sample,
struct perf_tool *tool, u64 file_offset);
int perf_session__resolve_callchain(struct perf_session *session, int perf_session__resolve_callchain(struct perf_session *session,
struct perf_evsel *evsel, struct perf_evsel *evsel,
struct thread *thread, struct thread *thread,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment