diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-20 13:35:07 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-20 13:35:07 -0700 | 
| commit | 92b29b86fe2e183d44eb467e5e74a5f718ef2e43 (patch) | |
| tree | 1bac8a1aa11d47322b66d10ec3a370016d843d06 /include/linux | |
| parent | b9d7ccf56be1ac77b71a284a1c0e6337f9a7aff0 (diff) | |
| parent | 98d9c66ab07471006fd7910cb16453581c41a3e7 (diff) | |
| download | olio-linux-3.10-92b29b86fe2e183d44eb467e5e74a5f718ef2e43.tar.xz olio-linux-3.10-92b29b86fe2e183d44eb467e5e74a5f718ef2e43.zip  | |
Merge branch 'tracing-v28-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'tracing-v28-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (131 commits)
  tracing/fastboot: improve help text
  tracing/stacktrace: improve help text
  tracing/fastboot: fix initcalls disposition in bootgraph.pl
  tracing/fastboot: fix bootgraph.pl initcall name regexp
  tracing/fastboot: fix issues and improve output of bootgraph.pl
  tracepoints: synchronize unregister static inline
  tracepoints: tracepoint_synchronize_unregister()
  ftrace: make ftrace_test_p6nop disassembler-friendly
  markers: fix synchronize marker unregister static inline
  tracing/fastboot: add better resolution to initcall debug/tracing
  trace: add build-time check to avoid overrunning hex buffer
  ftrace: fix hex output mode of ftrace
  tracing/fastboot: fix initcalls disposition in bootgraph.pl
  tracing/fastboot: fix printk format typo in boot tracer
  ftrace: return an error when setting a nonexistent tracer
  ftrace: make some tracers reentrant
  ring-buffer: make reentrant
  ring-buffer: move page indexes into page headers
  tracing/fastboot: only trace non-module initcalls
  ftrace: move pc counter in irqtrace
  ...
