trace_kprobe.c 36.3 KB
Newer Older
1
/*
2
 * Kprobes-based tracing events
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * Created 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 version 2 as
 * published by the Free Software Foundation.
 *
 * 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 <linux/module.h>
#include <linux/uaccess.h>

23
#include "trace_probe.h"
24

25
#define KPROBE_EVENT_SYSTEM "kprobes"
26

27
/**
28
 * Kprobe event core functions
29
 */
30
struct trace_kprobe {
31
	struct list_head	list;
32
	struct kretprobe	rp;	/* Use rp.kp for kprobe use */
33
	unsigned long __percpu *nhit;
34
	const char		*symbol;	/* symbol name */
35
	struct trace_probe	tp;
36 37
};

38 39
#define SIZEOF_TRACE_KPROBE(n)				\
	(offsetof(struct trace_kprobe, tp.args) +	\
40
	(sizeof(struct probe_arg) * (n)))
41

42

43
static nokprobe_inline bool trace_kprobe_is_return(struct trace_kprobe *tk)
44
{
45
	return tk->rp.handler != NULL;
46 47
}

48
static nokprobe_inline const char *trace_kprobe_symbol(struct trace_kprobe *tk)
49
{
50
	return tk->symbol ? tk->symbol : "unknown";
51 52
}

53
static nokprobe_inline unsigned long trace_kprobe_offset(struct trace_kprobe *tk)
54
{
55
	return tk->rp.kp.offset;
56 57
}

58
static nokprobe_inline bool trace_kprobe_has_gone(struct trace_kprobe *tk)
59
{
60
	return !!(kprobe_gone(&tk->rp.kp));
61 62
}

63
static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk,
64
						 struct module *mod)
65 66
{
	int len = strlen(mod->name);
67
	const char *name = trace_kprobe_symbol(tk);
68 69 70
	return strncmp(mod->name, name, len) == 0 && name[len] == ':';
}

71
static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk)
72
{
73
	return !!strchr(trace_kprobe_symbol(tk), ':');
74 75
}

76 77
static int register_kprobe_event(struct trace_kprobe *tk);
static int unregister_kprobe_event(struct trace_kprobe *tk);
78 79 80 81

static DEFINE_MUTEX(probe_lock);
static LIST_HEAD(probe_list);

82 83 84 85
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
static int kretprobe_dispatcher(struct kretprobe_instance *ri,
				struct pt_regs *regs);

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/* Memory fetching by symbol */
struct symbol_cache {
	char		*symbol;
	long		offset;
	unsigned long	addr;
};

unsigned long update_symbol_cache(struct symbol_cache *sc)
{
	sc->addr = (unsigned long)kallsyms_lookup_name(sc->symbol);

	if (sc->addr)
		sc->addr += sc->offset;

	return sc->addr;
}

void free_symbol_cache(struct symbol_cache *sc)
{
	kfree(sc->symbol);
	kfree(sc);
}

struct symbol_cache *alloc_symbol_cache(const char *sym, long offset)
{
	struct symbol_cache *sc;

	if (!sym || strlen(sym) == 0)
		return NULL;

	sc = kzalloc(sizeof(struct symbol_cache), GFP_KERNEL);
	if (!sc)
		return NULL;

	sc->symbol = kstrdup(sym, GFP_KERNEL);
	if (!sc->symbol) {
		kfree(sc);
		return NULL;
	}
	sc->offset = offset;
	update_symbol_cache(sc);

	return sc;
}

131 132 133 134
/*
 * Kprobes-specific fetch functions
 */
#define DEFINE_FETCH_stack(type)					\
135
static void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,		\
136 137 138 139
					  void *offset, void *dest)	\
{									\
	*(type *)dest = (type)regs_get_kernel_stack_nth(regs,		\
				(unsigned int)((unsigned long)offset));	\
140 141 142
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(stack, type));

143 144 145 146 147
DEFINE_BASIC_FETCH_FUNCS(stack)
/* No string on the stack entry */
#define fetch_stack_string	NULL
#define fetch_stack_string_size	NULL

148
#define DEFINE_FETCH_memory(type)					\
149
static void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs,		\
150 151 152 153 154 155 156
					  void *addr, void *dest)	\
{									\
	type retval;							\
	if (probe_kernel_address(addr, retval))				\
		*(type *)dest = 0;					\
	else								\
		*(type *)dest = retval;					\
157 158 159
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, type));

160 161 162 163 164
DEFINE_BASIC_FETCH_FUNCS(memory)
/*
 * Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
 * length and relative data location.
 */
165 166
static void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
					    void *addr, void *dest)
167 168 169
{
	int maxlen = get_rloc_len(*(u32 *)dest);
	u8 *dst = get_rloc_data(dest);
170
	long ret;
171 172 173 174 175 176 177 178

	if (!maxlen)
		return;

	/*
	 * Try to get string again, since the string can be changed while
	 * probing.
	 */
179
	ret = strncpy_from_unsafe(dst, addr, maxlen);
180 181

	if (ret < 0) {	/* Failed to fetch string */
182
		dst[0] = '\0';
183 184
		*(u32 *)dest = make_data_rloc(0, get_rloc_offs(*(u32 *)dest));
	} else {
185
		*(u32 *)dest = make_data_rloc(ret, get_rloc_offs(*(u32 *)dest));
186 187
	}
}
188
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string));
189 190

/* Return the length of string -- including null terminal byte */
191 192
static void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs,
						 void *addr, void *dest)
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
{
	mm_segment_t old_fs;
	int ret, len = 0;
	u8 c;

	old_fs = get_fs();
	set_fs(KERNEL_DS);
	pagefault_disable();

	do {
		ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1);
		len++;
	} while (c && ret == 0 && len < MAX_STRING_SIZE);

	pagefault_enable();
	set_fs(old_fs);

	if (ret < 0)	/* Failed to check the length */
		*(u32 *)dest = 0;
	else
		*(u32 *)dest = len;
}
215
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(memory, string_size));
216

