trace_events.h 25.9 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2

3 4
#ifndef _LINUX_TRACE_EVENT_H
#define _LINUX_TRACE_EVENT_H
5 6

#include <linux/ring_buffer.h>
7
#include <linux/trace_seq.h>
8
#include <linux/percpu.h>
9
#include <linux/hardirq.h>
10
#include <linux/perf_event.h>
11
#include <linux/tracepoint.h>
12 13

struct trace_array;
14
struct array_buffer;
15
struct tracer;
16
struct dentry;
17
struct bpf_prog;
18

19 20 21
const char *trace_print_flags_seq(struct trace_seq *p, const char *delim,
				  unsigned long flags,
				  const struct trace_print_flags *flag_array);
22

23 24
const char *trace_print_symbols_seq(struct trace_seq *p, unsigned long val,
				    const struct trace_print_flags *symbol_array);
25

26
#if BITS_PER_LONG == 32
R
Ross Zwisler 已提交
27 28 29 30
const char *trace_print_flags_seq_u64(struct trace_seq *p, const char *delim,
		      unsigned long long flags,
		      const struct trace_print_flags_u64 *flag_array);

31 32 33
const char *trace_print_symbols_seq_u64(struct trace_seq *p,
					unsigned long long val,
					const struct trace_print_flags_u64
34 35 36
								 *symbol_array);
#endif

37 38
const char *trace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr,
				    unsigned int bitmask_size);
39

40
const char *trace_print_hex_seq(struct trace_seq *p,
41
				const unsigned char *buf, int len,
42
				bool concatenate);
K
Kei Tokunaga 已提交
43

44
const char *trace_print_array_seq(struct trace_seq *p,
45
				   const void *buf, int count,
D
Dave Martin 已提交
46 47
				   size_t el_size);

48 49 50 51 52
const char *
trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
			 int prefix_type, int rowsize, int groupsize,
			 const void *buf, size_t len, bool ascii);

53 54 55
struct trace_iterator;
struct trace_event;

56 57
int trace_raw_output_prep(struct trace_iterator *iter,
			  struct trace_event *event);
58

59 60 61 62 63 64 65
/*
 * The trace entry - the most basic unit of tracing. This is what
 * is printed in the end as a single line in the trace output, such as:
 *
 *     bash-15816 [01]   235.197585: idle_cpu <- irq_enter
 */
struct trace_entry {
66
	unsigned short		type;
67 68 69 70 71
	unsigned char		flags;
	unsigned char		preempt_count;
	int			pid;
};

72
#define TRACE_EVENT_TYPE_MAX						\
73 74
	((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)

75 76 77 78 79 80 81
/*
 * Trace iterator - used by printout routines who present trace
 * results to users and which routines might sleep, etc:
 */
struct trace_iterator {
	struct trace_array	*tr;
	struct tracer		*trace;
82
	struct array_buffer	*array_buffer;
83 84 85
	void			*private;
	int			cpu_file;
	struct mutex		mutex;
86
	struct ring_buffer_iter	**buffer_iter;
87
	unsigned long		iter_flags;
88 89
	void			*temp;	/* temp holder */
	unsigned int		temp_size;
90

91 92 93
	/* trace_seq for __print_flags() and __print_symbolic() etc. */
	struct trace_seq	tmp_seq;

94 95 96 97 98
	cpumask_var_t		started;

	/* it's true when current open file is snapshot */
	bool			snapshot;

99 100 101
	/* The below is zeroed out in pipe_read */
	struct trace_seq	seq;
	struct trace_entry	*ent;
102
	unsigned long		lost_events;
103
	int			leftover;
104
	int			ent_size;
105 106 107 108 109 110
	int			cpu;
	u64			ts;

	loff_t			pos;
	long			idx;

111
	/* All new field here will be zeroed out in pipe_read */
112 113
};

114 115 116 117 118 119
enum trace_iter_flags {
	TRACE_FILE_LAT_FMT	= 1,
	TRACE_FILE_ANNOTATE	= 2,
	TRACE_FILE_TIME_IN_NS	= 4,
};

120 121

typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
122 123 124
				      int flags, struct trace_event *event);

struct trace_event_functions {
125 126 127 128 129 130
	trace_print_func	trace;
	trace_print_func	raw;
	trace_print_func	hex;
	trace_print_func	binary;
};