Manually fix conflicts:
 - init/main.c: initcall tracing
 - kernel/module.c: verbose level vs tracepoints
 - scripts/bootgraph.pl: fallout from cherry-picking commits.
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/compiler.h | 2 | ||||
| -rw-r--r-- | include/linux/ftrace.h | 84 | ||||
| -rw-r--r-- | include/linux/init.h | 2 | ||||
| -rw-r--r-- | include/linux/kernel.h | 5 | ||||
| -rw-r--r-- | include/linux/kprobes.h | 5 | ||||
| -rw-r--r-- | include/linux/linkage.h | 2 | ||||
| -rw-r--r-- | include/linux/marker.h | 7 | ||||
| -rw-r--r-- | include/linux/mmiotrace.h | 20 | ||||
| -rw-r--r-- | include/linux/module.h | 17 | ||||
| -rw-r--r-- | include/linux/ring_buffer.h | 127 | ||||
| -rw-r--r-- | include/linux/tracepoint.h | 137 | 
11 files changed, 393 insertions, 15 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 8322141ee48..98115d9d04d 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -44,6 +44,8 @@ extern void __chk_io_ptr(const volatile void __iomem *);  # error Sorry, your compiler is too old/not recognized.  #endif +#define notrace __attribute__((no_instrument_function)) +  /* Intel compiler defines __GNUC__. So we will overwrite implementations   * coming from above header files here   */ diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index bb384068272..a3d46151be1 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -1,10 +1,14 @@  #ifndef _LINUX_FTRACE_H  #define _LINUX_FTRACE_H -#ifdef CONFIG_FTRACE -  #include <linux/linkage.h>  #include <linux/fs.h> +#include <linux/ktime.h> +#include <linux/init.h> +#include <linux/types.h> +#include <linux/kallsyms.h> + +#ifdef CONFIG_FTRACE  extern int ftrace_enabled;  extern int @@ -36,6 +40,7 @@ extern void ftrace_stub(unsigned long a0, unsigned long a1);  # define register_ftrace_function(ops) do { } while (0)  # define unregister_ftrace_function(ops) do { } while (0)  # define clear_ftrace_function(ops) do { } while (0) +static inline void ftrace_kill_atomic(void) { }  #endif /* CONFIG_FTRACE */  #ifdef CONFIG_DYNAMIC_FTRACE @@ -76,8 +81,10 @@ extern void mcount_call(void);  extern int skip_trace(unsigned long ip); -void ftrace_disable_daemon(void); -void ftrace_enable_daemon(void); +extern void ftrace_release(void *start, unsigned long size); + +extern void ftrace_disable_daemon(void); +extern void ftrace_enable_daemon(void);  #else  # define skip_trace(ip)				({ 0; }) @@ -85,6 +92,7 @@ void ftrace_enable_daemon(void);  # define ftrace_set_filter(buf, len, reset)	do { } while (0)  # define ftrace_disable_daemon()		do { } while (0)  # define ftrace_enable_daemon()			do { } while (0) +static inline void ftrace_release(void *start, unsigned long size) { }  #endif /* CONFIG_DYNAMIC_FTRACE */  /* totally disable ftrace - can not re-enable after this */ @@ -98,9 +106,11 @@ static inline void tracer_disable(void)  #endif  } -/* Ftrace disable/restore without lock. Some synchronization mechanism +/* + * Ftrace disable/restore without lock. Some synchronization mechanism   * must be used to prevent ftrace_enabled to be changed between - * disable/restore. */ + * disable/restore. + */  static inline int __ftrace_enabled_save(void)  {  #ifdef CONFIG_FTRACE @@ -157,9 +167,71 @@ static inline void __ftrace_enabled_restore(int enabled)  #ifdef CONFIG_TRACING  extern void  ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3); + +/** + * ftrace_printk - printf formatting in the ftrace buffer + * @fmt: the printf format for printing + * + * Note: __ftrace_printk is an internal function for ftrace_printk and + *       the @ip is passed in via the ftrace_printk macro. + * + * This function allows a kernel developer to debug fast path sections + * that printk is not appropriate for. By scattering in various + * printk like tracing in the code, a developer can quickly see + * where problems are occurring. + * + * This is intended as a debugging tool for the developer only. + * Please refrain from leaving ftrace_printks scattered around in + * your code. + */ +# define ftrace_printk(fmt...) __ftrace_printk(_THIS_IP_, fmt) +extern int +__ftrace_printk(unsigned long ip, const char *fmt, ...) +	__attribute__ ((format (printf, 2, 3))); +extern void ftrace_dump(void);  #else  static inline void  ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { } +static inline int +ftrace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 0))); + +static inline int +ftrace_printk(const char *fmt, ...) +{ +	return 0; +} +static inline void ftrace_dump(void) { }  #endif +#ifdef CONFIG_FTRACE_MCOUNT_RECORD +extern void ftrace_init(void); +extern void ftrace_init_module(unsigned long *start, unsigned long *end); +#else +static inline void ftrace_init(void) { } +static inline void +ftrace_init_module(unsigned long *start, unsigned long *end) { } +#endif + + +struct boot_trace { +	pid_t			caller; +	char			func[KSYM_NAME_LEN]; +	int			result; +	unsigned long long	duration;		/* usecs */ +	ktime_t			calltime; +	ktime_t			rettime; +}; + +#ifdef CONFIG_BOOT_TRACER +extern void trace_boot(struct boot_trace *it, initcall_t fn); +extern void start_boot_trace(void); +extern void stop_boot_trace(void); +#else +static inline void trace_boot(struct boot_trace *it, initcall_t fn) { } +static inline void start_boot_trace(void) { } +static inline void stop_boot_trace(void) { } +#endif + + +  #endif /* _LINUX_FTRACE_H */ diff --git a/include/linux/init.h b/include/linux/init.h index ad63824460e..0c1264668be 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -40,7 +40,7 @@  /* These are for everybody (although not all archs will actually     discard it in modules) */ -#define __init		__section(.init.text) __cold +#define __init		__section(.init.text) __cold notrace  #define __initdata	__section(.init.data)  #define __initconst	__section(.init.rodata)  #define __exitdata	__section(.exit.data) diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 5a566b705ca..94d17ff64c5 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -496,4 +496,9 @@ struct sysinfo {  #define NUMA_BUILD 0  #endif +/* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */ +#ifdef CONFIG_FTRACE_MCOUNT_RECORD +# define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD +#endif +  #endif diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 0be7795655f..497b1d1f7a0 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -29,6 +29,7 @@   *		<jkenisto@us.ibm.com>  and Prasanna S Panchamukhi   *		<prasanna@in.ibm.com> added function-return probes.   */ +#include <linux/linkage.h>  #include <linux/list.h>  #include <linux/notifier.h>  #include <linux/smp.h> @@ -47,7 +48,7 @@  #define KPROBE_HIT_SSDONE	0x00000008  /* Attach to insert probes on any functions which should be ignored*/ -#define __kprobes	__attribute__((__section__(".kprobes.text"))) +#define __kprobes	__attribute__((__section__(".kprobes.text"))) notrace  struct kprobe;  struct pt_regs; @@ -256,7 +257,7 @@ void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);  #else /* CONFIG_KPROBES */ -#define __kprobes	/**/ +#define __kprobes	notrace  struct jprobe;  struct kretprobe; diff --git a/include/linux/linkage.h b/include/linux/linkage.h index 56ba3739465..9fd1f859021 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -4,8 +4,6 @@  #include <linux/compiler.h>  #include <asm/linkage.h> -#define notrace __attribute__((no_instrument_function)) -  #ifdef __cplusplus  #define CPP_ASMLINKAGE extern "C"  #else diff --git a/include/linux/marker.h b/include/linux/marker.h index 1290653f924..889196c7fbb 100644 --- a/include/linux/marker.h +++ b/include/linux/marker.h @@ -160,4 +160,11 @@ extern int marker_probe_unregister_private_data(marker_probe_func *probe,  extern void *marker_get_private_data(const char *name, marker_probe_func *probe,  	int num); +/* + * marker_synchronize_unregister must be called between the last marker probe + * unregistration and the end of module exit to make sure there is no caller + * executing a probe when it is freed. + */ +#define marker_synchronize_unregister() synchronize_sched() +  #endif diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h index 61d19e1b7a0..139d7c88d9c 100644 --- a/include/linux/mmiotrace.h +++ b/include/linux/mmiotrace.h @@ -34,11 +34,15 @@ extern void unregister_kmmio_probe(struct kmmio_probe *p);  /* Called from page fault handler. */  extern int kmmio_handler(struct pt_regs *regs, unsigned long addr); -/* Called from ioremap.c */  #ifdef CONFIG_MMIOTRACE +/* Called from ioremap.c */  extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,  							void __iomem *addr);  extern void mmiotrace_iounmap(volatile void __iomem *addr); + +/* For anyone to insert markers. Remember trailing newline. */ +extern int mmiotrace_printk(const char *fmt, ...) +				__attribute__ ((format (printf, 1, 2)));  #else  static inline void mmiotrace_ioremap(resource_size_t offset,  					unsigned long size, void __iomem *addr) @@ -48,15 +52,22 @@ static inline void mmiotrace_ioremap(resource_size_t offset,  static inline void mmiotrace_iounmap(volatile void __iomem *addr)  {  } -#endif /* CONFIG_MMIOTRACE_HOOKS */ + +static inline int mmiotrace_printk(const char *fmt, ...) +				__attribute__ ((format (printf, 1, 0))); + +static inline int mmiotrace_printk(const char *fmt, ...) +{ +	return 0; +} +#endif /* CONFIG_MMIOTRACE */  enum mm_io_opcode {  	MMIO_READ = 0x1,     /* struct mmiotrace_rw */  	MMIO_WRITE = 0x2,    /* struct mmiotrace_rw */  	MMIO_PROBE = 0x3,    /* struct mmiotrace_map */  	MMIO_UNPROBE = 0x4,  /* struct mmiotrace_map */ -	MMIO_MARKER = 0x5,   /* raw char data */ -	MMIO_UNKNOWN_OP = 0x6, /* struct mmiotrace_rw */ +	MMIO_UNKNOWN_OP = 0x5, /* struct mmiotrace_rw */  };  struct mmiotrace_rw { @@ -81,5 +92,6 @@ extern void enable_mmiotrace(void);  extern void disable_mmiotrace(void);  extern void mmio_trace_rw(struct mmiotrace_rw *rw);  extern void mmio_trace_mapping(struct mmiotrace_map *map); +extern int mmio_trace_printk(const char *fmt, va_list args);  #endif /* MMIOTRACE_H */ diff --git a/include/linux/module.h b/include/linux/module.h index a41555cbe00..5d2970cdce9 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -16,6 +16,7 @@  #include <linux/kobject.h>  #include <linux/moduleparam.h>  #include <linux/marker.h> +#include <linux/tracepoint.h>  #include <asm/local.h>  #include <asm/module.h> @@ -331,6 +332,10 @@ struct module  	struct marker *markers;  	unsigned int num_markers;  #endif +#ifdef CONFIG_TRACEPOINTS +	struct tracepoint *tracepoints; +	unsigned int num_tracepoints; +#endif  #ifdef CONFIG_MODULE_UNLOAD  	/* What modules depend on me? */ @@ -453,6 +458,9 @@ extern void print_modules(void);  extern void module_update_markers(void); +extern void module_update_tracepoints(void); +extern int module_get_iter_tracepoints(struct tracepoint_iter *iter); +  #else /* !CONFIG_MODULES... */  #define EXPORT_SYMBOL(sym)  #define EXPORT_SYMBOL_GPL(sym) @@ -557,6 +565,15 @@ static inline void module_update_markers(void)  {  } +static inline void module_update_tracepoints(void) +{ +} + +static inline int module_get_iter_tracepoints(struct tracepoint_iter *iter) +{ +	return 0; +} +  #endif /* CONFIG_MODULES */  struct device_driver; diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h new file mode 100644 index 00000000000..536b0ca46a0 --- /dev/null +++ b/include/linux/ring_buffer.h @@ -0,0 +1,127 @@ +#ifndef _LINUX_RING_BUFFER_H +#define _LINUX_RING_BUFFER_H + +#include <linux/mm.h> +#include <linux/seq_file.h> + +struct ring_buffer; +struct ring_buffer_iter; + +/* + * Don't reference this struct directly, use functions below. + */ +struct ring_buffer_event { +	u32		type:2, len:3, time_delta:27; +	u32		array[]; +}; + +/** + * enum ring_buffer_type - internal ring buffer types + * + * @RINGBUF_TYPE_PADDING:	Left over page padding + *				 array is ignored + *				 size is variable depending on how much + *				  padding is needed + * + * @RINGBUF_TYPE_TIME_EXTEND:	Extend the time delta + *				 array[0] = time delta (28 .. 59) + *				 size = 8 bytes + * + * @RINGBUF_TYPE_TIME_STAMP:	Sync time stamp with external clock + *				 array[0] = tv_nsec + *				 array[1] = tv_sec + *				 size = 16 bytes + * + * @RINGBUF_TYPE_DATA:		Data record + *				 If len is zero: + *				  array[0] holds the actual length + *				  array[1..(length+3)/4-1] holds data + *				 else + *				  length = len << 2 + *				  array[0..(length+3)/4] holds data + */ +enum ring_buffer_type { +	RINGBUF_TYPE_PADDING, +	RINGBUF_TYPE_TIME_EXTEND, +	/* FIXME: RINGBUF_TYPE_TIME_STAMP not implemented */ +	RINGBUF_TYPE_TIME_STAMP, +	RINGBUF_TYPE_DATA, +}; + +unsigned ring_buffer_event_length(struct ring_buffer_event *event); +void *ring_buffer_event_data(struct ring_buffer_event *event); + +/** + * ring_buffer_event_time_delta - return the delta timestamp of the event + * @event: the event to get the delta timestamp of + * + * The delta timestamp is the 27 bit timestamp since the last event. + */ +static inline unsigned +ring_buffer_event_time_delta(struct ring_buffer_event *event) +{ +	return event->time_delta; +} + +/* + * size is in bytes for each per CPU buffer. + */ +struct ring_buffer * +ring_buffer_alloc(unsigned long size, unsigned flags); +void ring_buffer_free(struct ring_buffer *buffer); + +int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size); + +struct ring_buffer_event * +ring_buffer_lock_reserve(struct ring_buffer *buffer, +			 unsigned long length, +			 unsigned long *flags); +int ring_buffer_unlock_commit(struct ring_buffer *buffer, +			      struct ring_buffer_event *event, +			      unsigned long flags); +int ring_buffer_write(struct ring_buffer *buffer, +		      unsigned long length, void *data); + +struct ring_buffer_event * +ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts); +struct ring_buffer_event * +ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts); + +struct ring_buffer_iter * +ring_buffer_read_start(struct ring_buffer *buffer, int cpu); +void ring_buffer_read_finish(struct ring_buffer_iter *iter); + +struct ring_buffer_event * +ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts); +struct ring_buffer_event * +ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts); +void ring_buffer_iter_reset(struct ring_buffer_iter *iter); +int ring_buffer_iter_empty(struct ring_buffer_iter *iter); + +unsigned long ring_buffer_size(struct ring_buffer *buffer); + +void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu); +void ring_buffer_reset(struct ring_buffer *buffer); + +int ring_buffer_swap_cpu(struct ring_buffer *buffer_a, +			 struct ring_buffer *buffer_b, int cpu); + +int ring_buffer_empty(struct ring_buffer *buffer); +int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu); + +void ring_buffer_record_disable(struct ring_buffer *buffer); +void ring_buffer_record_enable(struct ring_buffer *buffer); +void ring_buffer_record_disable_cpu(struct ring_buffer *buffer, int cpu); +void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu); + +unsigned long ring_buffer_entries(struct ring_buffer *buffer); +unsigned long ring_buffer_overruns(struct ring_buffer *buffer); + +u64 ring_buffer_time_stamp(int cpu); +void ring_buffer_normalize_time_stamp(int cpu, u64 *ts); + +enum ring_buffer_flags { +	RB_FL_OVERWRITE		= 1 << 0, +}; + +#endif /* _LINUX_RING_BUFFER_H */ diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h new file mode 100644 index 00000000000..c5bb39c7a77 --- /dev/null +++ b/include/linux/tracepoint.h @@ -0,0 +1,137 @@ +#ifndef _LINUX_TRACEPOINT_H +#define _LINUX_TRACEPOINT_H + +/* + * Kernel Tracepoint API. + * + * See Documentation/tracepoint.txt. + * + * (C) Copyright 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> + * + * Heavily inspired from the Linux Kernel Markers. + * + * This file is released under the GPLv2. + * See the file COPYING for more details. + */ + +#include <linux/types.h> +#include <linux/rcupdate.h> + +struct module; +struct tracepoint; + +struct tracepoint { +	const char *name;		/* Tracepoint name */ +	int state;			/* State. */ +	void **funcs; +} __attribute__((aligned(8))); + + +#define TPPROTO(args...)	args +#define TPARGS(args...)		args + +#ifdef CONFIG_TRACEPOINTS + +/* + * it_func[0] is never NULL because there is at least one element in the array + * when the array itself is non NULL. + */ +#define __DO_TRACE(tp, proto, args)					\ +	do {								\ +		void **it_func;						\ +									\ +		rcu_read_lock_sched();					\ +		it_func = rcu_dereference((tp)->funcs);			\ +		if (it_func) {						\ +			do {						\ +				((void(*)(proto))(*it_func))(args);	\ +			} while (*(++it_func));				\ +		}							\ +		rcu_read_unlock_sched();				\ +	} while (0) + +/* + * Make sure the alignment of the structure in the __tracepoints section will + * not add unwanted padding between the beginning of the section and the + * structure. Force alignment to the same alignment as the section start. + */ +#define DEFINE_TRACE(name, proto, args)					\ +	static inline void trace_##name(proto)				\ +	{								\ +		static const char __tpstrtab_##name[]			\ +		__attribute__((section("__tracepoints_strings")))	\ +		= #name ":" #proto;					\ +		static struct tracepoint __tracepoint_##name		\ +		__attribute__((section("__tracepoints"), aligned(8))) =	\ +		{ __tpstrtab_##name, 0, NULL };				\ +		if (unlikely(__tracepoint_##name.state))		\ +			__DO_TRACE(&__tracepoint_##name,		\ +				TPPROTO(proto), TPARGS(args));		\ +	}								\ +	static inline int register_trace_##name(void (*probe)(proto))	\ +	{								\ +		return tracepoint_probe_register(#name ":" #proto,	\ +			(void *)probe);					\ +	}								\ +	static inline void unregister_trace_##name(void (*probe)(proto))\ +	{								\ +		tracepoint_probe_unregister(#name ":" #proto,		\ +			(void *)probe);					\ +	} + +extern void tracepoint_update_probe_range(struct tracepoint *begin, +	struct tracepoint *end); + +#else /* !CONFIG_TRACEPOINTS */ +#define DEFINE_TRACE(name, proto, args)			\ +	static inline void _do_trace_##name(struct tracepoint *tp, proto) \ +	{ }								\ +	static inline void trace_##name(proto)				\ +	{ }								\ +	static inline int register_trace_##name(void (*probe)(proto))	\ +	{								\ +		return -ENOSYS;						\ +	}								\ +	static inline void unregister_trace_##name(void (*probe)(proto))\ +	{ } + +static inline void tracepoint_update_probe_range(struct tracepoint *begin, +	struct tracepoint *end) +{ } +#endif /* CONFIG_TRACEPOINTS */ + +/* + * Connect a probe to a tracepoint. + * Internal API, should not be used directly. + */ +extern int tracepoint_probe_register(const char *name, void *probe); + +/* + * Disconnect a probe from a tracepoint. + * Internal API, should not be used directly. + */ +extern int tracepoint_probe_unregister(const char *name, void *probe); + +struct tracepoint_iter { +	struct module *module; +	struct tracepoint *tracepoint; +}; + +extern void tracepoint_iter_start(struct tracepoint_iter *iter); +extern void tracepoint_iter_next(struct tracepoint_iter *iter); +extern void tracepoint_iter_stop(struct tracepoint_iter *iter); +extern void tracepoint_iter_reset(struct tracepoint_iter *iter); +extern int tracepoint_get_iter_range(struct tracepoint **tracepoint, +	struct tracepoint *begin, struct tracepoint *end); + +/* + * tracepoint_synchronize_unregister must be called between the last tracepoint + * probe unregistration and the end of module exit to make sure there is no + * caller executing a probe when it is freed. + */ +static inline void tracepoint_synchronize_unregister(void) +{ +	synchronize_sched(); +} + +#endif  |