builtin-probe.c 19.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
/*
 * builtin-probe.c
 *
 * Builtin probe command: Set up probe events by C expression
 *
 * Written by Masami Hiramatsu <mhiramat@redhat.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 */
#include <sys/utsname.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#include "perf.h"
#include "builtin.h"
#include "util/util.h"
36
#include "util/strlist.h"
37
#include "util/strfilter.h"
38
#include "util/symbol.h"
39
#include "util/debug.h"
40
#include <subcmd/parse-options.h>
41
#include "util/probe-finder.h"
42
#include "util/probe-event.h"
43
#include "util/probe-file.h"
44

45
#define DEFAULT_VAR_FILTER "!__k???tab_* & !__crc_*"
46
#define DEFAULT_FUNC_FILTER "!_*"
47
#define DEFAULT_LIST_FILTER "*"
48 49 50

/* Session management structure */
static struct {
51
	int command;	/* Command short_name */
52
	bool list_events;
53
	bool uprobes;
54
	bool quiet;
55
	bool target_used;
56 57
	int nevents;
	struct perf_probe_event events[MAX_PROBES];
58
	struct line_range line_range;
59
	char *target;
60
	struct strfilter *filter;
61
	struct nsinfo *nsi;
62
} params;
63

64
/* Parse an event definition. Note that any error must die. */
65
static int parse_probe_event(const char *str)
66
{
67
	struct perf_probe_event *pev = &params.events[params.nevents];
68
	int ret;
69

70
	pr_debug("probe-definition(%d): %s\n", params.nevents, str);
71 72 73 74
	if (++params.nevents == MAX_PROBES) {
		pr_err("Too many probes (> %d) were specified.", MAX_PROBES);
		return -1;
	}
75

76
	pev->uprobes = params.uprobes;
77 78 79 80
	if (params.target) {
		pev->target = strdup(params.target);
		if (!pev->target)
			return -ENOMEM;
81
		params.target_used = true;
82
	}
83

84
	pev->nsi = nsinfo__get(params.nsi);
85

86
	/* Parse a perf-probe command into event */
87
	ret = parse_perf_probe_command(str, pev);
88
	pr_debug("%d arguments\n", pev->nargs);
89 90

	return ret;
91 92
}

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
static int params_add_filter(const char *str)
{
	const char *err = NULL;
	int ret = 0;

	pr_debug2("Add filter: %s\n", str);
	if (!params.filter) {
		params.filter = strfilter__new(str, &err);
		if (!params.filter)
			ret = err ? -EINVAL : -ENOMEM;
	} else
		ret = strfilter__or(params.filter, str, &err);

	if (ret == -EINVAL) {
		pr_err("Filter parse error at %td.\n", err - str + 1);
		pr_err("Source: \"%s\"\n", str);
		pr_err("         %*c\n", (int)(err - str + 1), '^');
	}

	return ret;
}

115 116 117 118 119 120 121 122 123 124 125 126 127
static int set_target(const char *ptr)
{
	int found = 0;
	const char *buf;

	/*
	 * The first argument after options can be an absolute path
	 * to an executable / library or kernel module.
	 *
	 * TODO: Support relative path, and $PATH, $LD_LIBRARY_PATH,
	 * short module name.
	 */
	if (!params.target && ptr && *ptr == '/') {
128 129 130
		params.target = strdup(ptr);
		if (!params.target)
			return -ENOMEM;
131
		params.target_used = false;
132

133 134 135 136 137 138 139 140 141 142 143
		found = 1;
		buf = ptr + (strlen(ptr) - 3);

		if (strcmp(buf, ".ko"))
			params.uprobes = true;

	}

	return found;
}

144
static int parse_probe_event_argv(int argc, const char **argv)
145
{
146
	int i, len, ret, found_target;
147 148
	char *buf;

149
	found_target = set_target(argv[0]);
150 151 152
	if (found_target < 0)
		return found_target;

153 154 155
	if (found_target && argc == 1)
		return 0;

156 157
	/* Bind up rest arguments */
	len = 0;
158 159 160 161
	for (i = 0; i < argc; i++) {
		if (i == 0 && found_target)
			continue;

162
		len += strlen(argv[i]) + 1;
163
	}
164 165 166
	buf = zalloc(len + 1);
	if (buf == NULL)
		return -ENOMEM;
167
	len = 0;
168 169 170 171
	for (i = 0; i < argc; i++) {
		if (i == 0 && found_target)
			continue;

172
		len += sprintf(&buf[len], "%s ", argv[i]);
173
	}
174
	ret = parse_probe_event(buf);
175
	free(buf);
176
	return ret;
177 178
}