217
#define DEFINE_FETCH_symbol(type)					\
218
void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs, void *data, void *dest)\
219 220 221 222 223 224
{									\
	struct symbol_cache *sc = data;					\
	if (sc->addr)							\
		fetch_memory_##type(regs, (void *)sc->addr, dest);	\
	else								\
		*(type *)dest = 0;					\
225 226 227
}									\
NOKPROBE_SYMBOL(FETCH_FUNC_NAME(symbol, type));

228 229 230 231
DEFINE_BASIC_FETCH_FUNCS(symbol)
DEFINE_FETCH_symbol(string)
DEFINE_FETCH_symbol(string_size)

232 233 234 235 236 237 238 239
/* kprobes don't support file_offset fetch methods */
#define fetch_file_offset_u8		NULL
#define fetch_file_offset_u16		NULL
#define fetch_file_offset_u32		NULL
#define fetch_file_offset_u64		NULL
#define fetch_file_offset_string	NULL
#define fetch_file_offset_string_size	NULL

240
/* Fetch type information table */
241
static const struct fetch_type kprobes_fetch_type_table[] = {
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
	/* Special types */
	[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
					sizeof(u32), 1, "__data_loc char[]"),
	[FETCH_TYPE_STRSIZE] = __ASSIGN_FETCH_TYPE("string_size", u32,
					string_size, sizeof(u32), 0, "u32"),
	/* Basic types */
	ASSIGN_FETCH_TYPE(u8,  u8,  0),
	ASSIGN_FETCH_TYPE(u16, u16, 0),
	ASSIGN_FETCH_TYPE(u32, u32, 0),
	ASSIGN_FETCH_TYPE(u64, u64, 0),
	ASSIGN_FETCH_TYPE(s8,  u8,  1),
	ASSIGN_FETCH_TYPE(s16, u16, 1),
	ASSIGN_FETCH_TYPE(s32, u32, 1),
	ASSIGN_FETCH_TYPE(s64, u64, 1),

	ASSIGN_FETCH_TYPE_END
};

260 261 262
/*
 * Allocate new trace_probe and initialize it (including kprobes).
 */
263
static struct trace_kprobe *alloc_trace_kprobe(const char *group,
264
					     const char *event,
265 266 267
					     void *addr,
					     const char *symbol,
					     unsigned long offs,
268
					     int nargs, bool is_return)
269
{
270
	struct trace_kprobe *tk;
271
	int ret = -ENOMEM;
272

273 274
	tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
	if (!tk)
275
		return ERR_PTR(ret);
276

277 278 279 280
	tk->nhit = alloc_percpu(unsigned long);
	if (!tk->nhit)
		goto error;

281
	if (symbol) {
282 283
		tk->symbol = kstrdup(symbol, GFP_KERNEL);
		if (!tk->symbol)
284
			goto error;
285 286
		tk->rp.kp.symbol_name = tk->symbol;
		tk->rp.kp.offset = offs;
287
	} else
288
		tk->rp.kp.addr = addr;
289 290

	if (is_return)
291
		tk->rp.handler = kretprobe_dispatcher;
292
	else
293
		tk->rp.kp.pre_handler = kprobe_dispatcher;
294

295
	if (!event || !is_good_name(event)) {
296
		ret = -EINVAL;
297
		goto error;
298 299
	}

300 301 302
	tk->tp.call.class = &tk->tp.class;
	tk->tp.call.name = kstrdup(event, GFP_KERNEL);
	if (!tk->tp.call.name)
303
		goto error;
304

305
	if (!group || !is_good_name(group)) {
306
		ret = -EINVAL;
307
		goto error;
308 309
	}

310 311
	tk->tp.class.system = kstrdup(group, GFP_KERNEL);
	if (!tk->tp.class.system)
312 313
		goto error;

314 315 316
	INIT_LIST_HEAD(&tk->list);
	INIT_LIST_HEAD(&tk->tp.files);
	return tk;
317
error:
318 319
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
320
	free_percpu(tk->nhit);
321
	kfree(tk);
322
	return ERR_PTR(ret);
323 324
}

325
static void free_trace_kprobe(struct trace_kprobe *tk)
326 327 328
{
	int i;

329 330
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_free_probe_arg(&tk->tp.args[i]);
331

332 333 334
	kfree(tk->tp.call.class->system);
	kfree(tk->tp.call.name);
	kfree(tk->symbol);
335
	free_percpu(tk->nhit);
336
	kfree(tk);
337 338
}

339 340
static struct trace_kprobe *find_trace_kprobe(const char *event,
					      const char *group)
341
{
342
	struct trace_kprobe *tk;
343

344
	list_for_each_entry(tk, &probe_list, list)
345
		if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
346 347
		    strcmp(tk->tp.call.class->system, group) == 0)
			return tk;
348 349 350
	return NULL;
}

351 352 353 354 355
/*
 * Enable trace_probe
 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
 */
static int
356
enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
357 358 359
{
	int ret = 0;

360
	if (file) {
361 362 363 364
		struct event_file_link *link;

		link = kmalloc(sizeof(*link), GFP_KERNEL);
		if (!link) {
365
			ret = -ENOMEM;
366
			goto out;
367 368
		}

369
		link->file = file;
370
		list_add_tail_rcu(&link->list, &tk->tp.files);
371

372
		tk->tp.flags |= TP_FLAG_TRACE;
373
	} else
374
		tk->tp.flags |= TP_FLAG_PROFILE;
375

376 377 378
	if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
		if (trace_kprobe_is_return(tk))
			ret = enable_kretprobe(&tk->rp);
379
		else
380
			ret = enable_kprobe(&tk->rp.kp);
381
	}
382
 out:
383 384 385
	return ret;
}

386 387 388 389 390
/*
 * Disable trace_probe
 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
 */