131 132 133 134 135 136 137
struct trace_event {
	struct hlist_node		node;
	struct list_head		list;
	int				type;
	struct trace_event_functions	*funcs;
};

138 139
extern int register_trace_event(struct trace_event *event);
extern int unregister_trace_event(struct trace_event *event);
140 141 142 143 144 145 146 147 148

/* Return values for print_line callback */
enum print_line_t {
	TRACE_TYPE_PARTIAL_LINE	= 0,	/* Retry after flushing the seq */
	TRACE_TYPE_HANDLED	= 1,
	TRACE_TYPE_UNHANDLED	= 2,	/* Relay to other output functions */
	TRACE_TYPE_NO_CONSUME	= 3	/* Handled but ask to not consume */
};

149
enum print_line_t trace_handle_return(struct trace_seq *s);
150

151 152 153 154 155
static inline void tracing_generic_entry_update(struct trace_entry *entry,
						unsigned short type,
						unsigned int trace_ctx)
{
	entry->preempt_count		= trace_ctx & 0xff;
156
	entry->pid			= current->pid;
157 158 159 160
	entry->type			= type;
	entry->flags =			trace_ctx >> 16;
}

161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status);

enum trace_flag_type {
	TRACE_FLAG_IRQS_OFF		= 0x01,
	TRACE_FLAG_IRQS_NOSUPPORT	= 0x02,
	TRACE_FLAG_NEED_RESCHED		= 0x04,
	TRACE_FLAG_HARDIRQ		= 0x08,
	TRACE_FLAG_SOFTIRQ		= 0x10,
	TRACE_FLAG_PREEMPT_RESCHED	= 0x20,
	TRACE_FLAG_NMI			= 0x40,
};

#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags)
{
	unsigned int irq_status = irqs_disabled_flags(irqflags) ?
		TRACE_FLAG_IRQS_OFF : 0;
	return tracing_gen_ctx_irq_test(irq_status);
}
static inline unsigned int tracing_gen_ctx(void)
{
	unsigned long irqflags;

	local_save_flags(irqflags);
	return tracing_gen_ctx_flags(irqflags);
}
#else

static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags)
{
	return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT);
}
static inline unsigned int tracing_gen_ctx(void)
{
	return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT);
}
#endif

static inline unsigned int tracing_gen_ctx_dec(void)
{
	unsigned int trace_ctx;

	trace_ctx = tracing_gen_ctx();
	/*
	 * Subtract one from the preeption counter if preemption is enabled,
	 * see trace_event_buffer_reserve()for details.
	 */
	if (IS_ENABLED(CONFIG_PREEMPTION))
		trace_ctx--;
	return trace_ctx;
}
212

213
struct trace_event_file;
214 215

struct ring_buffer_event *
216
trace_event_buffer_lock_reserve(struct trace_buffer **current_buffer,
217
				struct trace_event_file *trace_file,
218
				int type, unsigned long len,
219
				unsigned int trace_ctx);
220

221 222 223 224 225 226 227 228 229
#define TRACE_RECORD_CMDLINE	BIT(0)
#define TRACE_RECORD_TGID	BIT(1)

void tracing_record_taskinfo(struct task_struct *task, int flags);
void tracing_record_taskinfo_sched_switch(struct task_struct *prev,
					  struct task_struct *next, int flags);

void tracing_record_cmdline(struct task_struct *task);
void tracing_record_tgid(struct task_struct *task);
230

231
int trace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...);
232

233 234
struct event_filter;

235 236 237
enum trace_reg {
	TRACE_REG_REGISTER,
	TRACE_REG_UNREGISTER,
238
#ifdef CONFIG_PERF_EVENTS
239 240
	TRACE_REG_PERF_REGISTER,
	TRACE_REG_PERF_UNREGISTER,
241 242
	TRACE_REG_PERF_OPEN,
	TRACE_REG_PERF_CLOSE,
243 244 245 246 247
	/*
	 * These (ADD/DEL) use a 'boolean' return value, where 1 (true) means a
	 * custom action was taken and the default action is not to be
	 * performed.
	 */
248 249
	TRACE_REG_PERF_ADD,
	TRACE_REG_PERF_DEL,
250
#endif
251 252
};

253
struct trace_event_call;
254

P
Peter Zijlstra 已提交
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
#define TRACE_FUNCTION_TYPE ((const char *)~0UL)

