Merge branch 'linus' into x86/asm, before applying dependent patch
[firefly-linux-kernel-4.4.55.git] / tools / perf / util / symbol.c
index a69066865a555f7b02c50606f3d53f4759a1eecc..201f6c4ca738ddffb46d5270a876cf96e8da9322 100644 (file)
@@ -15,6 +15,7 @@
 #include "machine.h"
 #include "symbol.h"
 #include "strlist.h"
+#include "intlist.h"
 #include "header.h"
 
 #include <elf.h>
@@ -629,13 +630,16 @@ static int dso__load_all_kallsyms(struct dso *dso, const char *filename,
 static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
                                         symbol_filter_t filter)
 {
-       struct map_groups *kmaps = map__kmap(map)->kmaps;
+       struct map_groups *kmaps = map__kmaps(map);
        struct map *curr_map;
        struct symbol *pos;
        int count = 0, moved = 0;
        struct rb_root *root = &dso->symbols[map->type];
        struct rb_node *next = rb_first(root);
 
+       if (!kmaps)
+               return -1;
+
        while (next) {
                char *module;
 
@@ -681,8 +685,8 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
 static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta,
                               symbol_filter_t filter)
 {
-       struct map_groups *kmaps = map__kmap(map)->kmaps;
-       struct machine *machine = kmaps->machine;
+       struct map_groups *kmaps = map__kmaps(map);
+       struct machine *machine;
        struct map *curr_map = map;
        struct symbol *pos;
        int count = 0, moved = 0;
@@ -690,6 +694,11 @@ static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta,
        struct rb_node *next = rb_first(root);
        int kernel_range = 0;
 
+       if (!kmaps)
+               return -1;
+
+       machine = kmaps->machine;
+
        while (next) {
                char *module;
 
@@ -1024,9 +1033,12 @@ static bool filename_from_kallsyms_filename(char *filename,
 static int validate_kcore_modules(const char *kallsyms_filename,
                                  struct map *map)
 {
-       struct map_groups *kmaps = map__kmap(map)->kmaps;
+       struct map_groups *kmaps = map__kmaps(map);
        char modules_filename[PATH_MAX];
 
+       if (!kmaps)
+               return -EINVAL;
+
        if (!filename_from_kallsyms_filename(modules_filename, "modules",
                                             kallsyms_filename))
                return -EINVAL;
@@ -1042,6 +1054,9 @@ static int validate_kcore_addresses(const char *kallsyms_filename,
 {
        struct kmap *kmap = map__kmap(map);
 
+       if (!kmap)
+               return -EINVAL;
+
        if (kmap->ref_reloc_sym && kmap->ref_reloc_sym->name) {
                u64 start;
 
@@ -1080,8 +1095,8 @@ static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)
 static int dso__load_kcore(struct dso *dso, struct map *map,
                           const char *kallsyms_filename)
 {
-       struct map_groups *kmaps = map__kmap(map)->kmaps;
-       struct machine *machine = kmaps->machine;
+       struct map_groups *kmaps = map__kmaps(map);
+       struct machine *machine;
        struct kcore_mapfn_data md;
        struct map *old_map, *new_map, *replacement_map = NULL;
        bool is_64_bit;
@@ -1089,6 +1104,11 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
        char kcore_filename[PATH_MAX];
        struct symbol *sym;
 
+       if (!kmaps)
+               return -EINVAL;
+
+       machine = kmaps->machine;
+
        /* This function requires that the map is the kernel map */
        if (map != machine->vmlinux_maps[map->type])
                return -EINVAL;
@@ -1201,6 +1221,9 @@ static int kallsyms__delta(struct map *map, const char *filename, u64 *delta)
        struct kmap *kmap = map__kmap(map);
        u64 addr;
 
+       if (!kmap)
+               return -1;
+
        if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->name)
                return 0;
 
@@ -1859,6 +1882,20 @@ int setup_list(struct strlist **list, const char *list_str,
        return 0;
 }
 
+int setup_intlist(struct intlist **list, const char *list_str,
+                 const char *list_name)
+{
+       if (list_str == NULL)
+               return 0;
+
+       *list = intlist__new(list_str);
+       if (!*list) {
+               pr_err("problems parsing %s list\n", list_name);
+               return -1;
+       }
+       return 0;
+}
+
 static bool symbol__read_kptr_restrict(void)
 {
        bool value = false;
@@ -1909,9 +1946,17 @@ int symbol__init(struct perf_session_env *env)
                       symbol_conf.comm_list_str, "comm") < 0)
                goto out_free_dso_list;
 
+       if (setup_intlist(&symbol_conf.pid_list,
+                      symbol_conf.pid_list_str, "pid") < 0)
+               goto out_free_comm_list;
+
+       if (setup_intlist(&symbol_conf.tid_list,
+                      symbol_conf.tid_list_str, "tid") < 0)
+               goto out_free_pid_list;
+
        if (setup_list(&symbol_conf.sym_list,
                       symbol_conf.sym_list_str, "symbol") < 0)
-               goto out_free_comm_list;
+               goto out_free_tid_list;
 
        /*
         * A path to symbols of "/" is identical to ""
@@ -1930,6 +1975,10 @@ int symbol__init(struct perf_session_env *env)
        symbol_conf.initialized = true;
        return 0;
 
+out_free_tid_list:
+       intlist__delete(symbol_conf.tid_list);
+out_free_pid_list:
+       intlist__delete(symbol_conf.pid_list);
 out_free_comm_list:
        strlist__delete(symbol_conf.comm_list);
 out_free_dso_list:
@@ -1944,6 +1993,8 @@ void symbol__exit(void)
        strlist__delete(symbol_conf.sym_list);
        strlist__delete(symbol_conf.dso_list);
        strlist__delete(symbol_conf.comm_list);
+       intlist__delete(symbol_conf.tid_list);
+       intlist__delete(symbol_conf.pid_list);
        vmlinux_path__exit();
        symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
        symbol_conf.initialized = false;