Separate the dso object addition and update when adding
new kernel module.

Currently we update dso's symtab_type any time we find
it in the list, because we can't distinguish between
new and found dso from __dsos__findnew function.

Adding machine__module_dso that separates finding and adding
new dso objects, so there's no superfluous update of dso.

Signed-off-by: Jiri Olsa <jo...@kernel.org>
Cc: Adrian Hunter <adrian.hun...@intel.com>
Cc: Arnaldo Carvalho de Melo <a...@redhat.com>
Cc: Corey Ashford <cjash...@linux.vnet.ibm.com>
Cc: David Ahern <dsah...@gmail.com>
Cc: Frederic Weisbecker <fweis...@gmail.com>
Cc: Ingo Molnar <mi...@kernel.org>
Cc: Namhyung Kim <namhy...@kernel.org>
Cc: Paul Mackerras <pau...@samba.org>
Cc: Peter Zijlstra <a.p.zijls...@chello.nl>
Cc: Stephane Eranian <eran...@google.com>
---
 tools/perf/util/machine.c | 36 +++++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 11 deletions(-)

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 24f8c978cfd4..14f7caf4824a 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -460,12 +460,35 @@ int machine__process_lost_event(struct machine *machine 
__maybe_unused,
        return 0;
 }
 
+static struct dso *machine__module_dso(struct machine *machine, const char 
*filename)
+{
+       struct dso *dso;
+       bool compressed;
+
+       dso = dsos__find(&machine->kernel_dsos, filename, false);
+       if (!dso) {
+               dso = dsos__new(&machine->kernel_dsos, filename);
+               if (dso == NULL)
+                       return NULL;
+
+               if (machine__is_host(machine))
+                       dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE;
+               else
+                       dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE;
+
+               /* _KMODULE_COMP should be next to _KMODULE */
+               if (is_kernel_module(filename, &compressed) && compressed)
+                       dso->symtab_type++;
+       }
+
+       return dso;
+}
+
 struct map *machine__new_module(struct machine *machine, u64 start,
                                const char *filename)
 {
        struct map *map;
-       struct dso *dso = __dsos__findnew(&machine->kernel_dsos, filename);
-       bool compressed;
+       struct dso *dso = machine__module_dso(machine, filename);
 
        if (dso == NULL)
                return NULL;
@@ -474,15 +497,6 @@ struct map *machine__new_module(struct machine *machine, 
u64 start,
        if (map == NULL)
                return NULL;
 
-       if (machine__is_host(machine))
-               dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE;
-       else
-               dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE;
-
-       /* _KMODULE_COMP should be next to _KMODULE */
-       if (is_kernel_module(filename, &compressed) && compressed)
-               dso->symtab_type++;
-
        map_groups__insert(&machine->kmaps, map);
        return map;
 }
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to