|
@@ -180,7 +180,7 @@ static struct map *kernel_get_module_map(const char *module)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static struct map *get_target_map(const char *target, bool user)
|
|
|
+struct map *get_target_map(const char *target, bool user)
|
|
|
{
|
|
|
/* Init maps of given executable or kernel */
|
|
|
if (user)
|
|
@@ -705,19 +705,32 @@ post_process_kernel_probe_trace_events(struct probe_trace_event *tevs,
|
|
|
return skipped;
|
|
|
}
|
|
|
|
|
|
+void __weak
|
|
|
+arch__post_process_probe_trace_events(struct perf_probe_event *pev __maybe_unused,
|
|
|
+ int ntevs __maybe_unused)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
/* Post processing the probe events */
|
|
|
-static int post_process_probe_trace_events(struct probe_trace_event *tevs,
|
|
|
+static int post_process_probe_trace_events(struct perf_probe_event *pev,
|
|
|
+ struct probe_trace_event *tevs,
|
|
|
int ntevs, const char *module,
|
|
|
bool uprobe)
|
|
|
{
|
|
|
- if (uprobe)
|
|
|
- return add_exec_to_probe_trace_events(tevs, ntevs, module);
|
|
|
+ int ret;
|
|
|
|
|
|
- if (module)
|
|
|
+ if (uprobe)
|
|
|
+ ret = add_exec_to_probe_trace_events(tevs, ntevs, module);
|
|
|
+ else if (module)
|
|
|
/* Currently ref_reloc_sym based probe is not for drivers */
|
|
|
- return add_module_to_probe_trace_events(tevs, ntevs, module);
|
|
|
+ ret = add_module_to_probe_trace_events(tevs, ntevs, module);
|
|
|
+ else
|
|
|
+ ret = post_process_kernel_probe_trace_events(tevs, ntevs);
|
|
|
|
|
|
- return post_process_kernel_probe_trace_events(tevs, ntevs);
|
|
|
+ if (ret >= 0)
|
|
|
+ arch__post_process_probe_trace_events(pev, ntevs);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/* Try to find perf_probe_event with debuginfo */
|
|
@@ -758,7 +771,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
|
|
|
|
|
|
if (ntevs > 0) { /* Succeeded to find trace events */
|
|
|
pr_debug("Found %d probe_trace_events.\n", ntevs);
|
|
|
- ret = post_process_probe_trace_events(*tevs, ntevs,
|
|
|
+ ret = post_process_probe_trace_events(pev, *tevs, ntevs,
|
|
|
pev->target, pev->uprobes);
|
|
|
if (ret < 0 || ret == ntevs) {
|
|
|
clear_probe_trace_events(*tevs, ntevs);
|
|
@@ -2945,8 +2958,6 @@ errout:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-bool __weak arch__prefers_symtab(void) { return false; }
|
|
|
-
|
|
|
/* Concatinate two arrays */
|
|
|
static void *memcat(void *a, size_t sz_a, void *b, size_t sz_b)
|
|
|
{
|
|
@@ -3167,12 +3178,6 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
|
|
|
if (ret > 0 || pev->sdt) /* SDT can be found only in the cache */
|
|
|
return ret == 0 ? -ENOENT : ret; /* Found in probe cache */
|
|
|
|
|
|
- if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) {
|
|
|
- ret = find_probe_trace_events_from_map(pev, tevs);
|
|
|
- if (ret > 0)
|
|
|
- return ret; /* Found in symbol table */
|
|
|
- }
|
|
|
-
|
|
|
/* Convert perf_probe_event with debuginfo */
|
|
|
ret = try_to_find_probe_trace_events(pev, tevs);
|
|
|
if (ret != 0)
|