struct trace_event_fields {
	const char *type;
	union {
		struct {
			const char *name;
			const int  size;
			const int  align;
			const int  is_signed;
			const int  filter_type;
		};
		int (*define_fields)(struct trace_event_call *);
	};
};

271
struct trace_event_class {
272
	const char		*system;
273 274 275 276
	void			*probe;
#ifdef CONFIG_PERF_EVENTS
	void			*perf_probe;
#endif
277
	int			(*reg)(struct trace_event_call *event,
278
				       enum trace_reg type, void *data);
P
Peter Zijlstra 已提交
279
	struct trace_event_fields *fields_array;
280
	struct list_head	*(*get_fields)(struct trace_event_call *);
281
	struct list_head	fields;
282
	int			(*raw_init)(struct trace_event_call *);
283 284
};

285
extern int trace_event_reg(struct trace_event_call *event,
286
			    enum trace_reg type, void *data);
287

288
struct trace_event_buffer {
289
	struct trace_buffer		*buffer;
290
	struct ring_buffer_event	*event;
291
	struct trace_event_file		*trace_file;
292
	void				*entry;
293
	unsigned int			trace_ctx;
294
	struct pt_regs			*regs;
295 296
};

297
void *trace_event_buffer_reserve(struct trace_event_buffer *fbuffer,
298
				  struct trace_event_file *trace_file,
299 300
				  unsigned long len);

301
void trace_event_buffer_commit(struct trace_event_buffer *fbuffer);
302

303 304
enum {
	TRACE_EVENT_FL_FILTERED_BIT,
305
	TRACE_EVENT_FL_CAP_ANY_BIT,
L
Li Zefan 已提交
306
	TRACE_EVENT_FL_NO_SET_FILTER_BIT,
307
	TRACE_EVENT_FL_IGNORE_ENABLE_BIT,
308
	TRACE_EVENT_FL_TRACEPOINT_BIT,
A
Alexei Starovoitov 已提交
309
	TRACE_EVENT_FL_KPROBE_BIT,
310
	TRACE_EVENT_FL_UPROBE_BIT,
311 312
};

313 314 315 316 317
/*
 * Event flags:
 *  FILTERED	  - The event has a filter attached
 *  CAP_ANY	  - Any user can enable for perf
 *  NO_SET_FILTER - Set when filter has error and is to be ignored
318
 *  IGNORE_ENABLE - For trace internal events, do not enable with debugfs file
319
 *  TRACEPOINT    - Event is a tracepoint
A
Alexei Starovoitov 已提交
320
 *  KPROBE        - Event is a kprobe
321
 *  UPROBE        - Event is a uprobe
322
 */