static int
391
disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
392
{
393 394
	struct event_file_link *link = NULL;
	int wait = 0;
395 396 397
	int ret = 0;

	if (file) {
398
		link = find_event_file_link(&tk->tp, file);
399
		if (!link) {
400
			ret = -EINVAL;
401
			goto out;
402 403
		}

404
		list_del_rcu(&link->list);
405
		wait = 1;
406
		if (!list_empty(&tk->tp.files))
407
			goto out;
408

409
		tk->tp.flags &= ~TP_FLAG_TRACE;
410
	} else
411
		tk->tp.flags &= ~TP_FLAG_PROFILE;
412

413 414 415
	if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
		if (trace_kprobe_is_return(tk))
			disable_kretprobe(&tk->rp);
416
		else
417
			disable_kprobe(&tk->rp.kp);
418
		wait = 1;
419
	}
420
 out:
421 422 423 424 425 426 427 428 429 430 431 432 433
	if (wait) {
		/*
		 * Synchronize with kprobe_trace_func/kretprobe_trace_func
		 * to ensure disabled (all running handlers are finished).
		 * This is not only for kfree(), but also the caller,
		 * trace_remove_event_call() supposes it for releasing
		 * event_call related objects, which will be accessed in
		 * the kprobe_trace_func/kretprobe_trace_func.
		 */
		synchronize_sched();
		kfree(link);	/* Ignored if link == NULL */
	}

434
	return ret;
435 436
}

437
/* Internal register function - just handle k*probes and flags */
438
static int __register_trace_kprobe(struct trace_kprobe *tk)
439
{
440
	int i, ret;
441

442
	if (trace_probe_is_registered(&tk->tp))
443 444
		return -EINVAL;

445 446
	for (i = 0; i < tk->tp.nr_args; i++)
		traceprobe_update_arg(&tk->tp.args[i]);
447

448
	/* Set/clear disabled flag according to tp->flag */
449 450
	if (trace_probe_is_enabled(&tk->tp))
		tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
451
	else
452
		tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
453

454 455
	if (trace_kprobe_is_return(tk))
		ret = register_kretprobe(&tk->rp);
456
	else
457
		ret = register_kprobe(&tk->rp.kp);
458 459

	if (ret == 0)
460
		tk->tp.flags |= TP_FLAG_REGISTERED;
461
	else {
462 463
		pr_warn("Could not insert probe at %s+%lu: %d\n",
			trace_kprobe_symbol(tk), trace_kprobe_offset(tk), ret);
464
		if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
465
			pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
466 467
			ret = 0;
		} else if (ret == -EILSEQ) {
468 469
			pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
				tk->rp.kp.addr);
470 471 472 473 474 475 476 477
			ret = -EINVAL;
		}
	}

	return ret;
}

/* Internal unregister function - just handle k*probes and flags */
478
static void __unregister_trace_kprobe(struct trace_kprobe *tk)
479
{
480 481 482
	if (trace_probe_is_registered(&tk->tp)) {
		if (trace_kprobe_is_return(tk))
			unregister_kretprobe(&tk->rp);
483
		else
484 485
			unregister_kprobe(&tk->rp.kp);
		tk->tp.flags &= ~TP_FLAG_REGISTERED;
486
		/* Cleanup kprobe for reuse */
487 488
		if (tk->rp.kp.symbol_name)
			tk->rp.kp.addr = NULL;
489 490 491 492
	}
}

/* Unregister a trace_probe and probe_event: call with locking probe_lock */
493
static int unregister_trace_kprobe(struct trace_kprobe *tk)
494
{
495
	/* Enabled event can not be unregistered */
496
	if (trace_probe_is_enabled(&tk->tp))
497 498
		return -EBUSY;

499
	/* Will fail if probe is being used by ftrace or perf */
500
	if (unregister_kprobe_event(tk))
501 502
		return -EBUSY;

503 504
	__unregister_trace_kprobe(tk);
	list_del(&tk->list);
505 506

	return 0;
507 508 509
}

/* Register a trace_probe and probe_event */
510
static int register_trace_kprobe(struct trace_kprobe *tk)
511
{
512
	struct trace_kprobe *old_tk;
513 514 515 516
	int ret;

	mutex_lock(&probe_lock);

517
	/* Delete old (same name) event if exist */
518
	old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
519
			tk->tp.call.class->system);
520 521
	if (old_tk) {
		ret = unregister_trace_kprobe(old_tk);
522 523
		if (ret < 0)
			goto end;
524
		free_trace_kprobe(old_tk);
525
	}
526 527

	/* Register new event */
528
	ret = register_kprobe_event(tk);
529
	if (ret) {
530
		pr_warn("Failed to register probe event(%d)\n", ret);
531 532 533
		goto end;
	}

534
	/* Register k*probe */
535
	ret = __register_trace_kprobe(tk);
536
	if (ret < 0)
537
		unregister_kprobe_event(tk);
538
	else
539
		list_add_tail(&tk->list, &probe_list);
540

541 542 543 544 545
end:
	mutex_unlock(&probe_lock);
	return ret;
}

546
/* Module notifier call back, checking event on the module */
547
static int trace_kprobe_module_callback(struct notifier_block *nb,
548 549 550
				       unsigned long val, void *data)
{
	struct module *mod = data;
551
	struct trace_kprobe *tk;
552 553 554 555 556 557 558
	int ret;

	if (val != MODULE_STATE_COMING)
		return NOTIFY_DONE;

	/* Update probes on coming module */
	mutex_lock(&probe_lock);
559 560
	list_for_each_entry(tk, &probe_list, list) {
		if (trace_kprobe_within_module(tk, mod)) {
561
			/* Don't need to check busy - this should have gone. */
562 563
			__unregister_trace_kprobe(tk);
			ret = __register_trace_kprobe(tk);
564
			if (ret)
565 566 567
				pr_warn("Failed to re-register probe %s on %s: %d\n",
					trace_event_name(&tk->tp.call),
					mod->name, ret);
568 569 570 571 572 573 574
		}
	}
	mutex_unlock(&probe_lock);

	return NOTIFY_DONE;
}

