Commit 83acca9f authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

perf dsos: Attempt to better abstract DSOs internals

Move functions from machine and build-id to dsos. Pass 'struct dsos'
rather than internal state.

Rename some functions to better represent which data structure they
operate on.
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Anne Macedo <retpolanne@posteo.net>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ben Gainey <ben.gainey@arm.com>
Cc: Changbin Du <changbin.du@huawei.com>
Cc: Chengen Du <chengen.du@canonical.com>
Cc: Colin Ian King <colin.i.king@gmail.com>
Cc: Ilkka Koskinen <ilkka@os.amperecomputing.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Li Dong <lidong@vivo.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Markus Elfring <Markus.Elfring@web.de>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paran Lee <p4ranlee@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Song Liu <song@kernel.org>
Cc: Sun Haiyong <sunhaiyong@loongson.cn>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Yang Jihong <yangjihong1@huawei.com>
Cc: Yanteng Si <siyanteng@loongson.cn>
Cc: Yicong Yang <yangyicong@hisilicon.com>
Cc: zhaimingbing <zhaimingbing@cmss.chinamobile.com>
Link: https://lore.kernel.org/r/20240410064214.2755936-2-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 792bc998
...@@ -2122,7 +2122,7 @@ static int __cmd_inject(struct perf_inject *inject) ...@@ -2122,7 +2122,7 @@ static int __cmd_inject(struct perf_inject *inject)
*/ */
if (perf_header__has_feat(&session->header, HEADER_BUILD_ID) && if (perf_header__has_feat(&session->header, HEADER_BUILD_ID) &&
inject->have_auxtrace && !inject->itrace_synth_opts.set) inject->have_auxtrace && !inject->itrace_synth_opts.set)
dsos__hit_all(session); perf_session__dsos_hit_all(session);
/* /*
* The AUX areas have been removed and replaced with * The AUX areas have been removed and replaced with
* synthesized hardware events, so clear the feature flag. * synthesized hardware events, so clear the feature flag.
......
...@@ -1788,7 +1788,7 @@ record__finish_output(struct record *rec) ...@@ -1788,7 +1788,7 @@ record__finish_output(struct record *rec)
process_buildids(rec); process_buildids(rec);
if (rec->buildid_all) if (rec->buildid_all)
dsos__hit_all(rec->session); perf_session__dsos_hit_all(rec->session);
} }
perf_session__write_header(rec->session, rec->evlist, fd, true); perf_session__write_header(rec->session, rec->evlist, fd, true);
......
...@@ -390,42 +390,6 @@ int perf_session__write_buildid_table(struct perf_session *session, ...@@ -390,42 +390,6 @@ int perf_session__write_buildid_table(struct perf_session *session,
return err; return err;
} }
static int __dsos__hit_all(struct list_head *head)
{
struct dso *pos;
list_for_each_entry(pos, head, node)
pos->hit = true;
return 0;
}
static int machine__hit_all_dsos(struct machine *machine)
{
return __dsos__hit_all(&machine->dsos.head);
}
int dsos__hit_all(struct perf_session *session)
{
struct rb_node *nd;
int err;
err = machine__hit_all_dsos(&session->machines.host);
if (err)
return err;
for (nd = rb_first_cached(&session->machines.guests); nd;
nd = rb_next(nd)) {
struct machine *pos = rb_entry(nd, struct machine, rb_node);
err = machine__hit_all_dsos(pos);
if (err)
return err;
}
return 0;
}
void disable_buildid_cache(void) void disable_buildid_cache(void)
{ {
no_buildid_cache = true; no_buildid_cache = true;
...@@ -992,7 +956,7 @@ int perf_session__cache_build_ids(struct perf_session *session) ...@@ -992,7 +956,7 @@ int perf_session__cache_build_ids(struct perf_session *session)
static bool machine__read_build_ids(struct machine *machine, bool with_hits) static bool machine__read_build_ids(struct machine *machine, bool with_hits)
{ {
return __dsos__read_build_ids(&machine->dsos.head, with_hits); return __dsos__read_build_ids(&machine->dsos, with_hits);
} }
bool perf_session__read_build_ids(struct perf_session *session, bool with_hits) bool perf_session__read_build_ids(struct perf_session *session, bool with_hits)
......
...@@ -39,8 +39,6 @@ int build_id__mark_dso_hit(struct perf_tool *tool, union perf_event *event, ...@@ -39,8 +39,6 @@ int build_id__mark_dso_hit(struct perf_tool *tool, union perf_event *event,
struct perf_sample *sample, struct evsel *evsel, struct perf_sample *sample, struct evsel *evsel,
struct machine *machine); struct machine *machine);
int dsos__hit_all(struct perf_session *session);
int perf_event__inject_buildid(struct perf_tool *tool, union perf_event *event, int perf_event__inject_buildid(struct perf_tool *tool, union perf_event *event,
struct perf_sample *sample, struct evsel *evsel, struct perf_sample *sample, struct evsel *evsel,
struct machine *machine); struct machine *machine);
......
...@@ -233,12 +233,6 @@ struct dso { ...@@ -233,12 +233,6 @@ struct dso {
#define dso__for_each_symbol(dso, pos, n) \ #define dso__for_each_symbol(dso, pos, n) \
symbols__for_each_entry(&(dso)->symbols, pos, n) symbols__for_each_entry(&(dso)->symbols, pos, n)
#define dsos__for_each_with_build_id(pos, head) \
list_for_each_entry(pos, head, node) \
if (!pos->has_build_id) \
continue; \
else
static inline void dso__set_loaded(struct dso *dso) static inline void dso__set_loaded(struct dso *dso)
{ {
dso->loaded = true; dso->loaded = true;
......
...@@ -12,6 +12,35 @@ ...@@ -12,6 +12,35 @@
#include <symbol.h> // filename__read_build_id #include <symbol.h> // filename__read_build_id
#include <unistd.h> #include <unistd.h>
void dsos__init(struct dsos *dsos)
{
INIT_LIST_HEAD(&dsos->head);
dsos->root = RB_ROOT;
init_rwsem(&dsos->lock);
}
static void dsos__purge(struct dsos *dsos)
{
struct dso *pos, *n;
down_write(&dsos->lock);
list_for_each_entry_safe(pos, n, &dsos->head, node) {
RB_CLEAR_NODE(&pos->rb_node);
pos->root = NULL;
list_del_init(&pos->node);
dso__put(pos);
}
up_write(&dsos->lock);
}
void dsos__exit(struct dsos *dsos)
{
dsos__purge(dsos);
exit_rwsem(&dsos->lock);
}
static int __dso_id__cmp(struct dso_id *a, struct dso_id *b) static int __dso_id__cmp(struct dso_id *a, struct dso_id *b)
{ {
if (a->maj > b->maj) return -1; if (a->maj > b->maj) return -1;
...@@ -73,8 +102,9 @@ int dso__cmp_id(struct dso *a, struct dso *b) ...@@ -73,8 +102,9 @@ int dso__cmp_id(struct dso *a, struct dso *b)
return __dso_id__cmp(&a->id, &b->id); return __dso_id__cmp(&a->id, &b->id);
} }
bool __dsos__read_build_ids(struct list_head *head, bool with_hits) bool __dsos__read_build_ids(struct dsos *dsos, bool with_hits)
{ {
struct list_head *head = &dsos->head;
bool have_build_id = false; bool have_build_id = false;
struct dso *pos; struct dso *pos;
struct nscookie nsc; struct nscookie nsc;
...@@ -303,9 +333,10 @@ struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, struct dso_id ...@@ -303,9 +333,10 @@ struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, struct dso_id
return dso; return dso;
} }
size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp, size_t __dsos__fprintf_buildid(struct dsos *dsos, FILE *fp,
bool (skip)(struct dso *dso, int parm), int parm) bool (skip)(struct dso *dso, int parm), int parm)
{ {
struct list_head *head = &dsos->head;
struct dso *pos; struct dso *pos;
size_t ret = 0; size_t ret = 0;
...@@ -320,8 +351,9 @@ size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp, ...@@ -320,8 +351,9 @@ size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
return ret; return ret;
} }
size_t __dsos__fprintf(struct list_head *head, FILE *fp) size_t __dsos__fprintf(struct dsos *dsos, FILE *fp)
{ {
struct list_head *head = &dsos->head;
struct dso *pos; struct dso *pos;
size_t ret = 0; size_t ret = 0;
...@@ -331,3 +363,14 @@ size_t __dsos__fprintf(struct list_head *head, FILE *fp) ...@@ -331,3 +363,14 @@ size_t __dsos__fprintf(struct list_head *head, FILE *fp)
return ret; return ret;
} }
int __dsos__hit_all(struct dsos *dsos)
{
struct list_head *head = &dsos->head;
struct dso *pos;
list_for_each_entry(pos, head, node)
pos->hit = true;
return 0;
}
...@@ -21,6 +21,15 @@ struct dsos { ...@@ -21,6 +21,15 @@ struct dsos {
struct rw_semaphore lock; struct rw_semaphore lock;
}; };
#define dsos__for_each_with_build_id(pos, head) \
list_for_each_entry(pos, head, node) \
if (!pos->has_build_id) \
continue; \
else
void dsos__init(struct dsos *dsos);
void dsos__exit(struct dsos *dsos);
void __dsos__add(struct dsos *dsos, struct dso *dso); void __dsos__add(struct dsos *dsos, struct dso *dso);
void dsos__add(struct dsos *dsos, struct dso *dso); void dsos__add(struct dsos *dsos, struct dso *dso);
struct dso *__dsos__addnew(struct dsos *dsos, const char *name); struct dso *__dsos__addnew(struct dsos *dsos, const char *name);
...@@ -28,13 +37,15 @@ struct dso *__dsos__find(struct dsos *dsos, const char *name, bool cmp_short); ...@@ -28,13 +37,15 @@ struct dso *__dsos__find(struct dsos *dsos, const char *name, bool cmp_short);
struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, struct dso_id *id); struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, struct dso_id *id);
bool __dsos__read_build_ids(struct dsos *dsos, bool with_hits);
struct dso *__dsos__findnew_link_by_longname_id(struct rb_root *root, struct dso *dso, struct dso *__dsos__findnew_link_by_longname_id(struct rb_root *root, struct dso *dso,
const char *name, struct dso_id *id); const char *name, struct dso_id *id);
bool __dsos__read_build_ids(struct list_head *head, bool with_hits); size_t __dsos__fprintf_buildid(struct dsos *dsos, FILE *fp,
size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
bool (skip)(struct dso *dso, int parm), int parm); bool (skip)(struct dso *dso, int parm), int parm);
size_t __dsos__fprintf(struct list_head *head, FILE *fp); size_t __dsos__fprintf(struct dsos *dsos, FILE *fp);
int __dsos__hit_all(struct dsos *dsos);
#endif /* __PERF_DSOS */ #endif /* __PERF_DSOS */
...@@ -48,13 +48,6 @@ static struct dso *machine__kernel_dso(struct machine *machine) ...@@ -48,13 +48,6 @@ static struct dso *machine__kernel_dso(struct machine *machine)
return map__dso(machine->vmlinux_map); return map__dso(machine->vmlinux_map);
} }
static void dsos__init(struct dsos *dsos)
{
INIT_LIST_HEAD(&dsos->head);
dsos->root = RB_ROOT;
init_rwsem(&dsos->lock);
}
static int machine__set_mmap_name(struct machine *machine) static int machine__set_mmap_name(struct machine *machine)
{ {
if (machine__is_host(machine)) if (machine__is_host(machine))
...@@ -165,28 +158,6 @@ struct machine *machine__new_kallsyms(void) ...@@ -165,28 +158,6 @@ struct machine *machine__new_kallsyms(void)
return machine; return machine;
} }
static void dsos__purge(struct dsos *dsos)
{
struct dso *pos, *n;
down_write(&dsos->lock);
list_for_each_entry_safe(pos, n, &dsos->head, node) {
RB_CLEAR_NODE(&pos->rb_node);
pos->root = NULL;
list_del_init(&pos->node);
dso__put(pos);
}
up_write(&dsos->lock);
}
static void dsos__exit(struct dsos *dsos)
{
dsos__purge(dsos);
exit_rwsem(&dsos->lock);
}
void machine__delete_threads(struct machine *machine) void machine__delete_threads(struct machine *machine)
{ {
threads__remove_all_threads(&machine->threads); threads__remove_all_threads(&machine->threads);
...@@ -907,11 +878,11 @@ static struct map *machine__addnew_module_map(struct machine *machine, u64 start ...@@ -907,11 +878,11 @@ static struct map *machine__addnew_module_map(struct machine *machine, u64 start
size_t machines__fprintf_dsos(struct machines *machines, FILE *fp) size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
{ {
struct rb_node *nd; struct rb_node *nd;
size_t ret = __dsos__fprintf(&machines->host.dsos.head, fp); size_t ret = __dsos__fprintf(&machines->host.dsos, fp);
for (nd = rb_first_cached(&machines->guests); nd; nd = rb_next(nd)) { for (nd = rb_first_cached(&machines->guests); nd; nd = rb_next(nd)) {
struct machine *pos = rb_entry(nd, struct machine, rb_node); struct machine *pos = rb_entry(nd, struct machine, rb_node);
ret += __dsos__fprintf(&pos->dsos.head, fp); ret += __dsos__fprintf(&pos->dsos, fp);
} }
return ret; return ret;
...@@ -920,7 +891,7 @@ size_t machines__fprintf_dsos(struct machines *machines, FILE *fp) ...@@ -920,7 +891,7 @@ size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
size_t machine__fprintf_dsos_buildid(struct machine *m, FILE *fp, size_t machine__fprintf_dsos_buildid(struct machine *m, FILE *fp,
bool (skip)(struct dso *dso, int parm), int parm) bool (skip)(struct dso *dso, int parm), int parm)
{ {
return __dsos__fprintf_buildid(&m->dsos.head, fp, skip, parm); return __dsos__fprintf_buildid(&m->dsos, fp, skip, parm);
} }
size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp, size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,
...@@ -3306,3 +3277,8 @@ bool machine__is_lock_function(struct machine *machine, u64 addr) ...@@ -3306,3 +3277,8 @@ bool machine__is_lock_function(struct machine *machine, u64 addr)
return false; return false;
} }
int machine__hit_all_dsos(struct machine *machine)
{
return __dsos__hit_all(&machine->dsos);
}
...@@ -306,4 +306,6 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine, ...@@ -306,4 +306,6 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine,
int machine__resolve(struct machine *machine, struct addr_location *al, int machine__resolve(struct machine *machine, struct addr_location *al,
struct perf_sample *sample); struct perf_sample *sample);
int machine__hit_all_dsos(struct machine *machine);
#endif /* __PERF_MACHINE_H */ #endif /* __PERF_MACHINE_H */
...@@ -2916,3 +2916,24 @@ int perf_event__process_id_index(struct perf_session *session, ...@@ -2916,3 +2916,24 @@ int perf_event__process_id_index(struct perf_session *session,
} }
return 0; return 0;
} }
int perf_session__dsos_hit_all(struct perf_session *session)
{
struct rb_node *nd;
int err;
err = machine__hit_all_dsos(&session->machines.host);
if (err)
return err;
for (nd = rb_first_cached(&session->machines.guests); nd;
nd = rb_next(nd)) {
struct machine *pos = rb_entry(nd, struct machine, rb_node);
err = machine__hit_all_dsos(pos);
if (err)
return err;
}
return 0;
}
...@@ -156,6 +156,8 @@ int perf_session__deliver_synth_event(struct perf_session *session, ...@@ -156,6 +156,8 @@ int perf_session__deliver_synth_event(struct perf_session *session,
union perf_event *event, union perf_event *event,
struct perf_sample *sample); struct perf_sample *sample);
int perf_session__dsos_hit_all(struct perf_session *session);
int perf_event__process_id_index(struct perf_session *session, int perf_event__process_id_index(struct perf_session *session,
union perf_event *event); union perf_event *event);
......
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