323
enum {
324
	TRACE_EVENT_FL_FILTERED		= (1 << TRACE_EVENT_FL_FILTERED_BIT),
325
	TRACE_EVENT_FL_CAP_ANY		= (1 << TRACE_EVENT_FL_CAP_ANY_BIT),
L
Li Zefan 已提交
326
	TRACE_EVENT_FL_NO_SET_FILTER	= (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
327
	TRACE_EVENT_FL_IGNORE_ENABLE	= (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT),
328
	TRACE_EVENT_FL_TRACEPOINT	= (1 << TRACE_EVENT_FL_TRACEPOINT_BIT),
A
Alexei Starovoitov 已提交
329
	TRACE_EVENT_FL_KPROBE		= (1 << TRACE_EVENT_FL_KPROBE_BIT),
330
	TRACE_EVENT_FL_UPROBE		= (1 << TRACE_EVENT_FL_UPROBE_BIT),
331 332
};

333 334
#define TRACE_EVENT_FL_UKPROBE (TRACE_EVENT_FL_KPROBE | TRACE_EVENT_FL_UPROBE)

335
struct trace_event_call {
336
	struct list_head	list;
337
	struct trace_event_class *class;
338 339 340 341 342
	union {
		char			*name;
		/* Set TRACE_EVENT_FL_TRACEPOINT flag when using "tp" */
		struct tracepoint	*tp;
	};
343
	struct trace_event	event;
344
	char			*print_fmt;
345
	struct event_filter	*filter;
346
	void			*mod;
347
	void			*data;
348 349 350 351
	/*
	 *   bit 0:		filter_active
	 *   bit 1:		allow trace by non root (cap any)
	 *   bit 2:		failed to apply filter
352
	 *   bit 3:		trace internal event (do not enable)
353
	 *   bit 4:		Event was enabled by module
354
	 *   bit 5:		use call filter rather than file filter
355
	 *   bit 6:		Event is a tracepoint
356
	 */
357 358 359 360 361
	int			flags; /* static flags of different events */

#ifdef CONFIG_PERF_EVENTS
	int				perf_refcount;
	struct hlist_head __percpu	*perf_events;
362
	struct bpf_prog_array __rcu	*prog_array;
363

364
	int	(*perf_perm)(struct trace_event_call *,
365
			     struct perf_event *);
366 367 368
#endif
};

369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
#ifdef CONFIG_PERF_EVENTS
static inline bool bpf_prog_array_valid(struct trace_event_call *call)
{
	/*
	 * This inline function checks whether call->prog_array
	 * is valid or not. The function is called in various places,
	 * outside rcu_read_lock/unlock, as a heuristic to speed up execution.
	 *
	 * If this function returns true, and later call->prog_array
	 * becomes false inside rcu_read_lock/unlock region,
	 * we bail out then. If this function return false,
	 * there is a risk that we might miss a few events if the checking
	 * were delayed until inside rcu_read_lock/unlock region and
	 * call->prog_array happened to become non-NULL then.
	 *
	 * Here, READ_ONCE() is used instead of rcu_access_pointer().
	 * rcu_access_pointer() requires the actual definition of
	 * "struct bpf_prog_array" while READ_ONCE() only needs
	 * a declaration of the same type.
	 */
	return !!READ_ONCE(call->prog_array);
}
#endif

393
static inline const char *
394
trace_event_name(struct trace_event_call *call)
395 396 397 398 399 400 401
{
	if (call->flags & TRACE_EVENT_FL_TRACEPOINT)
		return call->tp ? call->tp->name : NULL;
	else
		return call->name;
}

402 403 404 405 406 407 408 409
static inline struct list_head *
trace_get_fields(struct trace_event_call *event_call)
{
	if (!event_call->class->get_fields)
		return &event_call->class->fields;
	return event_call->class->get_fields(event_call);
}

410
struct trace_array;
411
struct trace_subsystem_dir;
412 413

enum {
414 415
	EVENT_FILE_FL_ENABLED_BIT,
	EVENT_FILE_FL_RECORDED_CMD_BIT,
416
	EVENT_FILE_FL_RECORDED_TGID_BIT,
417 418 419 420 421 422
	EVENT_FILE_FL_FILTERED_BIT,
	EVENT_FILE_FL_NO_SET_FILTER_BIT,
	EVENT_FILE_FL_SOFT_MODE_BIT,
	EVENT_FILE_FL_SOFT_DISABLED_BIT,
	EVENT_FILE_FL_TRIGGER_MODE_BIT,
	EVENT_FILE_FL_TRIGGER_COND_BIT,
423
	EVENT_FILE_FL_PID_FILTER_BIT,
424
	EVENT_FILE_FL_WAS_ENABLED_BIT,
425 426
};

427 428 429 430 431
extern struct trace_event_file *trace_get_event_file(const char *instance,
						     const char *system,
						     const char *event);
extern void trace_put_event_file(struct trace_event_file *file);

432 433 434
#define MAX_DYNEVENT_CMD_LEN	(2048)

enum dynevent_type {
435
	DYNEVENT_TYPE_SYNTH = 1,
436
	DYNEVENT_TYPE_KPROBE,
437 438 439 440 441 442 443 444
	DYNEVENT_TYPE_NONE,
};

struct dynevent_cmd;

typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *cmd);

struct dynevent_cmd {
445
	struct seq_buf		seq;
446 447 448 449 450 451 452 453 454
	const char		*event_name;
	unsigned int		n_fields;
	enum dynevent_type	type;
	dynevent_create_fn_t	run_command;
	void			*private_data;
};

extern int dynevent_create(struct dynevent_cmd *cmd);

T
Tom Zanussi 已提交
455 456
extern int synth_event_delete(const char *name);

457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
extern void synth_event_cmd_init(struct dynevent_cmd *cmd,
				 char *buf, int maxlen);

extern int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd,
				       const char *name,
				       struct module *mod, ...);

#define synth_event_gen_cmd_start(cmd, name, mod, ...)	\
	__synth_event_gen_cmd_start(cmd, name, mod, ## __VA_ARGS__, NULL)

struct synth_field_desc {
	const char *type;
	const char *name;
};

extern int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd,
					   const char *name,
					   struct module *mod,
					   struct synth_field_desc *fields,
					   unsigned int n_fields);