575 576
static struct notifier_block trace_kprobe_module_nb = {
	.notifier_call = trace_kprobe_module_callback,
577 578 579
	.priority = 1	/* Invoked after kprobe module callback */
};

580
static int create_trace_kprobe(int argc, char **argv)
581 582 583
{
	/*
	 * Argument syntax:
584 585
	 *  - Add kprobe: p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
	 *  - Add kretprobe: r[:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
586
	 * Fetch args:
587 588 589
	 *  $retval	: fetch return value
	 *  $stack	: fetch stack address
	 *  $stackN	: fetch Nth of stack (N:0-)
590 591 592
	 *  @ADDR	: fetch memory at ADDR (ADDR should be in kernel)
	 *  @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol)
	 *  %REG	: fetch register REG
593
	 * Dereferencing memory fetch:
594
	 *  +|-offs(ARG) : fetch memory at ARG +|- offs address.
595 596
	 * Alias name of args:
	 *  NAME=FETCHARG : set NAME as alias of FETCHARG.
597 598
	 * Type of args:
	 *  FETCHARG:TYPE : use TYPE instead of unsigned long.
599
	 */
600
	struct trace_kprobe *tk;
601
	int i, ret = 0;
602
	bool is_return = false, is_delete = false;
603
	char *symbol = NULL, *event = NULL, *group = NULL;
604
	char *arg;
605
	unsigned long offset = 0;
606
	void *addr = NULL;
607
	char buf[MAX_EVENT_NAME_LEN];
608

609
	/* argc must be >= 1 */
610
	if (argv[0][0] == 'p')
611
		is_return = false;
612
	else if (argv[0][0] == 'r')
613
		is_return = true;
614
	else if (argv[0][0] == '-')
615
		is_delete = true;
616
	else {
617 618
		pr_info("Probe definition must be started with 'p', 'r' or"
			" '-'.\n");
619
		return -EINVAL;
620
	}
621 622 623

	if (argv[0][1] == ':') {
		event = &argv[0][2];
624 625 626 627 628
		if (strchr(event, '/')) {
			group = event;
			event = strchr(group, '/') + 1;
			event[-1] = '\0';
			if (strlen(group) == 0) {
629
				pr_info("Group name is not specified\n");
630 631 632
				return -EINVAL;
			}
		}
633
		if (strlen(event) == 0) {
634
			pr_info("Event name is not specified\n");
635 636 637
			return -EINVAL;
		}
	}
638 639
	if (!group)
		group = KPROBE_EVENT_SYSTEM;
640

641 642 643 644 645
	if (is_delete) {
		if (!event) {
			pr_info("Delete command needs an event name.\n");
			return -EINVAL;
		}
646
		mutex_lock(&probe_lock);
647 648
		tk = find_trace_kprobe(event, group);
		if (!tk) {
649
			mutex_unlock(&probe_lock);
650 651 652 653
			pr_info("Event %s/%s doesn't exist.\n", group, event);
			return -ENOENT;
		}
		/* delete an event */
654
		ret = unregister_trace_kprobe(tk);
655
		if (ret == 0)
656
			free_trace_kprobe(tk);
657
		mutex_unlock(&probe_lock);
658
		return ret;
659 660 661 662 663 664
	}

	if (argc < 2) {
		pr_info("Probe point is not specified.\n");
		return -EINVAL;
	}
665
	if (isdigit(argv[1][0])) {
666 667
		if (is_return) {
			pr_info("Return probe point must be a symbol.\n");
668
			return -EINVAL;
669
		}
670
		/* an address specified */
671
		ret = kstrtoul(&argv[1][0], 0, (unsigned long *)&addr);
672 673
		if (ret) {
			pr_info("Failed to parse address.\n");
674
			return ret;
675
		}
676 677 678 679
	} else {
		/* a symbol specified */
		symbol = argv[1];
		/* TODO: support .init module functions */
680
		ret = traceprobe_split_symbol_offset(symbol, &offset);
681 682
		if (ret) {
			pr_info("Failed to parse symbol.\n");
683
			return ret;
684 685 686
		}
		if (offset && is_return) {
			pr_info("Return probe must be used without offset.\n");
687
			return -EINVAL;
688
		}
689
	}
690
	argc -= 2; argv += 2;
691 692

	/* setup a probe */
693 694 695
	if (!event) {
		/* Make a new event name */
		if (symbol)
696
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
697 698
				 is_return ? 'r' : 'p', symbol, offset);
		else
699
			snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
700
				 is_return ? 'r' : 'p', addr);
701 702
		event = buf;
	}
703
	tk = alloc_trace_kprobe(group, event, addr, symbol, offset, argc,
704
			       is_return);
705
	if (IS_ERR(tk)) {
706
		pr_info("Failed to allocate trace_probe.(%d)\n",
707 708
			(int)PTR_ERR(tk));
		return PTR_ERR(tk);
709
	}
710 711

	/* parse arguments */
712 713
	ret = 0;
	for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
714 715
		struct probe_arg *parg = &tk->tp.args[i];

716
		/* Increment count for freeing args in error case */
717
		tk->tp.nr_args++;
718

719 720
		/* Parse argument name */
		arg = strchr(argv[i], '=');
721
		if (arg) {
722
			*arg++ = '\0';
723
			parg->name = kstrdup(argv[i], GFP_KERNEL);
724
		} else {
725
			arg = argv[i];
726 727
			/* If argument name is omitted, set "argN" */
			snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
728
			parg->name = kstrdup(buf, GFP_KERNEL);
729
		}
730

731
		if (!parg->name) {
732
			pr_info("Failed to allocate argument[%d] name.\n", i);
733
			ret = -ENOMEM;
734 735
			goto error;
		}
736

737
		if (!is_good_name(parg->name)) {
738
			pr_info("Invalid argument[%d] name: %s\n",
739
				i, parg->name);
740 741 742
			ret = -EINVAL;
			goto error;
		}
743

