perf symbols: Rename kthreads to kmaps, using another abstraction for it
Using a struct thread instance just to hold the kernel space maps (vmlinux + modules) is overkill and confuses people trying to understand the perf symbols abstractions. The kernel maps are really present in all threads, i.e. the kernel is a library, not a separate thread. So introduce the 'map_groups' abstraction and use it for the kernel maps, now in the kmaps global variable. It, in turn, will move, together with the threads list to the perf_file abstraction, so that we can support multiple perf_file instances, needed by perf diff. Brainstormed-with: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Eduardo Habkost <ehabkost@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: <1260550239-5372-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
58e9f94138
commit
9958e1f0ae
@@ -5,52 +5,63 @@
|
||||
#include <unistd.h>
|
||||
#include "symbol.h"
|
||||
|
||||
struct thread {
|
||||
struct rb_node rb_node;
|
||||
struct map_groups {
|
||||
struct rb_root maps[MAP__NR_TYPES];
|
||||
struct list_head removed_maps[MAP__NR_TYPES];
|
||||
pid_t pid;
|
||||
bool use_modules;
|
||||
};
|
||||
|
||||
struct thread {
|
||||
struct rb_node rb_node;
|
||||
struct map_groups mg;
|
||||
pid_t pid;
|
||||
char shortname[3];
|
||||
char *comm;
|
||||
int comm_len;
|
||||
};
|
||||
|
||||
void thread__init(struct thread *self, pid_t pid);
|
||||
void map_groups__init(struct map_groups *self);
|
||||
int thread__set_comm(struct thread *self, const char *comm);
|
||||
int thread__comm_len(struct thread *self);
|
||||
struct thread *threads__findnew(pid_t pid);
|
||||
struct thread *register_idle_thread(void);
|
||||
void thread__insert_map(struct thread *self, struct map *map);
|
||||
int thread__fork(struct thread *self, struct thread *parent);
|
||||
size_t thread__fprintf_maps(struct thread *self, FILE *fp);
|
||||
size_t map_groups__fprintf_maps(struct map_groups *self, FILE *fp);
|
||||
size_t threads__fprintf(FILE *fp);
|
||||
|
||||
void maps__insert(struct rb_root *maps, struct map *map);
|
||||
struct map *maps__find(struct rb_root *maps, u64 addr);
|
||||
|
||||
static inline void map_groups__insert(struct map_groups *self, struct map *map)
|
||||
{
|
||||
maps__insert(&self->maps[map->type], map);
|
||||
}
|
||||
|
||||
static inline struct map *map_groups__find(struct map_groups *self,
|
||||
enum map_type type, u64 addr)
|
||||
{
|
||||
return maps__find(&self->maps[type], addr);
|
||||
}
|
||||
|
||||
static inline struct map *thread__find_map(struct thread *self,
|
||||
enum map_type type, u64 addr)
|
||||
{
|
||||
return self ? maps__find(&self->maps[type], addr) : NULL;
|
||||
}
|
||||
|
||||
static inline void __thread__insert_map(struct thread *self, struct map *map)
|
||||
{
|
||||
maps__insert(&self->maps[map->type], map);
|
||||
return self ? map_groups__find(&self->mg, type, addr) : NULL;
|
||||
}
|
||||
|
||||
void thread__find_addr_location(struct thread *self, u8 cpumode,
|
||||
enum map_type type, u64 addr,
|
||||
struct addr_location *al,
|
||||
symbol_filter_t filter);
|
||||
struct symbol *thread__find_symbol(struct thread *self,
|
||||
enum map_type type, u64 addr,
|
||||
symbol_filter_t filter);
|
||||
struct symbol *map_groups__find_symbol(struct map_groups *self,
|
||||
enum map_type type, u64 addr,
|
||||
symbol_filter_t filter);
|
||||
|
||||
static inline struct symbol *
|
||||
thread__find_function(struct thread *self, u64 addr, symbol_filter_t filter)
|
||||
map_groups__find_function(struct map_groups *self, u64 addr,
|
||||
symbol_filter_t filter)
|
||||
{
|
||||
return thread__find_symbol(self, MAP__FUNCTION, addr, filter);
|
||||
return map_groups__find_symbol(self, MAP__FUNCTION, addr, filter);
|
||||
}
|
||||
#endif /* __PERF_THREAD_H */
|
||||
|
Reference in New Issue
Block a user