extern int synth_event_create(const char *name,
			      struct synth_field_desc *fields,
			      unsigned int n_fields, struct module *mod);

extern int synth_event_add_field(struct dynevent_cmd *cmd,
				 const char *type,
				 const char *name);
extern int synth_event_add_field_str(struct dynevent_cmd *cmd,
				     const char *type_name);
extern int synth_event_add_fields(struct dynevent_cmd *cmd,
				  struct synth_field_desc *fields,
				  unsigned int n_fields);

#define synth_event_gen_cmd_end(cmd)	\
	dynevent_create(cmd)

493 494 495 496 497 498 499 500 501
struct synth_event;

struct synth_event_trace_state {
	struct trace_event_buffer fbuffer;
	struct synth_trace_event *entry;
	struct trace_buffer *buffer;
	struct synth_event *event;
	unsigned int cur_field;
	unsigned int n_u64;
502
	bool disabled;
503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
	bool add_next;
	bool add_name;
};

extern int synth_event_trace(struct trace_event_file *file,
			     unsigned int n_vals, ...);
extern int synth_event_trace_array(struct trace_event_file *file, u64 *vals,
				   unsigned int n_vals);
extern int synth_event_trace_start(struct trace_event_file *file,
				   struct synth_event_trace_state *trace_state);
extern int synth_event_add_next_val(u64 val,
				    struct synth_event_trace_state *trace_state);
extern int synth_event_add_val(const char *field_name, u64 val,
			       struct synth_event_trace_state *trace_state);
extern int synth_event_trace_end(struct synth_event_trace_state *trace_state);

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
extern int kprobe_event_delete(const char *name);

extern void kprobe_event_cmd_init(struct dynevent_cmd *cmd,
				  char *buf, int maxlen);