744 745
		if (traceprobe_conflict_field_name(parg->name,
							tk->tp.args, i)) {
746
			pr_info("Argument[%d] name '%s' conflicts with "
747 748 749 750
				"another field.\n", i, argv[i]);
			ret = -EINVAL;
			goto error;
		}
751 752

		/* Parse fetch argument */
753
		ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
754 755
						is_return, true,
						kprobes_fetch_type_table);
756
		if (ret) {
757
			pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
758
			goto error;
759
		}
760 761
	}

762
	ret = register_trace_kprobe(tk);
763 764 765 766 767
	if (ret)
		goto error;
	return 0;

error:
768
	free_trace_kprobe(tk);
769 770 771
	return ret;
}

772
static int release_all_trace_kprobes(void)
773
{
774
	struct trace_kprobe *tk;
775
	int ret = 0;
776 777

	mutex_lock(&probe_lock);
778
	/* Ensure no probe is in use. */
779 780
	list_for_each_entry(tk, &probe_list, list)
		if (trace_probe_is_enabled(&tk->tp)) {
781 782 783
			ret = -EBUSY;
			goto end;
		}
784 785
	/* TODO: Use batch unregistration */
	while (!list_empty(&probe_list)) {
786 787
		tk = list_entry(probe_list.next, struct trace_kprobe, list);
		ret = unregister_trace_kprobe(tk);
788 789
		if (ret)
			goto end;
790
		free_trace_kprobe(tk);
791
	}
792 793

end:
794
	mutex_unlock(&probe_lock);
795 796

	return ret;
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
}

/* Probes listing interfaces */
static void *probes_seq_start(struct seq_file *m, loff_t *pos)
{
	mutex_lock(&probe_lock);
	return seq_list_start(&probe_list, *pos);
}

static void *probes_seq_next(struct seq_file *m, void *v, loff_t *pos)
{
	return seq_list_next(v, &probe_list, pos);
}

static void probes_seq_stop(struct seq_file *m, void *v)
{
	mutex_unlock(&probe_lock);
}

static int probes_seq_show(struct seq_file *m, void *v)
{
818
	struct trace_kprobe *tk = v;
819
	int i;
820

821
	seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
822
	seq_printf(m, ":%s/%s", tk->tp.call.class->system,
823
			trace_event_name(&tk->tp.call));
824

825 826 827 828 829
	if (!tk->symbol)
		seq_printf(m, " 0x%p", tk->rp.kp.addr);
	else if (tk->rp.kp.offset)
		seq_printf(m, " %s+%u", trace_kprobe_symbol(tk),
			   tk->rp.kp.offset);
830
	else
831
		seq_printf(m, " %s", trace_kprobe_symbol(tk));
832

833 834
	for (i = 0; i < tk->tp.nr_args; i++)
		seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
835
	seq_putc(m, '\n');
836

837 838 839 840 841 842 843 844 845 846 847 848
	return 0;
}

static const struct seq_operations probes_seq_op = {
	.start  = probes_seq_start,
	.next   = probes_seq_next,
	.stop   = probes_seq_stop,
	.show   = probes_seq_show
};

static int probes_open(struct inode *inode, struct file *file)
{
849 850 851
	int ret;

	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
852
		ret = release_all_trace_kprobes();
853 854 855
		if (ret < 0)
			return ret;
	}
856 857 858 859 860 861 862

	return seq_open(file, &probes_seq_op);
}

static ssize_t probes_write(struct file *file, const char __user *buffer,
			    size_t count, loff_t *ppos)
{
863
	return traceprobe_probes_write(file, buffer, count, ppos,
864
			create_trace_kprobe);
865 866 867 868 869 870 871 872 873 874 875
}

static const struct file_operations kprobe_events_ops = {
	.owner          = THIS_MODULE,
	.open           = probes_open,
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = seq_release,
	.write		= probes_write,
};

876 877 878
/* Probes profiling interfaces */
static int probes_profile_seq_show(struct seq_file *m, void *v)
{
879
	struct trace_kprobe *tk = v;
880 881 882 883 884
	unsigned long nhit = 0;
	int cpu;

	for_each_possible_cpu(cpu)
		nhit += *per_cpu_ptr(tk->nhit, cpu);
885

886
	seq_printf(m, "  %-44s %15lu %15lu\n",
887
		   trace_event_name(&tk->tp.call), nhit,
888
		   tk->rp.kp.nmissed);
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912

	return 0;
}

static const struct seq_operations profile_seq_op = {
	.start  = probes_seq_start,
	.next   = probes_seq_next,
	.stop   = probes_seq_stop,
	.show   = probes_profile_seq_show
};

static int profile_open(struct inode *inode, struct file *file)
{
	return seq_open(file, &profile_seq_op);
}

static const struct file_operations kprobe_profile_ops = {
	.owner          = THIS_MODULE,
	.open           = profile_open,
	.read           = seq_read,
	.llseek         = seq_lseek,
	.release        = seq_release,
};

913
/* Kprobe handler */
914
static nokprobe_inline void
915
__kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
916
		    struct trace_event_file *trace_file)
917
{
918
	struct kprobe_trace_entry_head *entry;
919
	struct ring_buffer_event *event;
920
	struct ring_buffer *buffer;
921
	int size, dsize, pc;
922
	unsigned long irq_flags;
923
	struct trace_event_call *call = &tk->tp.call;
924

925
	WARN_ON(call != trace_file->event_call);
926

927
	if (trace_trigger_soft_disabled(trace_file))
928
		return;
929

930 931 932
	local_save_flags(irq_flags);
	pc = preempt_count();

933 934
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
935

936
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
937 938
						call->event.type,
						size, irq_flags, pc);
939
	if (!event)
940
		return;
941 942

	entry = ring_buffer_event_data(event);
943 944
	entry->ip = (unsigned long)tk->rp.kp.addr;
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
945

946
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
947
					 entry, irq_flags, pc, regs);
948 949
}