179
static int opt_set_target(const struct option *opt, const char *str,
180
			int unset __maybe_unused)
181 182
{
	int ret = -ENOENT;
183
	char *tmp;
184

185
	if  (str) {
186 187 188 189 190 191 192
		if (!strcmp(opt->long_name, "exec"))
			params.uprobes = true;
		else if (!strcmp(opt->long_name, "module"))
			params.uprobes = false;
		else
			return ret;

193 194
		/* Expand given path to absolute path, except for modulename */
		if (params.uprobes || strchr(str, '/')) {
195
			tmp = nsinfo__realpath(str, params.nsi);
196 197 198 199 200 201 202 203 204
			if (!tmp) {
				pr_warning("Failed to get the absolute path of %s: %m\n", str);
				return ret;
			}
		} else {
			tmp = strdup(str);
			if (!tmp)
				return -ENOMEM;
		}
205
		free(params.target);
206
		params.target = tmp;
207
		params.target_used = false;
208 209 210 211 212 213
		ret = 0;
	}

	return ret;
}

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
static int opt_set_target_ns(const struct option *opt __maybe_unused,
			     const char *str, int unset __maybe_unused)
{
	int ret = -ENOENT;
	pid_t ns_pid;
	struct nsinfo *nsip;

	if (str) {
		errno = 0;
		ns_pid = (pid_t)strtol(str, NULL, 10);
		if (errno != 0) {
			ret = -errno;
			pr_warning("Failed to parse %s as a pid: %s\n", str,
				   strerror(errno));
			return ret;
		}
		nsip = nsinfo__new(ns_pid);
		if (nsip && nsip->need_setns)
			params.nsi = nsinfo__get(nsip);
		nsinfo__put(nsip);

		ret = 0;
	}

	return ret;
}


242 243
/* Command option callbacks */

244
#ifdef HAVE_DWARF_SUPPORT
245
static int opt_show_lines(const struct option *opt,
246
			  const char *str, int unset __maybe_unused)
247
{
248 249
	int ret = 0;

250 251 252
	if (!str)
		return 0;

253
	if (params.command == 'L') {
254 255 256 257 258
		pr_warning("Warning: more than one --line options are"
			   " detected. Only the first one is valid.\n");
		return 0;
	}

259
	params.command = opt->short_name;
260
	ret = parse_line_range_desc(str, &params.line_range);
261 262

	return ret;
263
}
264

265
static int opt_show_vars(const struct option *opt,
266
			 const char *str, int unset __maybe_unused)
267 268 269 270 271 272 273 274 275 276 277 278
{
	struct perf_probe_event *pev = &params.events[params.nevents];
	int ret;

	if (!str)
		return 0;

	ret = parse_probe_event(str);
	if (!ret && pev->nargs != 0) {
		pr_err("  Error: '--vars' doesn't accept arguments.\n");
		return -EINVAL;
	}
279
	params.command = opt->short_name;
280 281 282

	return ret;
}
283 284 285
#else
# define opt_show_lines NULL
# define opt_show_vars NULL
286
#endif
287 288 289 290 291 292 293 294 295 296 297 298 299
static int opt_add_probe_event(const struct option *opt,
			      const char *str, int unset __maybe_unused)
{
	if (str) {
		params.command = opt->short_name;
		return parse_probe_event(str);
	}

	return 0;
}

static int opt_set_filter_with_command(const struct option *opt,
				       const char *str, int unset)
300 301
{
	if (!unset)
302
		params.command = opt->short_name;
303 304 305 306 307 308

	if (str)
		return params_add_filter(str);

	return 0;
}
309

310 311
static int opt_set_filter(const struct option *opt __maybe_unused,
			  const char *str, int unset __maybe_unused)
312
{
313 314
	if (str)
		return params_add_filter(str);
315

316
	return 0;
317
}
318

319
static int init_params(void)
320
{
321
	return line_range__init(&params.line_range);
322 323 324 325 326 327 328 329 330 331
}