#define kprobe_event_gen_cmd_start(cmd, name, loc, ...)			\
	__kprobe_event_gen_cmd_start(cmd, false, name, loc, ## __VA_ARGS__, NULL)

#define kretprobe_event_gen_cmd_start(cmd, name, loc, ...)		\
	__kprobe_event_gen_cmd_start(cmd, true, name, loc, ## __VA_ARGS__, NULL)

extern int __kprobe_event_gen_cmd_start(struct dynevent_cmd *cmd,
					bool kretprobe,
					const char *name,
					const char *loc, ...);

#define kprobe_event_add_fields(cmd, ...)	\
	__kprobe_event_add_fields(cmd, ## __VA_ARGS__, NULL)

#define kprobe_event_add_field(cmd, field)	\
	__kprobe_event_add_fields(cmd, field, NULL)

extern int __kprobe_event_add_fields(struct dynevent_cmd *cmd, ...);

#define kprobe_event_gen_cmd_end(cmd)		\
	dynevent_create(cmd)

#define kretprobe_event_gen_cmd_end(cmd)	\
	dynevent_create(cmd)

549
/*
550
 * Event file flags:
551
 *  ENABLED	  - The event is enabled
552
 *  RECORDED_CMD  - The comms should be recorded at sched_switch
553
 *  RECORDED_TGID - The tgids should be recorded at sched_switch
554 555
 *  FILTERED	  - The event has a filter attached
 *  NO_SET_FILTER - Set when filter has error and is to be ignored
556 557 558
 *  SOFT_MODE     - The event is enabled/disabled by SOFT_DISABLED
 *  SOFT_DISABLED - When set, do not trace the event (even though its
 *                   tracepoint may be enabled)
559
 *  TRIGGER_MODE  - When set, invoke the triggers associated with the event
560
 *  TRIGGER_COND  - When set, one or more triggers has an associated filter
561
 *  PID_FILTER    - When set, the event is filtered based on pid
562
 *  WAS_ENABLED   - Set when enabled to know to clear trace on module removal
563 564
 */
enum {
565 566
	EVENT_FILE_FL_ENABLED		= (1 << EVENT_FILE_FL_ENABLED_BIT),
	EVENT_FILE_FL_RECORDED_CMD	= (1 << EVENT_FILE_FL_RECORDED_CMD_BIT),
567
	EVENT_FILE_FL_RECORDED_TGID	= (1 << EVENT_FILE_FL_RECORDED_TGID_BIT),
568 569 570 571 572 573
	EVENT_FILE_FL_FILTERED		= (1 << EVENT_FILE_FL_FILTERED_BIT),
	EVENT_FILE_FL_NO_SET_FILTER	= (1 << EVENT_FILE_FL_NO_SET_FILTER_BIT),
	EVENT_FILE_FL_SOFT_MODE		= (1 << EVENT_FILE_FL_SOFT_MODE_BIT),
	EVENT_FILE_FL_SOFT_DISABLED	= (1 << EVENT_FILE_FL_SOFT_DISABLED_BIT),
	EVENT_FILE_FL_TRIGGER_MODE	= (1 << EVENT_FILE_FL_TRIGGER_MODE_BIT),
	EVENT_FILE_FL_TRIGGER_COND	= (1 << EVENT_FILE_FL_TRIGGER_COND_BIT),
574
	EVENT_FILE_FL_PID_FILTER	= (1 << EVENT_FILE_FL_PID_FILTER_BIT),
575
	EVENT_FILE_FL_WAS_ENABLED	= (1 << EVENT_FILE_FL_WAS_ENABLED_BIT),
576 577
};

578
struct trace_event_file {
579
	struct list_head		list;
580
	struct trace_event_call		*event_call;
581
	struct event_filter __rcu	*filter;
582 583
	struct dentry			*dir;
	struct trace_array		*tr;
584
	struct trace_subsystem_dir	*system;
585
	struct list_head		triggers;
586

587 588
	/*
	 * 32 bit flags:
589 590
	 *   bit 0:		enabled
	 *   bit 1:		enabled cmd record
591 592
	 *   bit 2:		enable/disable with the soft disable bit
	 *   bit 3:		soft disabled
593
	 *   bit 4:		trigger enabled
594
	 *
595 596 597
	 * Note: The bits must be set atomically to prevent races
	 * from other writers. Reads of flags do not need to be in
	 * sync as they occur in critical sections. But the way flags
598
	 * is currently used, these changes do not affect the code
599 600
	 * except that when a change is made, it may have a slight
	 * delay in propagating the changes to other CPUs due to
601
	 * caching and such. Which is mostly OK ;-)
602
	 */
603
	unsigned long		flags;
604
	atomic_t		sm_ref;	/* soft-mode reference counter */
605
	atomic_t		tm_ref;	/* trigger-mode reference counter */
606 607
};

608 609 610
#define __TRACE_EVENT_FLAGS(name, value)				\
	static int __init trace_init_flags_##name(void)			\
	{								\
611
		event_##name.flags |= value;				\
612 613 614 615
		return 0;						\
	}								\
	early_initcall(trace_init_flags_##name);

616
#define __TRACE_EVENT_PERF_PERM(name, expr...)				\
617
	static int perf_perm_##name(struct trace_event_call *tp_event, \
618 619 620 621 622 623 624 625 626 627 628
				    struct perf_event *p_event)		\
	{								\
		return ({ expr; });					\
	}								\
	static int __init trace_init_perf_perm_##name(void)		\
	{								\
		event_##name.perf_perm = &perf_perm_##name;		\
		return 0;						\
	}								\
	early_initcall(trace_init_perf_perm_##name);

629
#define PERF_MAX_TRACE_SIZE	2048
630

631
#define MAX_FILTER_STR_VAL	256	/* Should handle KSYM_SYMBOL_LEN */
632

633 634
enum event_trigger_type {
	ETT_NONE		= (0),
635
	ETT_TRACE_ONOFF		= (1 << 0),
636
	ETT_SNAPSHOT		= (1 << 1),
637
	ETT_STACKTRACE		= (1 << 2),
638
	ETT_EVENT_ENABLE	= (1 << 3),
639
	ETT_EVENT_HIST		= (1 << 4),
640
	ETT_HIST_ENABLE		= (1 << 5),
641 642
};

L
Li Zefan 已提交
643
extern int filter_match_preds(struct event_filter *filter, void *rec);
644

645 646 647 648 649
extern enum event_trigger_type
event_triggers_call(struct trace_event_file *file, void *rec,
		    struct ring_buffer_event *event);
extern void
event_triggers_post_call(struct trace_event_file *file,
650
			 enum event_trigger_type tt);
651

652 653
bool trace_event_ignore_this_pid(struct trace_event_file *trace_file);

654
/**
655
 * trace_trigger_soft_disabled - do triggers and test if soft disabled
656 657 658 659 660 661 662 663
 * @file: The file pointer of the event to test
 *
 * If any triggers without filters are attached to this event, they
 * will be called here. If the event is soft disabled and has no
 * triggers that require testing the fields, it will return true,
 * otherwise false.
 */
static inline bool
664
trace_trigger_soft_disabled(struct trace_event_file *file)
665 666 667
{
	unsigned long eflags = file->flags;

668 669
	if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) {
		if (eflags & EVENT_FILE_FL_TRIGGER_MODE)
670
			event_triggers_call(file, NULL, NULL);
671
		if (eflags & EVENT_FILE_FL_SOFT_DISABLED)
672
			return true;
673 674
		if (eflags & EVENT_FILE_FL_PID_FILTER)
			return trace_event_ignore_this_pid(file);
675 676 677 678
	}
	return false;
}

679
#ifdef CONFIG_BPF_EVENTS
680 681 682
unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx);
int perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog);
void perf_event_detach_bpf_prog(struct perf_event *event);
683
int perf_event_query_prog_array(struct perf_event *event, void __user *info);
684 685
int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog);
int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *prog);
686 687
struct bpf_raw_event_map *bpf_get_raw_tracepoint(const char *name);
void bpf_put_raw_tracepoint(struct bpf_raw_event_map *btp);
688 689 690
int bpf_get_perf_event_info(const struct perf_event *event, u32 *prog_id,
			    u32 *fd_type, const char **buf,
			    u64 *probe_offset, u64 *probe_addr);