950
static void
951
kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
952
{
953
	struct event_file_link *link;
954

955 956
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kprobe_trace_func(tk, regs, link->file);
957
}
958
NOKPROBE_SYMBOL(kprobe_trace_func);
959

960
/* Kretprobe handler */
961
static nokprobe_inline void
962
__kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
963
		       struct pt_regs *regs,
964
		       struct trace_event_file *trace_file)
965
{
966
	struct kretprobe_trace_entry_head *entry;
967
	struct ring_buffer_event *event;
968
	struct ring_buffer *buffer;
969
	int size, pc, dsize;
970
	unsigned long irq_flags;
971
	struct trace_event_call *call = &tk->tp.call;
972

973
	WARN_ON(call != trace_file->event_call);
974

975
	if (trace_trigger_soft_disabled(trace_file))
976
		return;
977

978 979 980
	local_save_flags(irq_flags);
	pc = preempt_count();

981 982
	dsize = __get_data_size(&tk->tp, regs);
	size = sizeof(*entry) + tk->tp.size + dsize;
983

984
	event = trace_event_buffer_lock_reserve(&buffer, trace_file,
985 986
						call->event.type,
						size, irq_flags, pc);
987
	if (!event)
988
		return;
989 990

	entry = ring_buffer_event_data(event);
991
	entry->func = (unsigned long)tk->rp.kp.addr;
992
	entry->ret_ip = (unsigned long)ri->ret_addr;
993
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
994

995
	event_trigger_unlock_commit_regs(trace_file, buffer, event,
996
					 entry, irq_flags, pc, regs);
997 998
}

999
static void
1000
kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1001 1002
		     struct pt_regs *regs)
{
1003
	struct event_file_link *link;
1004

1005 1006
	list_for_each_entry_rcu(link, &tk->tp.files, list)
		__kretprobe_trace_func(tk, ri, regs, link->file);
1007
}
1008
NOKPROBE_SYMBOL(kretprobe_trace_func);
1009

1010
/* Event entry printers */
1011
static enum print_line_t
1012 1013
print_kprobe_event(struct trace_iterator *iter, int flags,
		   struct trace_event *event)
1014
{
1015
	struct kprobe_trace_entry_head *field;
1016
	struct trace_seq *s = &iter->seq;
1017
	struct trace_probe *tp;
1018
	u8 *data;
1019 1020
	int i;

1021
	field = (struct kprobe_trace_entry_head *)iter->ent;
1022
	tp = container_of(event, struct trace_probe, call.event);
1023

1024
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1025

1026
	if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
1027
		goto out;
1028

1029
	trace_seq_putc(s, ')');
1030

1031 1032 1033
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1034
					     data + tp->args[i].offset, field))
1035
			goto out;
1036

1037 1038 1039
	trace_seq_putc(s, '\n');
 out:
	return trace_handle_return(s);
1040 1041
}

1042
static enum print_line_t
1043 1044
print_kretprobe_event(struct trace_iterator *iter, int flags,
		      struct trace_event *event)
1045
{
1046
	struct kretprobe_trace_entry_head *field;
1047
	struct trace_seq *s = &iter->seq;
1048
	struct trace_probe *tp;
1049
	u8 *data;
1050 1051
	int i;

1052
	field = (struct kretprobe_trace_entry_head *)iter->ent;
1053
	tp = container_of(event, struct trace_probe, call.event);
1054

1055
	trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
1056

1057
	if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
1058
		goto out;
1059

1060
	trace_seq_puts(s, " <- ");
1061 1062

	if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET))
1063
		goto out;
1064

1065
	trace_seq_putc(s, ')');
1066

1067 1068 1069
	data = (u8 *)&field[1];
	for (i = 0; i < tp->nr_args; i++)
		if (!tp->args[i].type->print(s, tp->args[i].name,
1070
					     data + tp->args[i].offset, field))
1071
			goto out;
1072

1073
	trace_seq_putc(s, '\n');
1074

1075 1076
 out:
	return trace_handle_return(s);
1077 1078 1079
}


1080
static int kprobe_event_define_fields(struct trace_event_call *event_call)
1081 1082
{
	int ret, i;
1083
	struct kprobe_trace_entry_head field;
1084
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1085

1086
	DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
1087
	/* Set argument names as fields */
1088 1089 1090 1091 1092 1093 1094 1095
	for (i = 0; i < tk->tp.nr_args; i++) {
		struct probe_arg *parg = &tk->tp.args[i];

		ret = trace_define_field(event_call, parg->type->fmttype,
					 parg->name,
					 sizeof(field) + parg->offset,
					 parg->type->size,
					 parg->type->is_signed,
1096 1097 1098 1099
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1100 1101 1102
	return 0;
}

1103
static int kretprobe_event_define_fields(struct trace_event_call *event_call)
1104 1105
{
	int ret, i;
1106
	struct kretprobe_trace_entry_head field;
1107
	struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
1108

1109 1110
	DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
	DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
1111
	/* Set argument names as fields */
1112 1113 1114 1115 1116 1117 1118 1119
	for (i = 0; i < tk->tp.nr_args; i++) {
		struct probe_arg *parg = &tk->tp.args[i];

		ret = trace_define_field(event_call, parg->type->fmttype,
					 parg->name,
					 sizeof(field) + parg->offset,
					 parg->type->size,
					 parg->type->is_signed,
1120 1121 1122 1123
					 FILTER_OTHER);
		if (ret)
			return ret;
	}
1124 1125 1126
	return 0;
}

1127
#ifdef CONFIG_PERF_EVENTS
1128 1129

/* Kprobe profile handler */
1130
static void
1131
kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
1132
{
1133
	struct trace_event_call *call = &tk->tp.call;
1134
	struct bpf_prog *prog = call->prog;
1135
	struct kprobe_trace_entry_head *entry;
1136
	struct hlist_head *head;
1137
	int size, __size, dsize;
1138
	int rctx;
1139

1140 1141 1142
	if (prog && !trace_call_bpf(prog, regs))
		return;

1143 1144 1145 1146
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1147 1148
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1149 1150
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1151

1152
	entry = perf_trace_buf_alloc(size, NULL, &rctx);
1153
	if (!entry)
1154
		return;
1155

1156
	entry->ip = (unsigned long)tk->rp.kp.addr;
1157
	memset(&entry[1], 0, dsize);
1158
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1159 1160
	perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
			      head, NULL);
1161
}
1162
NOKPROBE_SYMBOL(kprobe_perf_func);
1163 1164

/* Kretprobe profile handler */
1165
static void
1166
kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
1167
		    struct pt_regs *regs)
