Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 462b04e2 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'perf' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core

parents cfadf9d4 f93830fb
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -62,6 +62,9 @@ OPTIONS
	Dry run. With this option, --add and --del doesn't execute actual
	adding and removal operations.

--max-probes::
	Set the maximum number of probe points for an event. Default is 128.

PROBE SYNTAX
------------
Probe points are defined by following syntax.
+1 −1
Original line number Diff line number Diff line
@@ -504,7 +504,7 @@ PERFLIBS = $(LIB_FILE)

ifndef NO_DWARF
ifneq ($(shell sh -c "(echo '\#include <dwarf.h>'; echo '\#include <libdw.h>'; echo 'int main(void) { Dwarf *dbg; dbg = dwarf_begin(0, DWARF_C_READ); return (long)dbg; }') | $(CC) -x c - $(ALL_CFLAGS) -I/usr/include/elfutils -ldw -lelf -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) "$(QUIET_STDERR)" && echo y"), y)
	msg := $(warning No libdw.h found or old libdw.h found, disables dwarf support. Please install elfutils-devel/elfutils-dev);
	msg := $(warning No libdw.h found or old libdw.h found, disables dwarf support. Please install elfutils-devel/libdw-dev);
	NO_DWARF := 1
endif # Dwarf support
endif # NO_DWARF
+8 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ static struct {
	struct perf_probe_event events[MAX_PROBES];
	struct strlist *dellist;
	struct line_range line_range;
	int max_probe_points;
} params;


@@ -179,6 +180,8 @@ static const struct option options[] = {
		   "file", "vmlinux pathname"),
#endif
	OPT__DRY_RUN(&probe_event_dry_run),
	OPT_INTEGER('\0', "max-probes", &params.max_probe_points,
		 "Set how many probe points can be found for a probe."),
	OPT_END()
};

@@ -200,6 +203,9 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
		}
	}

	if (params.max_probe_points == 0)
		params.max_probe_points = MAX_PROBES;

	if ((!params.nevents && !params.dellist && !params.list_events &&
	     !params.show_lines))
		usage_with_options(probe_usage, options);
@@ -246,7 +252,8 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)

	if (params.nevents) {
		ret = add_perf_probe_events(params.events, params.nevents,
					    params.force_add);
					    params.force_add,
					    params.max_probe_points);
		if (ret < 0) {
			pr_err("  Error: Failed to add events. (%d)\n", ret);
			return ret;
+19 −15
Original line number Diff line number Diff line
@@ -150,7 +150,8 @@ static int convert_to_perf_probe_point(struct kprobe_trace_point *tp,

/* Try to find perf_probe_event with debuginfo */
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);
	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 */
	ntevs = find_kprobe_trace_events(fd, pev, tevs);
	ntevs = find_kprobe_trace_events(fd, pev, tevs, max_tevs);
	close(fd);

	if (ntevs > 0) {	/* Succeeded to find trace events */
@@ -180,16 +181,17 @@ static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev,
		return -ENOENT;
	}
	/* 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."
		 " Try to use symbols.\n");
	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;
		}
	}
	return ntevs;
}

#define LINEBUF_SIZE 256
#define NR_ADDITIONAL_LINES 2
@@ -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,
				struct kprobe_trace_event **tevs __unused)
				struct kprobe_trace_event **tevs __unused,
				int max_tevs __unused)
{
	if (perf_probe_event_need_dwarf(pev)) {
		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,
					  struct kprobe_trace_event **tevs)
					  struct kprobe_trace_event **tevs,
					  int max_tevs)
{
	struct symbol *sym;
	int ret = 0, i;
	struct kprobe_trace_event *tev;

	/* 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)
		return ret;

@@ -1486,7 +1490,7 @@ struct __event_package {
};

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;
	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];
		/* Convert with or without debuginfo */
		ret  = convert_to_kprobe_trace_events(pkgs[i].pev,
						      &pkgs[i].tevs);
						      &pkgs[i].tevs, max_tevs);
		if (ret < 0)
			goto end;
		pkgs[i].ntevs = ret;
+2 −2
Original line number Diff line number Diff line
@@ -115,8 +115,8 @@ extern void clear_kprobe_trace_event(struct kprobe_trace_event *tev);
extern int parse_line_range_desc(const char *cmd, struct line_range *lr);


extern int add_perf_probe_events(struct perf_probe_event *pevs, int ntevs,
				 bool force_add);
extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
				 bool force_add, int max_probe_points);
extern int del_perf_probe_events(struct strlist *dellist);
extern int show_perf_probe_events(void);
extern int show_line_range(struct line_range *lr);
Loading