static void cleanup_params(void)
{
	int i;

	for (i = 0; i < params.nevents; i++)
		clear_perf_probe_event(params.events + i);
	line_range__clear(&params.line_range);
	free(params.target);
332
	strfilter__delete(params.filter);
333
	nsinfo__put(params.nsi);
334 335 336
	memset(&params, 0, sizeof(params));
}

337 338
static void pr_err_with_code(const char *msg, int err)
{
339 340
	char sbuf[STRERR_BUFSIZE];

341
	pr_err("%s", msg);
342
	pr_debug(" Reason: %s (Code: %d)",
343
		 str_error_r(-err, sbuf, sizeof(sbuf)), err);
344 345 346
	pr_err("\n");
}

347 348 349 350 351 352
static int perf_add_probe_events(struct perf_probe_event *pevs, int npevs)
{
	int ret;
	int i, k;
	const char *event = NULL, *group = NULL;

353 354 355 356
	ret = init_probe_symbol_maps(pevs->uprobes);
	if (ret < 0)
		return ret;

357 358 359 360
	ret = convert_perf_probe_events(pevs, npevs);
	if (ret < 0)
		goto out_cleanup;

361 362 363 364 365
	if (params.command == 'D') {	/* it shows definition */
		ret = show_probe_trace_events(pevs, npevs);
		goto out_cleanup;
	}

366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
	ret = apply_perf_probe_events(pevs, npevs);
	if (ret < 0)
		goto out_cleanup;

	for (i = k = 0; i < npevs; i++)
		k += pevs[i].ntevs;

	pr_info("Added new event%s\n", (k > 1) ? "s:" : ":");
	for (i = 0; i < npevs; i++) {
		struct perf_probe_event *pev = &pevs[i];

		for (k = 0; k < pev->ntevs; k++) {
			struct probe_trace_event *tev = &pev->tevs[k];

			/* We use tev's name for showing new events */
			show_perf_probe_event(tev->group, tev->event, pev,
					      tev->point.module, false);

			/* Save the last valid name */
			event = tev->event;
			group = tev->group;
		}
	}

	/* Note that it is possible to skip all events because of blacklist */
	if (event) {
		/* Show how to use the event. */
		pr_info("\nYou can now use it in all perf tools, such as:\n\n");
		pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
	}

out_cleanup:
	cleanup_perf_probe_events(pevs, npevs);
399
	exit_probe_symbol_maps();
400 401 402
	return ret;
}

403 404 405 406 407 408 409
static int del_perf_probe_caches(struct strfilter *filter)
{
	struct probe_cache *cache;
	struct strlist *bidlist;
	struct str_node *nd;
	int ret;

410
	bidlist = build_id_cache__list_all(false);
411 412 413 414 415 416 417
	if (!bidlist) {
		ret = -errno;
		pr_debug("Failed to get buildids: %d\n", ret);
		return ret ?: -ENOMEM;
	}

	strlist__for_each_entry(nd, bidlist) {
418
		cache = probe_cache__new(nd->s, NULL);
419 420 421 422 423 424 425 426 427 428
		if (!cache)
			continue;
		if (probe_cache__filter_purge(cache, filter) < 0 ||
		    probe_cache__commit(cache) < 0)
			pr_warning("Failed to remove entries for %s\n", nd->s);
		probe_cache__delete(cache);
	}
	return 0;
}

429 430 431 432 433 434 435 436 437 438 439 440
static int perf_del_probe_events(struct strfilter *filter)
{
	int ret, ret2, ufd = -1, kfd = -1;
	char *str = strfilter__string(filter);
	struct strlist *klist = NULL, *ulist = NULL;
	struct str_node *ent;

	if (!str)
		return -EINVAL;

	pr_debug("Delete filter: \'%s\'\n", str);

441 442 443
	if (probe_conf.cache)
		return del_perf_probe_caches(filter);

444 445 446 447 448 449
	/* Get current event names */
	ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW);
	if (ret < 0)
		goto out;

	klist = strlist__new(NULL, NULL);
450 451 452 453 454
	ulist = strlist__new(NULL, NULL);
	if (!klist || !ulist) {
		ret = -ENOMEM;
		goto out;
	}
