perf session: Pass the perf_session to the event handling operations
They will need it to get the right threads list, etc. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1260741029-4430-1-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committed by
Ingo Molnar

parent
2cd9046cc5
commit
d8f66248d6
@@ -8,7 +8,8 @@ static struct perf_file_handler *curr_handler;
|
||||
static unsigned long mmap_window = 32;
|
||||
static char __cwd[PATH_MAX];
|
||||
|
||||
static int process_event_stub(event_t *event __used)
|
||||
static int process_event_stub(event_t *event __used,
|
||||
struct perf_session *session __used)
|
||||
{
|
||||
dump_printf(": unhandled!\n");
|
||||
return 0;
|
||||
@@ -61,8 +62,8 @@ void event__print_totals(void)
|
||||
event__name[i], event__total[i]);
|
||||
}
|
||||
|
||||
static int
|
||||
process_event(event_t *event, unsigned long offset, unsigned long head)
|
||||
static int process_event(event_t *event, struct perf_session *session,
|
||||
unsigned long offset, unsigned long head)
|
||||
{
|
||||
trace_event(event);
|
||||
|
||||
@@ -77,23 +78,23 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
|
||||
|
||||
switch (event->header.type) {
|
||||
case PERF_RECORD_SAMPLE:
|
||||
return curr_handler->process_sample_event(event);
|
||||
return curr_handler->process_sample_event(event, session);
|
||||
case PERF_RECORD_MMAP:
|
||||
return curr_handler->process_mmap_event(event);
|
||||
return curr_handler->process_mmap_event(event, session);
|
||||
case PERF_RECORD_COMM:
|
||||
return curr_handler->process_comm_event(event);
|
||||
return curr_handler->process_comm_event(event, session);
|
||||
case PERF_RECORD_FORK:
|
||||
return curr_handler->process_fork_event(event);
|
||||
return curr_handler->process_fork_event(event, session);
|
||||
case PERF_RECORD_EXIT:
|
||||
return curr_handler->process_exit_event(event);
|
||||
return curr_handler->process_exit_event(event, session);
|
||||
case PERF_RECORD_LOST:
|
||||
return curr_handler->process_lost_event(event);
|
||||
return curr_handler->process_lost_event(event, session);
|
||||
case PERF_RECORD_READ:
|
||||
return curr_handler->process_read_event(event);
|
||||
return curr_handler->process_read_event(event, session);
|
||||
case PERF_RECORD_THROTTLE:
|
||||
return curr_handler->process_throttle_event(event);
|
||||
return curr_handler->process_throttle_event(event, session);
|
||||
case PERF_RECORD_UNTHROTTLE:
|
||||
return curr_handler->process_unthrottle_event(event);
|
||||
return curr_handler->process_unthrottle_event(event, session);
|
||||
default:
|
||||
curr_handler->total_unknown++;
|
||||
return -1;
|
||||
@@ -209,7 +210,7 @@ more:
|
||||
(void *)(long)event->header.size,
|
||||
event->header.type);
|
||||
|
||||
if (!size || process_event(event, offset, head) < 0) {
|
||||
if (!size || process_event(event, self, offset, head) < 0) {
|
||||
|
||||
dump_printf("%p [%p]: skipping unknown header type: %d\n",
|
||||
(void *)(offset + head),
|
||||
|
@@ -5,7 +5,10 @@
|
||||
#include "header.h"
|
||||
#include "session.h"
|
||||
|
||||
typedef int (*event_type_handler_t)(event_t *);
|
||||
struct perf_session;
|
||||
|
||||
typedef int (*event_type_handler_t)(event_t *self,
|
||||
struct perf_session *session);
|
||||
|
||||
struct perf_file_handler {
|
||||
event_type_handler_t process_sample_event;
|
||||
|
@@ -5,7 +5,9 @@
|
||||
#include "thread.h"
|
||||
|
||||
static pid_t event__synthesize_comm(pid_t pid, int full,
|
||||
int (*process)(event_t *event))
|
||||
int (*process)(event_t *event,
|
||||
struct perf_session *session),
|
||||
struct perf_session *session)
|
||||
{
|
||||
event_t ev;
|
||||
char filename[PATH_MAX];
|
||||
@@ -54,7 +56,7 @@ out_race:
|
||||
if (!full) {
|
||||
ev.comm.tid = pid;
|
||||
|
||||
process(&ev);
|
||||
process(&ev, session);
|
||||
goto out_fclose;
|
||||
}
|
||||
|
||||
@@ -72,7 +74,7 @@ out_race:
|
||||
|
||||
ev.comm.tid = pid;
|
||||
|
||||
process(&ev);
|
||||
process(&ev, session);
|
||||
}
|
||||
closedir(tasks);
|
||||
|
||||
@@ -86,7 +88,9 @@ out_failure:
|
||||
}
|
||||
|
||||
static int event__synthesize_mmap_events(pid_t pid, pid_t tgid,
|
||||
int (*process)(event_t *event))
|
||||
int (*process)(event_t *event,
|
||||
struct perf_session *session),
|
||||
struct perf_session *session)
|
||||
{
|
||||
char filename[PATH_MAX];
|
||||
FILE *fp;
|
||||
@@ -141,7 +145,7 @@ static int event__synthesize_mmap_events(pid_t pid, pid_t tgid,
|
||||
ev.mmap.pid = tgid;
|
||||
ev.mmap.tid = pid;
|
||||
|
||||
process(&ev);
|
||||
process(&ev, session);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,15 +153,20 @@ static int event__synthesize_mmap_events(pid_t pid, pid_t tgid,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int event__synthesize_thread(pid_t pid, int (*process)(event_t *event))
|
||||
int event__synthesize_thread(pid_t pid,
|
||||
int (*process)(event_t *event,
|
||||
struct perf_session *session),
|
||||
struct perf_session *session)
|
||||
{
|
||||
pid_t tgid = event__synthesize_comm(pid, 1, process);
|
||||
pid_t tgid = event__synthesize_comm(pid, 1, process, session);
|
||||
if (tgid == -1)
|
||||
return -1;
|
||||
return event__synthesize_mmap_events(pid, tgid, process);
|
||||
return event__synthesize_mmap_events(pid, tgid, process, session);
|
||||
}
|
||||
|
||||
void event__synthesize_threads(int (*process)(event_t *event))
|
||||
void event__synthesize_threads(int (*process)(event_t *event,
|
||||
struct perf_session *session),
|
||||
struct perf_session *session)
|
||||
{
|
||||
DIR *proc;
|
||||
struct dirent dirent, *next;
|
||||
@@ -171,7 +180,7 @@ void event__synthesize_threads(int (*process)(event_t *event))
|
||||
if (*end) /* only interested in proper numerical dirents */
|
||||
continue;
|
||||
|
||||
event__synthesize_thread(pid, process);
|
||||
event__synthesize_thread(pid, process, session);
|
||||
}
|
||||
|
||||
closedir(proc);
|
||||
@@ -182,7 +191,7 @@ int event__cwdlen;
|
||||
|
||||
struct events_stats event__stats;
|
||||
|
||||
int event__process_comm(event_t *self)
|
||||
int event__process_comm(event_t *self, struct perf_session *session __used)
|
||||
{
|
||||
struct thread *thread = threads__findnew(self->comm.pid);
|
||||
|
||||
@@ -196,14 +205,14 @@ int event__process_comm(event_t *self)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int event__process_lost(event_t *self)
|
||||
int event__process_lost(event_t *self, struct perf_session *session __used)
|
||||
{
|
||||
dump_printf(": id:%Ld: lost:%Ld\n", self->lost.id, self->lost.lost);
|
||||
event__stats.lost += self->lost.lost;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int event__process_mmap(event_t *self)
|
||||
int event__process_mmap(event_t *self, struct perf_session *session __used)
|
||||
{
|
||||
struct thread *thread = threads__findnew(self->mmap.pid);
|
||||
struct map *map = map__new(&self->mmap, MAP__FUNCTION,
|
||||
@@ -224,7 +233,7 @@ int event__process_mmap(event_t *self)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int event__process_task(event_t *self)
|
||||
int event__process_task(event_t *self, struct perf_session *session __used)
|
||||
{
|
||||
struct thread *thread = threads__findnew(self->fork.pid);
|
||||
struct thread *parent = threads__findnew(self->fork.ppid);
|
||||
|
@@ -156,18 +156,25 @@ struct symbol *map__find_symbol_by_name(struct map *self, const char *name,
|
||||
void map__fixup_start(struct map *self);
|
||||
void map__fixup_end(struct map *self);
|
||||
|
||||
int event__synthesize_thread(pid_t pid, int (*process)(event_t *event));
|
||||
void event__synthesize_threads(int (*process)(event_t *event));
|
||||
struct perf_session;
|
||||
|
||||
int event__synthesize_thread(pid_t pid,
|
||||
int (*process)(event_t *event,
|
||||
struct perf_session *session),
|
||||
struct perf_session *session);
|
||||
void event__synthesize_threads(int (*process)(event_t *event,
|
||||
struct perf_session *session),
|
||||
struct perf_session *session);
|
||||
|
||||
extern char *event__cwd;
|
||||
extern int event__cwdlen;
|
||||
extern struct events_stats event__stats;
|
||||
extern unsigned long event__total[PERF_RECORD_MAX];
|
||||
|
||||
int event__process_comm(event_t *self);
|
||||
int event__process_lost(event_t *self);
|
||||
int event__process_mmap(event_t *self);
|
||||
int event__process_task(event_t *self);
|
||||
int event__process_comm(event_t *self, struct perf_session *session);
|
||||
int event__process_lost(event_t *self, struct perf_session *session);
|
||||
int event__process_mmap(event_t *self, struct perf_session *session);
|
||||
int event__process_task(event_t *self, struct perf_session *session);
|
||||
|
||||
struct addr_location;
|
||||
int event__preprocess_sample(const event_t *self, struct addr_location *al,
|
||||
|
Reference in New Issue
Block a user