691
#else
692
static inline unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx)
693 694 695
{
	return 1;
}
696 697 698 699 700 701 702 703 704

static inline int
perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog)
{
	return -EOPNOTSUPP;
}

static inline void perf_event_detach_bpf_prog(struct perf_event *event) { }

705 706 707 708 709
static inline int
perf_event_query_prog_array(struct perf_event *event, void __user *info)
{
	return -EOPNOTSUPP;
}
710 711 712 713 714 715 716 717
static inline int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *p)
{
	return -EOPNOTSUPP;
}
static inline int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *p)
{
	return -EOPNOTSUPP;
}
718
static inline struct bpf_raw_event_map *bpf_get_raw_tracepoint(const char *name)
719 720 721
{
	return NULL;
}
722 723 724
static inline void bpf_put_raw_tracepoint(struct bpf_raw_event_map *btp)
{
}
725 726 727 728 729 730 731
static inline int bpf_get_perf_event_info(const struct perf_event *event,
					  u32 *prog_id, u32 *fd_type,
					  const char **buf, u64 *probe_offset,
					  u64 *probe_addr)
{
	return -EOPNOTSUPP;
}
732 733
#endif

734 735 736 737
enum {
	FILTER_OTHER = 0,
	FILTER_STATIC_STRING,
	FILTER_DYN_STRING,
738
	FILTER_PTR_STRING,
739
	FILTER_TRACE_FN,
740 741
	FILTER_COMM,
	FILTER_CPU,
742 743
};

744 745
extern int trace_event_raw_init(struct trace_event_call *call);
extern int trace_define_field(struct trace_event_call *call, const char *type,
746 747
			      const char *name, int offset, int size,
			      int is_signed, int filter_type);
748 749
extern int trace_add_event_call(struct trace_event_call *call);
extern int trace_remove_event_call(struct trace_event_call *call);
750
extern int trace_event_get_offsets(struct trace_event_call *call);
751

752
#define is_signed_type(type)	(((type)(-1)) < (type)1)
753

754
int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set);
755
int trace_set_clr_event(const char *system, const char *event, int set);
756 757
int trace_array_set_clr_event(struct trace_array *tr, const char *system,
		const char *event, bool enable);
758 759 760 761 762 763 764 765 766 767 768
/*
 * The double __builtin_constant_p is because gcc will give us an error
 * if we try to allocate the static variable to fmt if it is not a
 * constant. Even with the outer if statement optimizing out.
 */