455 456 457

	ret = probe_file__get_events(kfd, filter, klist);
	if (ret == 0) {
458
		strlist__for_each_entry(ent, klist)
459 460 461 462 463 464 465 466 467
			pr_info("Removed event: %s\n", ent->s);

		ret = probe_file__del_strlist(kfd, klist);
		if (ret < 0)
			goto error;
	}

	ret2 = probe_file__get_events(ufd, filter, ulist);
	if (ret2 == 0) {
468
		strlist__for_each_entry(ent, ulist)
469 470 471 472 473 474 475 476
			pr_info("Removed event: %s\n", ent->s);

		ret2 = probe_file__del_strlist(ufd, ulist);
		if (ret2 < 0)
			goto error;
	}

	if (ret == -ENOENT && ret2 == -ENOENT)
477 478 479
		pr_warning("\"%s\" does not hit any event.\n", str);
	else
		ret = 0;
480 481 482 483 484 485 486 487 488 489 490 491 492 493

error:
	if (kfd >= 0)
		close(kfd);
	if (ufd >= 0)
		close(ufd);
out:
	strlist__delete(klist);
	strlist__delete(ulist);
	free(str);

	return ret;
}

494 495 496 497 498 499 500 501
#ifdef HAVE_DWARF_SUPPORT
#define PROBEDEF_STR	\
	"[EVENT=]FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT [[NAME=]ARG ...]"
#else
#define PROBEDEF_STR	"[EVENT=]FUNC[+OFF|%return] [[NAME=]ARG ...]"
#endif


502
static int
503
__cmd_probe(int argc, const char **argv)
504 505 506 507 508
{
	const char * const probe_usage[] = {
		"perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]",
		"perf probe [<options>] --add 'PROBEDEF' [--add 'PROBEDEF' ...]",
		"perf probe [<options>] --del '[GROUP:]EVENT' ...",
509
		"perf probe --list [GROUP:]EVENT ...",
510
#ifdef HAVE_DWARF_SUPPORT
511 512
		"perf probe [<options>] --line 'LINEDESC'",
		"perf probe [<options>] --vars 'PROBEPOINT'",
513
#endif
514
		"perf probe [<options>] --funcs",
515
		NULL
516
	};
517
	struct option options[] = {
518
	OPT_INCR('v', "verbose", &verbose,
519
		    "be more verbose (show parsed arguments, etc)"),
520
	OPT_BOOLEAN('q', "quiet", &params.quiet,
M
Masanari Iida 已提交
521
		    "be quiet (do not show any messages)"),
522
	OPT_CALLBACK_DEFAULT('l', "list", NULL, "[GROUP:]EVENT",
523 524
			     "list up probe events",
			     opt_set_filter_with_command, DEFAULT_LIST_FILTER),
525
	OPT_CALLBACK('d', "del", NULL, "[GROUP:]EVENT", "delete a probe event.",
526
		     opt_set_filter_with_command),
527
	OPT_CALLBACK('a', "add", NULL, PROBEDEF_STR,
528
		"probe point definition, where\n"
529 530
		"\t\tGROUP:\tGroup name (optional)\n"
		"\t\tEVENT:\tEvent name\n"
531
		"\t\tFUNC:\tFunction name\n"
532
		"\t\tOFF:\tOffset from function entry (in byte)\n"
533
		"\t\t%return:\tPut the probe at function return\n"
534
#ifdef HAVE_DWARF_SUPPORT
535
		"\t\tSRC:\tSource code path\n"
536 537 538
		"\t\tRL:\tRelative line number from function entry.\n"
		"\t\tAL:\tAbsolute line number in file.\n"
		"\t\tPT:\tLazy expression of line code.\n"
539
		"\t\tARG:\tProbe argument (local variable name or\n"
540
		"\t\t\tkprobe-tracer argument format.)\n",
541 542 543
#else
		"\t\tARG:\tProbe argument (kprobe-tracer argument format.)\n",
#endif
544
		opt_add_probe_event),
545 546 547
	OPT_CALLBACK('D', "definition", NULL, PROBEDEF_STR,
		"Show trace event definition of given traceevent for k/uprobe_events.",
		opt_add_probe_event),
548
	OPT_BOOLEAN('f', "force", &probe_conf.force_add, "forcibly add events"
549
		    " with existing name"),
550
	OPT_CALLBACK('L', "line", NULL,
551
		     "FUNC[:RLN[+NUM|-RLN2]]|SRC:ALN[+NUM|-ALN2]",
552
		     "Show source code lines.", opt_show_lines),
553 554 555
	OPT_CALLBACK('V', "vars", NULL,
		     "FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT",
		     "Show accessible variables on PROBEDEF", opt_show_vars),
556
	OPT_BOOLEAN('\0', "externs", &probe_conf.show_ext_vars,
557
		    "Show external variables too (with --vars only)"),
558 559
	OPT_BOOLEAN('\0', "range", &probe_conf.show_location_range,
		"Show variables location range in scope (with --vars only)"),
560 561
	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
		   "file", "vmlinux pathname"),
562 563
	OPT_STRING('s', "source", &symbol_conf.source_prefix,
		   "directory", "path to kernel source"),
564 565
	OPT_BOOLEAN('\0', "no-inlines", &probe_conf.no_inlines,
		"Don't search inlined functions"),
566
	OPT__DRY_RUN(&probe_event_dry_run),
567
	OPT_INTEGER('\0', "max-probes", &probe_conf.max_probes,
568
		 "Set how many probe points can be found for a probe."),
569 570
	OPT_CALLBACK_DEFAULT('F', "funcs", NULL, "[FILTER]",
			     "Show potential probe-able functions.",
571
			     opt_set_filter_with_command, DEFAULT_FUNC_FILTER),
572 573 574 575 576
	OPT_CALLBACK('\0', "filter", NULL,
		     "[!]FILTER", "Set a filter (with --vars/funcs only)\n"
		     "\t\t\t(default: \"" DEFAULT_VAR_FILTER "\" for --vars,\n"
		     "\t\t\t \"" DEFAULT_FUNC_FILTER "\" for --funcs)",
		     opt_set_filter),
577 578
	OPT_CALLBACK('x', "exec", NULL, "executable|path",
			"target executable name or path", opt_set_target),
579 580 581
	OPT_CALLBACK('m', "module", NULL, "modname|path",
		"target module name (for online) or path (for offline)",
		opt_set_target),
582
	OPT_BOOLEAN(0, "demangle", &symbol_conf.demangle,
583
		    "Enable symbol demangling"),
584 585
	OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel,
		    "Enable kernel symbol demangling"),