1168
{
1169
	struct trace_event_call *call = &tk->tp.call;
1170
	struct bpf_prog *prog = call->prog;
1171
	struct kretprobe_trace_entry_head *entry;
1172
	struct hlist_head *head;
1173
	int size, __size, dsize;
1174
	int rctx;
1175

1176 1177 1178
	if (prog && !trace_call_bpf(prog, regs))
		return;

1179 1180 1181 1182
	head = this_cpu_ptr(call->perf_events);
	if (hlist_empty(head))
		return;

1183 1184
	dsize = __get_data_size(&tk->tp, regs);
	__size = sizeof(*entry) + tk->tp.size + dsize;
1185 1186
	size = ALIGN(__size + sizeof(u32), sizeof(u64));
	size -= sizeof(u32);
1187

1188
	entry = perf_trace_buf_alloc(size, NULL, &rctx);
1189
	if (!entry)
1190
		return;
1191

1192
	entry->func = (unsigned long)tk->rp.kp.addr;
1193
	entry->ret_ip = (unsigned long)ri->ret_addr;
1194
	store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
1195 1196
	perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
			      head, NULL);
1197
}
1198
NOKPROBE_SYMBOL(kretprobe_perf_func);
1199
#endif	/* CONFIG_PERF_EVENTS */
1200

1201 1202 1203 1204 1205 1206
/*
 * called by perf_trace_init() or __ftrace_set_clr_event() under event_mutex.
 *
 * kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe
 * lockless, but we can't race with this __init function.
 */
1207
static int kprobe_register(struct trace_event_call *event,
1208
			   enum trace_reg type, void *data)
1209
{
1210
	struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
1211
	struct trace_event_file *file = data;
1212

1213 1214
	switch (type) {
	case TRACE_REG_REGISTER:
1215
		return enable_trace_kprobe(tk, file);
1216
	case TRACE_REG_UNREGISTER:
1217
		return disable_trace_kprobe(tk, file);
1218 1219 1220

#ifdef CONFIG_PERF_EVENTS
	case TRACE_REG_PERF_REGISTER:
1221
		return enable_trace_kprobe(tk, NULL);
1222
	case TRACE_REG_PERF_UNREGISTER:
1223
		return disable_trace_kprobe(tk, NULL);
1224 1225
	case TRACE_REG_PERF_OPEN:
	case TRACE_REG_PERF_CLOSE:
1226 1227
	case TRACE_REG_PERF_ADD:
	case TRACE_REG_PERF_DEL:
1228
		return 0;
1229 1230 1231 1232
#endif
	}
	return 0;
}
1233

1234
static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
1235
{
1236
	struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
1237

1238
	raw_cpu_inc(*tk->nhit);
1239

1240 1241
	if (tk->tp.flags & TP_FLAG_TRACE)
		kprobe_trace_func(tk, regs);
1242
#ifdef CONFIG_PERF_EVENTS
1243 1244
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kprobe_perf_func(tk, regs);
1245
#endif
1246 1247
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1248
NOKPROBE_SYMBOL(kprobe_dispatcher);
1249

1250 1251
static int
kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
1252
{
1253
	struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
1254

1255
	raw_cpu_inc(*tk->nhit);
1256

1257 1258
	if (tk->tp.flags & TP_FLAG_TRACE)
		kretprobe_trace_func(tk, ri, regs);
1259
#ifdef CONFIG_PERF_EVENTS
1260 1261
	if (tk->tp.flags & TP_FLAG_PROFILE)
		kretprobe_perf_func(tk, ri, regs);
1262
#endif
1263 1264
	return 0;	/* We don't tweek kernel, so just return 0 */
}
1265
NOKPROBE_SYMBOL(kretprobe_dispatcher);
1266

1267 1268 1269 1270 1271 1272 1273 1274
static struct trace_event_functions kretprobe_funcs = {
	.trace		= print_kretprobe_event
};

static struct trace_event_functions kprobe_funcs = {
	.trace		= print_kprobe_event
};

1275
static int register_kprobe_event(struct trace_kprobe *tk)
1276
{
1277
	struct trace_event_call *call = &tk->tp.call;
1278 1279
	int ret;

1280
	/* Initialize trace_event_call */
1281
	INIT_LIST_HEAD(&call->class->fields);
1282
	if (trace_kprobe_is_return(tk)) {
1283
		call->event.funcs = &kretprobe_funcs;
1284
		call->class->define_fields = kretprobe_event_define_fields;
1285
	} else {
1286
		call->event.funcs = &kprobe_funcs;
1287
		call->class->define_fields = kprobe_event_define_fields;
1288
	}
1289
	if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
1290
		return -ENOMEM;
1291
	ret = register_trace_event(&call->event);
1292
	if (!ret) {
1293
		kfree(call->print_fmt);
1294
		return -ENODEV;
1295
	}
A
Alexei Starovoitov 已提交
1296
	call->flags = TRACE_EVENT_FL_KPROBE;
1297
	call->class->reg = kprobe_register;
1298
	call->data = tk;
1299
	ret = trace_add_event_call(call);
1300
	if (ret) {
1301
		pr_info("Failed to register kprobe event: %s\n",
1302
			trace_event_name(call));
1303
		kfree(call->print_fmt);
1304
		unregister_trace_event(&call->event);
1305
	}
1306 1307 1308
	return ret;
}

1309
static int unregister_kprobe_event(struct trace_kprobe *tk)
1310
{
1311 1312
	int ret;

1313
	/* tp->event is unregistered in trace_remove_event_call() */
1314
	ret = trace_remove_event_call(&tk->tp.call);
1315
	if (!ret)
1316
		kfree(tk->tp.call.print_fmt);
1317
	return ret;
1318 1319
}

1320
/* Make a tracefs interface for controlling probe points */
1321 1322 1323 1324 1325
static __init int init_kprobe_trace(void)
{
	struct dentry *d_tracer;
	struct dentry *entry;

1326
	if (register_module_notifier(&trace_kprobe_module_nb))
1327 1328
		return -EINVAL;

1329
	d_tracer = tracing_init_dentry();
1330
	if (IS_ERR(d_tracer))
1331 1332
		return 0;

1333
	entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
1334 1335
				    NULL, &kprobe_events_ops);

1336
	/* Event list interface */
1337
	if (!entry)
1338
		pr_warn("Could not create tracefs 'kprobe_events' entry\n");
1339 1340

	/* Profile interface */
1341
	entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
1342 1343 1344
				    NULL, &kprobe_profile_ops);

	if (!entry)
