perf dsos: Attempt to better abstract DSOs internals
authorIan Rogers <irogers@google.com>
Wed, 10 Apr 2024 06:42:03 +0000 (23:42 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 12 Apr 2024 15:04:13 +0000 (12:04 -0300)
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: Ian 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.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-inject.c
tools/perf/builtin-record.c
tools/perf/util/build-id.c
tools/perf/util/build-id.h
tools/perf/util/dso.h
tools/perf/util/dsos.c
tools/perf/util/dsos.h
tools/perf/util/machine.c
tools/perf/util/machine.h
tools/perf/util/session.c
tools/perf/util/session.h

index eb3ef5c24b66258c568dea02252975f1addb3924..ef73317e6ae7e797766b59e3d08fd81f0f96b9f5 100644 (file)
@@ -2122,7 +2122,7 @@ static int __cmd_inject(struct perf_inject *inject)
                 */
                if (perf_header__has_feat(&session->header, HEADER_BUILD_ID) &&
                    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
                 * synthesized hardware events, so clear the feature flag.
index 6aeae398ec2894228e4c4cb5401941d9f9dd155b..2ff718d3e20262b08b75688f58af5348795d4e60 100644 (file)
@@ -1788,7 +1788,7 @@ record__finish_output(struct record *rec)
                process_buildids(rec);
 
                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);
 
index 03c64b85383b8be3a16d942cc3a44912457efa43..a617b1917e6bd6af8de8e187f55ed083569316df 100644 (file)
@@ -390,42 +390,6 @@ int perf_session__write_buildid_table(struct perf_session *session,
        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)
 {
        no_buildid_cache = true;
@@ -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)
 {
-       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)
index 4e3a1169379b8cea270636ddc96c5109854a94be..3fa8bffb07cae4728dc0bf80e3e4ad703d32b207 100644 (file)
@@ -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 machine *machine);
 
-int dsos__hit_all(struct perf_session *session);
-
 int perf_event__inject_buildid(struct perf_tool *tool, union perf_event *event,
                               struct perf_sample *sample, struct evsel *evsel,
                               struct machine *machine);
index 17dab230a2ca7ce3893771b9afa534f80b58bc1a..3d4faad8d5dc31aca1998deaa529a6bc7277b279 100644 (file)
@@ -233,12 +233,6 @@ struct dso {
 #define dso__for_each_symbol(dso, 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)
 {
        dso->loaded = true;
index cf80aa42dd07b036e3ed7816a22e90e96ef94581..e65ef6762bedf2ae02f53e40c687ab3ed6b5b3c3 100644 (file)
 #include <symbol.h> // filename__read_build_id
 #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)
 {
        if (a->maj > b->maj) return -1;
@@ -73,8 +102,9 @@ int dso__cmp_id(struct dso *a, struct dso *b)
        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;
        struct dso *pos;
        struct nscookie nsc;
@@ -303,9 +333,10 @@ struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, struct dso_id
        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)
 {
+       struct list_head *head = &dsos->head;
        struct dso *pos;
        size_t ret = 0;
 
@@ -320,8 +351,9 @@ size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
        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;
        size_t ret = 0;
 
@@ -331,3 +363,14 @@ size_t __dsos__fprintf(struct list_head *head, FILE *fp)
 
        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;
+}
index 5dbec2bc6966d49d873958dcbfc1272699ed790d..1c81ddf07f8f301fb73ade991e28a7c1cb605471 100644 (file)
@@ -21,6 +21,15 @@ struct dsos {
        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);
 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);
 
 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,
                                                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 list_head *head, FILE *fp,
+size_t __dsos__fprintf_buildid(struct dsos *dsos, FILE *fp,
                               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 */
index a26c8bea58d0b6cfc73385c41390d186d22f2ffc..848a94b8602b22e6488c028d7464356517bca9e2 100644 (file)
@@ -48,13 +48,6 @@ static struct dso *machine__kernel_dso(struct machine *machine)
        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)
 {
        if (machine__is_host(machine))
@@ -165,28 +158,6 @@ struct machine *machine__new_kallsyms(void)
        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)
 {
        threads__remove_all_threads(&machine->threads);
@@ -907,11 +878,11 @@ out:
 size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
 {
        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)) {
                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;
@@ -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,
                                     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,
@@ -3306,3 +3277,8 @@ bool machine__is_lock_function(struct machine *machine, u64 addr)
 
        return false;
 }
+
+int machine__hit_all_dsos(struct machine *machine)
+{
+       return __dsos__hit_all(&machine->dsos);
+}
index 4312f6db6de0a042cbd30ae3d19cdf6f73d887e5..82a47bac80233efe4da89c20ad70adffb67c8918 100644 (file)
@@ -306,4 +306,6 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine,
 int machine__resolve(struct machine *machine, struct addr_location *al,
                     struct perf_sample *sample);
 
+int machine__hit_all_dsos(struct machine *machine);
+
 #endif /* __PERF_MACHINE_H */
index 02a932a83c510f9f357205288467c235ded3015f..a10343b9dcd419b249a571ef67e3b37485cba4ef 100644 (file)
@@ -2916,3 +2916,24 @@ int perf_event__process_id_index(struct perf_session *session,
        }
        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;
+}
index 5064c6ec11e7317515fc9ae812ac37fc4e6567b9..3b0256e977a6c1a2c2bb5b01f940f9faf14eaddc 100644 (file)
@@ -156,6 +156,8 @@ int perf_session__deliver_synth_event(struct perf_session *session,
                                      union perf_event *event,
                                      struct perf_sample *sample);
 
+int perf_session__dsos_hit_all(struct perf_session *session);
+
 int perf_event__process_id_index(struct perf_session *session,
                                 union perf_event *event);