586
	OPT_BOOLEAN(0, "cache", &probe_conf.cache, "Manipulate probe cache"),
587 588
	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
		   "Look for files with symbols relative to this directory"),
589 590
	OPT_CALLBACK(0, "target-ns", NULL, "pid",
		     "target pid for namespace contexts", opt_set_target_ns),
591
	OPT_END()
592
	};
593 594
	int ret;

595 596
	set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE);
	set_option_flag(options, 'd', "del", PARSE_OPT_EXCLUSIVE);
597
	set_option_flag(options, 'D', "definition", PARSE_OPT_EXCLUSIVE);
598 599 600 601
	set_option_flag(options, 'l', "list", PARSE_OPT_EXCLUSIVE);
#ifdef HAVE_DWARF_SUPPORT
	set_option_flag(options, 'L', "line", PARSE_OPT_EXCLUSIVE);
	set_option_flag(options, 'V', "vars", PARSE_OPT_EXCLUSIVE);
602 603 604 605 606 607 608 609 610 611
#else
# define set_nobuild(s, l, c) set_option_nobuild(options, s, l, "NO_DWARF=1", c)
	set_nobuild('L', "line", false);
	set_nobuild('V', "vars", false);
	set_nobuild('\0', "externs", false);
	set_nobuild('\0', "range", false);
	set_nobuild('k', "vmlinux", true);
	set_nobuild('s', "source", true);
	set_nobuild('\0', "no-inlines", true);
# undef set_nobuild
612
#endif
613
	set_option_flag(options, 'F', "funcs", PARSE_OPT_EXCLUSIVE);
614

615
	argc = parse_options(argc, argv, options, probe_usage,
616
			     PARSE_OPT_STOP_AT_NON_OPTION);