1345
		pr_warn("Could not create tracefs 'kprobe_profile' entry\n");
1346 1347 1348 1349 1350 1351 1352
	return 0;
}
fs_initcall(init_kprobe_trace);


#ifdef CONFIG_FTRACE_STARTUP_TEST

1353 1354 1355 1356 1357 1358
/*
 * The "__used" keeps gcc from removing the function symbol
 * from the kallsyms table.
 */
static __used int kprobe_trace_selftest_target(int a1, int a2, int a3,
					       int a4, int a5, int a6)
1359 1360 1361 1362
{
	return a1 + a2 + a3 + a4 + a5 + a6;
}

1363
static struct trace_event_file *
1364
find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
1365
{
1366
	struct trace_event_file *file;
1367 1368

	list_for_each_entry(file, &tr->events, list)
1369
		if (file->event_call == &tk->tp.call)
1370 1371 1372 1373 1374
			return file;

	return NULL;
}

1375
/*
1376
 * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
1377 1378
 * stage, we can do this lockless.
 */
1379 1380
static __init int kprobe_trace_self_tests_init(void)
{
1381
	int ret, warn = 0;
1382
	int (*target)(int, int, int, int, int, int);
1383
	struct trace_kprobe *tk;
1384
	struct trace_event_file *file;
1385

1386 1387 1388
	if (tracing_is_disabled())
		return -ENODEV;

1389 1390 1391 1392
	target = kprobe_trace_selftest_target;

	pr_info("Testing kprobe tracing: ");

1393 1394
	ret = traceprobe_command("p:testprobe kprobe_trace_selftest_target "
				  "$stack $stack0 +0($stack)",
1395
				  create_trace_kprobe);
1396
	if (WARN_ON_ONCE(ret)) {
1397
		pr_warn("error on probing function entry.\n");
1398 1399 1400
		warn++;
	} else {
		/* Enable trace point */
1401 1402
		tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1403
			pr_warn("error on getting new probe.\n");
1404
			warn++;
1405
		} else {
1406
			file = find_trace_probe_file(tk, top_trace_array());
1407 1408 1409 1410
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1411
				enable_trace_kprobe(tk, file);
1412
		}
1413
	}
1414

1415
	ret = traceprobe_command("r:testprobe2 kprobe_trace_selftest_target "
1416
				  "$retval", create_trace_kprobe);
1417
	if (WARN_ON_ONCE(ret)) {
1418
		pr_warn("error on probing function return.\n");
1419 1420 1421
		warn++;
	} else {
		/* Enable trace point */
1422 1423
		tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
		if (WARN_ON_ONCE(tk == NULL)) {
1424
			pr_warn("error on getting 2nd new probe.\n");
1425
			warn++;
1426
		} else {
1427
			file = find_trace_probe_file(tk, top_trace_array());
1428 1429 1430 1431
			if (WARN_ON_ONCE(file == NULL)) {
				pr_warn("error on getting probe file.\n");
				warn++;
			} else
1432
				enable_trace_kprobe(tk, file);
1433
		}
1434 1435 1436 1437
	}

	if (warn)
		goto end;
1438 1439 1440

	ret = target(1, 2, 3, 4, 5, 6);

1441
	/* Disable trace points before removing it */
1442 1443
	tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1444
		pr_warn("error on getting test probe.\n");
1445
		warn++;
1446
	} else {
1447
		file = find_trace_probe_file(tk, top_trace_array());
1448 1449 1450 1451
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1452
			disable_trace_kprobe(tk, file);
1453
	}
1454

1455 1456
	tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
	if (WARN_ON_ONCE(tk == NULL)) {
1457
		pr_warn("error on getting 2nd test probe.\n");
1458
		warn++;
1459
	} else {
1460
		file = find_trace_probe_file(tk, top_trace_array());
1461 1462 1463 1464
		if (WARN_ON_ONCE(file == NULL)) {
			pr_warn("error on getting probe file.\n");
			warn++;
		} else
1465
			disable_trace_kprobe(tk, file);
1466
	}
1467

1468
	ret = traceprobe_command("-:testprobe", create_trace_kprobe);
1469
	if (WARN_ON_ONCE(ret)) {
1470
		pr_warn("error on deleting a probe.\n");
1471 1472 1473
		warn++;
	}

1474
	ret = traceprobe_command("-:testprobe2", create_trace_kprobe);
1475
	if (WARN_ON_ONCE(ret)) {
1476
		pr_warn("error on deleting a probe.\n");
1477 1478
		warn++;
	}
1479

1480
end:
1481
	release_all_trace_kprobes();
1482 1483 1484 1485
	if (warn)
		pr_cont("NG: Some tests are failed. Please check them.\n");
	else
		pr_cont("OK\n");
1486 1487 1488 1489 1490 1491
	return 0;
}

late_initcall(kprobe_trace_self_tests_init);

#endif