#define event_trace_printk(ip, fmt, args...)				\
do {									\
	__trace_printk_check_format(fmt, ##args);			\
	tracing_record_cmdline(current);				\
	if (__builtin_constant_p(fmt)) {				\
		static const char *trace_printk_fmt			\
769
		  __section("__trace_printk_fmt") =			\
770 771 772 773 774 775 776
			__builtin_constant_p(fmt) ? fmt : NULL;		\
									\
		__trace_bprintk(ip, trace_printk_fmt, ##args);		\
	} else								\
		__trace_printk(ip, fmt, ##args);			\
} while (0)

777
#ifdef CONFIG_PERF_EVENTS
L
Li Zefan 已提交
778
struct perf_event;
779 780

DECLARE_PER_CPU(struct pt_regs, perf_trace_regs);
781
DECLARE_PER_CPU(int, bpf_kprobe_override);
782

783 784
extern int  perf_trace_init(struct perf_event *event);
extern void perf_trace_destroy(struct perf_event *event);
P
Peter Zijlstra 已提交
785 786
extern int  perf_trace_add(struct perf_event *event, int flags);
extern void perf_trace_del(struct perf_event *event, int flags);
787 788 789
#ifdef CONFIG_KPROBE_EVENTS
extern int  perf_kprobe_init(struct perf_event *event, bool is_retprobe);
extern void perf_kprobe_destroy(struct perf_event *event);
790 791 792 793
extern int bpf_get_kprobe_info(const struct perf_event *event,
			       u32 *fd_type, const char **symbol,
			       u64 *probe_offset, u64 *probe_addr,
			       bool perf_type_tracepoint);
794
#endif
795
#ifdef CONFIG_UPROBE_EVENTS
796 797
extern int  perf_uprobe_init(struct perf_event *event,
			     unsigned long ref_ctr_offset, bool is_retprobe);
798
extern void perf_uprobe_destroy(struct perf_event *event);
799 800 801
extern int bpf_get_uprobe_info(const struct perf_event *event,
			       u32 *fd_type, const char **filename,
			       u64 *probe_offset, bool perf_type_tracepoint);
802
#endif
803
extern int  ftrace_profile_set_filter(struct perf_event *event, int event_id,
L
Li Zefan 已提交
804 805
				     char *filter_str);
extern void ftrace_profile_free_filter(struct perf_event *event);
806 807
void perf_trace_buf_update(void *record, u16 type);
void *perf_trace_buf_alloc(int size, struct pt_regs **regs, int *rctxp);
808

809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
void bpf_trace_run1(struct bpf_prog *prog, u64 arg1);
void bpf_trace_run2(struct bpf_prog *prog, u64 arg1, u64 arg2);
void bpf_trace_run3(struct bpf_prog *prog, u64 arg1, u64 arg2,
		    u64 arg3);
void bpf_trace_run4(struct bpf_prog *prog, u64 arg1, u64 arg2,
		    u64 arg3, u64 arg4);
void bpf_trace_run5(struct bpf_prog *prog, u64 arg1, u64 arg2,
		    u64 arg3, u64 arg4, u64 arg5);
void bpf_trace_run6(struct bpf_prog *prog, u64 arg1, u64 arg2,
		    u64 arg3, u64 arg4, u64 arg5, u64 arg6);
void bpf_trace_run7(struct bpf_prog *prog, u64 arg1, u64 arg2,
		    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7);
void bpf_trace_run8(struct bpf_prog *prog, u64 arg1, u64 arg2,
		    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
		    u64 arg8);
void bpf_trace_run9(struct bpf_prog *prog, u64 arg1, u64 arg2,
		    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
		    u64 arg8, u64 arg9);
void bpf_trace_run10(struct bpf_prog *prog, u64 arg1, u64 arg2,
		     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
		     u64 arg8, u64 arg9, u64 arg10);
void bpf_trace_run11(struct bpf_prog *prog, u64 arg1, u64 arg2,
		     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
		     u64 arg8, u64 arg9, u64 arg10, u64 arg11);
void bpf_trace_run12(struct bpf_prog *prog, u64 arg1, u64 arg2,
		     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
		     u64 arg8, u64 arg9, u64 arg10, u64 arg11, u64 arg12);
836 837 838 839 840
void perf_trace_run_bpf_submit(void *raw_data, int size, int rctx,
			       struct trace_event_call *call, u64 count,
			       struct pt_regs *regs, struct hlist_head *head,
			       struct task_struct *task);

841
static inline void
842
perf_trace_buf_submit(void *raw_data, int size, int rctx, u16 type,
843
		       u64 count, struct pt_regs *regs, void *head,
844
		       struct task_struct *task)
845
{
846
	perf_tp_event(type, count, raw_data, size, regs, head, rctx, task);
847
}
848

L
Li Zefan 已提交
849 850
#endif

851
#endif /* _LINUX_TRACE_EVENT_H */