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

Commit 8cb0aa4c authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Arnaldo Carvalho de Melo
Browse files

perf probe: Check the orphaned -x option



To avoid probing in unintended binary, the orphaned -x option must be
checked and warned.

Without this patch, following command sets up the probe in the kernel.

  -----
  # perf probe -a strcpy -x ./perf
  Added new event:
    probe:strcpy         (on strcpy)

  You can now use it in all perf tools, such as:

          perf record -e probe:strcpy -aR sleep 1
  -----

But in this case, it seems that the user may want to probe in the perf
binary. With this patch, perf-probe correctly handles the orphaned -x.

  -----
  # perf probe -a strcpy -x ./perf
    Error: -x/-m must follow the probe definitions.
  ...
  -----

Reported-by: default avatarJiri Olsa <jolsa@redhat.com>
Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150401102541.17137.75477.stgit@localhost.localdomain


Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 7afb3fab
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -56,6 +56,7 @@ static struct {
	bool mod_events;
	bool mod_events;
	bool uprobes;
	bool uprobes;
	bool quiet;
	bool quiet;
	bool target_used;
	int nevents;
	int nevents;
	struct perf_probe_event events[MAX_PROBES];
	struct perf_probe_event events[MAX_PROBES];
	struct strlist *dellist;
	struct strlist *dellist;
@@ -82,6 +83,7 @@ static int parse_probe_event(const char *str)
		pev->target = strdup(params.target);
		pev->target = strdup(params.target);
		if (!pev->target)
		if (!pev->target)
			return -ENOMEM;
			return -ENOMEM;
		params.target_used = true;
	}
	}


	/* Parse a perf-probe command into event */
	/* Parse a perf-probe command into event */
@@ -107,6 +109,7 @@ static int set_target(const char *ptr)
		params.target = strdup(ptr);
		params.target = strdup(ptr);
		if (!params.target)
		if (!params.target)
			return -ENOMEM;
			return -ENOMEM;
		params.target_used = false;


		found = 1;
		found = 1;
		buf = ptr + (strlen(ptr) - 3);
		buf = ptr + (strlen(ptr) - 3);
@@ -207,6 +210,7 @@ static int opt_set_target(const struct option *opt, const char *str,
		}
		}
		free(params.target);
		free(params.target);
		params.target = tmp;
		params.target = tmp;
		params.target_used = false;
		ret = 0;
		ret = 0;
	}
	}


@@ -491,6 +495,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
	}
	}


	if (params.nevents) {
	if (params.nevents) {
		/* Ensure the last given target is used */
		if (params.target && !params.target_used) {
			pr_warning("  Error: -x/-m must follow the probe definitions.\n");
			usage_with_options(probe_usage, options);
		}

		ret = add_perf_probe_events(params.events, params.nevents,
		ret = add_perf_probe_events(params.events, params.nevents,
					    params.max_probe_points,
					    params.max_probe_points,
					    params.force_add);
					    params.force_add);