static int full_paths;
static int print_line;
+static bool use_modules;
static unsigned long page_size;
static unsigned long mmap_window = 32;
exit(0);
}
- if (load_kernel(symbol_filter) < 0) {
+ if (load_kernel(symbol_filter, use_modules) < 0) {
perror("failed to load kernel symbols");
return EXIT_FAILURE;
}
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
"dump raw trace in ASCII"),
OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
- OPT_BOOLEAN('m', "modules", &modules,
+ OPT_BOOLEAN('m', "modules", &use_modules,
"load module symbols - WARNING: use only with -k and LIVE kernel"),
OPT_BOOLEAN('l', "print-line", &print_line,
"print matching source lines (may be slow)"),
static struct strlist *dso_list, *comm_list, *sym_list;
static int force;
+static bool use_modules;
static int full_paths;
static int show_nr_samples;
"dump raw trace in ASCII"),
OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
- OPT_BOOLEAN('m', "modules", &modules,
+ OPT_BOOLEAN('m', "modules", &use_modules,
"load module symbols - WARNING: use only with -k and LIVE kernel"),
OPT_BOOLEAN('n', "show-nr-samples", &show_nr_samples,
"Show a column with the number of samples"),
if (kernel == NULL)
return -1;
+ if (dsos__load_modules() < 0)
+ pr_debug("Couldn't read the complete list of modules, "
+ "continuing...\n");
+
+ if (dsos__load_modules_sym(symbol_filter) < 0)
+ pr_warning("Failed to read module symbols, continuing...\n");
+
if (dso__load_kernel_sym(kernel, symbol_filter, 1) <= 0)
- return -1;
+ pr_debug("Couldn't read the complete list of kernel symbols, "
+ "continuing...\n");
if (dump_symtab)
dsos__fprintf(stderr);
goto out_delete;
err = -ENOMEM;
- if (load_kernel(NULL) < 0) {
+ if (load_kernel(NULL, 1) < 0) {
pr_err("failed to load kernel symbols\n");
goto out_delete;
}
return -1;
}
-static int dsos__load_modules_sym(symbol_filter_t filter)
+int dsos__load_modules_sym(symbol_filter_t filter)
{
struct utsname uts;
char modules_path[PATH_MAX];
return err;
}
-int dso__load_kernel_sym(struct dso *self, symbol_filter_t filter, int use_modules)
+int dso__load_kernel_sym(struct dso *self, symbol_filter_t filter,
+ int use_modules)
{
- int err = -1;
+ int err;
kernel_map = map__new2(0, self);
if (kernel_map == NULL)
- goto out_delete_dso;
+ return -1;
kernel_map->map_ip = kernel_map->unmap_ip = identity__map_ip;
- if (use_modules && dsos__load_modules() < 0) {
- pr_warning("Failed to load list of modules in use! "
- "Continuing...\n");
- use_modules = 0;
- }
-
err = dso__load_vmlinux(self, kernel_map, self->name, filter);
- if (err > 0 && use_modules) {
- int syms = dsos__load_modules_sym(filter);
-
- if (syms < 0)
- pr_warning("Failed to read module symbols!"
- " Continuing...\n");
- else
- err += syms;
- }
-
if (err <= 0)
err = kernel_maps__load_kallsyms(filter, use_modules);
}
return err;
-
-out_delete_dso:
- dso__delete(self);
- return -1;
}
LIST_HEAD(dsos);
struct dso *vdso;
const char *vmlinux_name = "vmlinux";
-int modules;
static void dsos__add(struct dso *dso)
{
return kernel;
}
-int load_kernel(symbol_filter_t filter)
+int load_kernel(symbol_filter_t filter, bool use_modules)
{
struct dso *kernel = dsos__load_kernel();
if (kernel == NULL)
return -1;
- return dso__load_kernel_sym(kernel, filter, modules);
+ if (use_modules) {
+ if (dsos__load_modules() < 0)
+ pr_warning("Failed to load list of modules in use, "
+ "continuing...\n");
+ else if (dsos__load_modules_sym(filter) < 0)
+ pr_warning("Failed to read module symbols, "
+ "continuing...\n");
+ }
+
+ if (dso__load_kernel_sym(kernel, filter, use_modules) < 0)
+ pr_warning("Failed to read kernel symbols, continuing...\n");
+
+ return 0;
}
void symbol__init(unsigned int priv_size)
struct symbol *dso__find_symbol(struct dso *self, u64 ip);
int dsos__load_modules(void);
+int dsos__load_modules_sym(symbol_filter_t filter);
struct dso *dsos__findnew(const char *name);
int dso__load(struct dso *self, struct map *map, symbol_filter_t filter);
-int dso__load_kernel_sym(struct dso *self, symbol_filter_t filter, int modules);
+int dso__load_kernel_sym(struct dso *self, symbol_filter_t filter,
+ int use_modules);
void dsos__fprintf(FILE *fp);
size_t dsos__fprintf_buildid(FILE *fp);
int build_id__sprintf(u8 *self, int len, char *bf);
struct dso *dsos__load_kernel(void);
-int load_kernel(symbol_filter_t filter);
+int load_kernel(symbol_filter_t filter, bool use_modules);
void symbol__init(unsigned int priv_size);
extern struct map *kernel_map;
extern struct dso *vdso;
extern const char *vmlinux_name;
-extern int modules;
#endif /* __PERF_SYMBOL */