mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 12:16:49 +07:00
9de89fe7c5
I noticed while writing the first test in 'perf regtest' that to just test the symbol handling routines one needs to create a perf session, that is a layer centered on a perf.data file, events, etc, so I untied these layers. This reduces the complexity for the users as the number of parameters to most of the symbols and session APIs now was reduced while not adding more state to all the map instances by only having data that is needed to split the kernel (kallsyms and ELF symtab sections) maps and do vmlinux relocation on the main kernel map. 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: <1265223128-11786-1-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
86 lines
2.1 KiB
C
86 lines
2.1 KiB
C
#ifndef __PERF_SESSION_H
|
|
#define __PERF_SESSION_H
|
|
|
|
#include "event.h"
|
|
#include "header.h"
|
|
#include "symbol.h"
|
|
#include "thread.h"
|
|
#include <linux/rbtree.h>
|
|
#include "../../../include/linux/perf_event.h"
|
|
|
|
struct ip_callchain;
|
|
struct thread;
|
|
|
|
struct perf_session {
|
|
struct perf_header header;
|
|
unsigned long size;
|
|
unsigned long mmap_window;
|
|
struct map_groups kmaps;
|
|
struct rb_root threads;
|
|
struct thread *last_match;
|
|
struct map *vmlinux_maps[MAP__NR_TYPES];
|
|
struct events_stats events_stats;
|
|
unsigned long event_total[PERF_RECORD_MAX];
|
|
unsigned long unknown_events;
|
|
struct rb_root hists;
|
|
u64 sample_type;
|
|
struct ref_reloc_sym ref_reloc_sym;
|
|
int fd;
|
|
int cwdlen;
|
|
char *cwd;
|
|
char filename[0];
|
|
};
|
|
|
|
typedef int (*event_op)(event_t *self, struct perf_session *session);
|
|
|
|
struct perf_event_ops {
|
|
event_op sample,
|
|
mmap,
|
|
comm,
|
|
fork,
|
|
exit,
|
|
lost,
|
|
read,
|
|
throttle,
|
|
unthrottle;
|
|
};
|
|
|
|
struct perf_session *perf_session__new(const char *filename, int mode, bool force);
|
|
void perf_session__delete(struct perf_session *self);
|
|
|
|
void perf_event_header__bswap(struct perf_event_header *self);
|
|
|
|
int perf_session__process_events(struct perf_session *self,
|
|
struct perf_event_ops *event_ops);
|
|
|
|
struct symbol **perf_session__resolve_callchain(struct perf_session *self,
|
|
struct thread *thread,
|
|
struct ip_callchain *chain,
|
|
struct symbol **parent);
|
|
|
|
bool perf_session__has_traces(struct perf_session *self, const char *msg);
|
|
|
|
int perf_header__read_build_ids(struct perf_header *self, int input,
|
|
u64 offset, u64 file_size);
|
|
|
|
int perf_session__set_kallsyms_ref_reloc_sym(struct perf_session *self,
|
|
const char *symbol_name,
|
|
u64 addr);
|
|
|
|
void mem_bswap_64(void *src, int byte_size);
|
|
|
|
static inline int __perf_session__create_kernel_maps(struct perf_session *self,
|
|
struct dso *kernel)
|
|
{
|
|
return __map_groups__create_kernel_maps(&self->kmaps,
|
|
self->vmlinux_maps, kernel);
|
|
}
|
|
|
|
static inline struct map *
|
|
perf_session__new_module_map(struct perf_session *self,
|
|
u64 start, const char *filename)
|
|
{
|
|
return map_groups__new_module(&self->kmaps, start, filename);
|
|
}
|
|
#endif /* __PERF_SESSION_H */
|