617 618
	if (argc > 0) {
		if (strcmp(argv[0], "-") == 0) {
619 620
			usage_with_options_msg(probe_usage, options,
				"'-' is not supported.\n");
621
		}
622
		if (params.command && params.command != 'a') {
623 624
			usage_with_options_msg(probe_usage, options,
				"another command except --add is set.\n");
625
		}
626 627
		ret = parse_probe_event_argv(argc, argv);
		if (ret < 0) {
628
			pr_err_with_code("  Error: Command Parse Error.", ret);
629 630
			return ret;
		}
631
		params.command = 'a';
632
	}
633

634 635 636 637 638 639 640 641
	if (params.quiet) {
		if (verbose != 0) {
			pr_err("  Error: -v and -q are exclusive.\n");
			return -EINVAL;
		}
		verbose = -1;
	}

642 643
	if (probe_conf.max_probes == 0)
		probe_conf.max_probes = MAX_PROBES;
644

645 646 647 648 649
	/*
	 * Only consider the user's kernel image path if given.
	 */
	symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL);

650 651 652 653 654 655 656 657
	/*
	 * Except for --list, --del and --add, other command doesn't depend
	 * nor change running kernel. So if user gives offline vmlinux,
	 * ignore its buildid.
	 */
	if (!strchr("lda", params.command) && symbol_conf.vmlinux_name)
		symbol_conf.ignore_vmlinux_buildid = true;

658 659
	switch (params.command) {
	case 'l':
660
		if (params.uprobes) {
661 662 663 664
			pr_err("  Error: Don't use --list with --exec.\n");
			parse_options_usage(probe_usage, options, "l", true);
			parse_options_usage(NULL, options, "x", true);
			return -EINVAL;
665
		}
666
		ret = show_perf_probe_events(params.filter);
667
		if (ret < 0)
668
			pr_err_with_code("  Error: Failed to show event list.", ret);
669
		return ret;
670
	case 'F':
671 672
		ret = show_available_funcs(params.target, params.nsi,
					   params.filter, params.uprobes);
673
		if (ret < 0)
674
			pr_err_with_code("  Error: Failed to show functions.", ret);
675
		return ret;
676
#ifdef HAVE_DWARF_SUPPORT
677
	case 'L':
678
		ret = show_line_range(&params.line_range, params.target,
679
				      params.nsi, params.uprobes);
680
		if (ret < 0)
681
			pr_err_with_code("  Error: Failed to show lines.", ret);
682
		return ret;
683
	case 'V':
684 685 686 687
		if (!params.filter)
			params.filter = strfilter__new(DEFAULT_VAR_FILTER,
						       NULL);

688
		ret = show_available_vars(params.events, params.nevents,
689
					  params.filter);
690
		if (ret < 0)
691
			pr_err_with_code("  Error: Failed to show vars.", ret);
692
		return ret;
693
#endif
694
	case 'd':
695
		ret = perf_del_probe_events(params.filter);
696
		if (ret < 0) {
697
			pr_err_with_code("  Error: Failed to delete events.", ret);
698 699
			return ret;
		}
700
		break;
701
	case 'D':
702 703
	case 'a':

704 705
		/* Ensure the last given target is used */
		if (params.target && !params.target_used) {
706 707 708 709
			pr_err("  Error: -x/-m must follow the probe definitions.\n");
			parse_options_usage(probe_usage, options, "m", true);
			parse_options_usage(NULL, options, "x", true);
			return -EINVAL;
710 711
		}

712
		ret = perf_add_probe_events(params.events, params.nevents);
713
		if (ret < 0) {
714 715 716 717 718 719 720 721 722 723

			/*
			 * When perf_add_probe_events() fails it calls
			 * cleanup_perf_probe_events(pevs, npevs), i.e.
			 * cleanup_perf_probe_events(params.events, params.nevents), which
			 * will call clear_perf_probe_event(), so set nevents to zero
			 * to avoid cleanup_params() to call clear_perf_probe_event() again
			 * on the same pevs.
			 */
			params.nevents = 0;
724
			pr_err_with_code("  Error: Failed to add events.", ret);
725 726
			return ret;
		}
727 728 729
		break;
	default:
		usage_with_options(probe_usage, options);
730
	}
731 732
	return 0;
}
733

734
int cmd_probe(int argc, const char **argv)
735 736 737
{
	int ret;

738 739
	ret = init_params();
	if (!ret) {
740
		ret = __cmd_probe(argc, argv);
741 742
		cleanup_params();
	}
743

744
	return ret < 0 ? ret : 0;
745
}