|
@@ -150,7 +150,8 @@ static int convert_to_perf_probe_point(struct kprobe_trace_point *tp,
|
|
|
|
|
|
/* Try to find perf_probe_event with debuginfo */
|
|
/* Try to find perf_probe_event with debuginfo */
|
|
static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev,
|
|
static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev,
|
|
- struct kprobe_trace_event **tevs)
|
|
|
|
|
|
+ struct kprobe_trace_event **tevs,
|
|
|
|
+ int max_tevs)
|
|
{
|
|
{
|
|
bool need_dwarf = perf_probe_event_need_dwarf(pev);
|
|
bool need_dwarf = perf_probe_event_need_dwarf(pev);
|
|
int fd, ntevs;
|
|
int fd, ntevs;
|
|
@@ -166,7 +167,7 @@ static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev,
|
|
}
|
|
}
|
|
|
|
|
|
/* Searching trace events corresponding to probe event */
|
|
/* Searching trace events corresponding to probe event */
|
|
- ntevs = find_kprobe_trace_events(fd, pev, tevs);
|
|
|
|
|
|
+ ntevs = find_kprobe_trace_events(fd, pev, tevs, max_tevs);
|
|
close(fd);
|
|
close(fd);
|
|
|
|
|
|
if (ntevs > 0) { /* Succeeded to find trace events */
|
|
if (ntevs > 0) { /* Succeeded to find trace events */
|
|
@@ -180,15 +181,16 @@ static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev,
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
}
|
|
}
|
|
/* Error path : ntevs < 0 */
|
|
/* Error path : ntevs < 0 */
|
|
- if (need_dwarf) {
|
|
|
|
- if (ntevs == -EBADF)
|
|
|
|
- pr_warning("No dwarf info found in the vmlinux - "
|
|
|
|
- "please rebuild with CONFIG_DEBUG_INFO=y.\n");
|
|
|
|
- return ntevs;
|
|
|
|
|
|
+ pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs);
|
|
|
|
+ if (ntevs == -EBADF) {
|
|
|
|
+ pr_warning("Warning: No dwarf info found in the vmlinux - "
|
|
|
|
+ "please rebuild kernel with CONFIG_DEBUG_INFO=y.\n");
|
|
|
|
+ if (!need_dwarf) {
|
|
|
|
+ pr_debug("Trying to use symbols.\nn");
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- pr_debug("An error occurred in debuginfo analysis."
|
|
|
|
- " Try to use symbols.\n");
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return ntevs;
|
|
}
|
|
}
|
|
|
|
|
|
#define LINEBUF_SIZE 256
|
|
#define LINEBUF_SIZE 256
|
|
@@ -317,7 +319,8 @@ static int convert_to_perf_probe_point(struct kprobe_trace_point *tp,
|
|
}
|
|
}
|
|
|
|
|
|
static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev,
|
|
static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev,
|
|
- struct kprobe_trace_event **tevs __unused)
|
|
|
|
|
|
+ struct kprobe_trace_event **tevs __unused,
|
|
|
|
+ int max_tevs __unused)
|
|
{
|
|
{
|
|
if (perf_probe_event_need_dwarf(pev)) {
|
|
if (perf_probe_event_need_dwarf(pev)) {
|
|
pr_warning("Debuginfo-analysis is not supported.\n");
|
|
pr_warning("Debuginfo-analysis is not supported.\n");
|
|
@@ -1407,14 +1410,15 @@ static int __add_kprobe_trace_events(struct perf_probe_event *pev,
|
|
}
|
|
}
|
|
|
|
|
|
static int convert_to_kprobe_trace_events(struct perf_probe_event *pev,
|
|
static int convert_to_kprobe_trace_events(struct perf_probe_event *pev,
|
|
- struct kprobe_trace_event **tevs)
|
|
|
|
|
|
+ struct kprobe_trace_event **tevs,
|
|
|
|
+ int max_tevs)
|
|
{
|
|
{
|
|
struct symbol *sym;
|
|
struct symbol *sym;
|
|
int ret = 0, i;
|
|
int ret = 0, i;
|
|
struct kprobe_trace_event *tev;
|
|
struct kprobe_trace_event *tev;
|
|
|
|
|
|
/* Convert perf_probe_event with debuginfo */
|
|
/* Convert perf_probe_event with debuginfo */
|
|
- ret = try_to_find_kprobe_trace_events(pev, tevs);
|
|
|
|
|
|
+ ret = try_to_find_kprobe_trace_events(pev, tevs, max_tevs);
|
|
if (ret != 0)
|
|
if (ret != 0)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
@@ -1486,7 +1490,7 @@ struct __event_package {
|
|
};
|
|
};
|
|
|
|
|
|
int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
|
|
int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
|
|
- bool force_add)
|
|
|
|
|
|
+ bool force_add, int max_tevs)
|
|
{
|
|
{
|
|
int i, j, ret;
|
|
int i, j, ret;
|
|
struct __event_package *pkgs;
|
|
struct __event_package *pkgs;
|
|
@@ -1505,7 +1509,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
|
|
pkgs[i].pev = &pevs[i];
|
|
pkgs[i].pev = &pevs[i];
|
|
/* Convert with or without debuginfo */
|
|
/* Convert with or without debuginfo */
|
|
ret = convert_to_kprobe_trace_events(pkgs[i].pev,
|
|
ret = convert_to_kprobe_trace_events(pkgs[i].pev,
|
|
- &pkgs[i].tevs);
|
|
|
|
|
|
+ &pkgs[i].tevs, max_tevs);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto end;
|
|
goto end;
|
|
pkgs[i].ntevs = ret;
|
|
pkgs[i].ntevs = ret;
|