tracing: tracepoints, samples
Tracepoint example code under samples/. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Acked-by: 'Peter Zijlstra' <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									24b8d831d5
								
							
						
					
					
						commit
						4a0897526b
					
				| @ -13,6 +13,12 @@ config SAMPLE_MARKERS | ||||
| 	help | ||||
| 	  This build markers example modules. | ||||
| 
 | ||||
| config SAMPLE_TRACEPOINTS | ||||
| 	tristate "Build tracepoints examples -- loadable modules only" | ||||
| 	depends on TRACEPOINTS && m | ||||
| 	help | ||||
| 	  This build tracepoints example modules. | ||||
| 
 | ||||
| config SAMPLE_KOBJECT | ||||
| 	tristate "Build kobject examples" | ||||
| 	help | ||||
|  | ||||
| @ -1,3 +1,3 @@ | ||||
| # Makefile for Linux samples code
 | ||||
| 
 | ||||
| obj-$(CONFIG_SAMPLES)	+= markers/ kobject/ kprobes/ | ||||
| obj-$(CONFIG_SAMPLES)	+= markers/ kobject/ kprobes/ tracepoints/ | ||||
|  | ||||
							
								
								
									
										6
									
								
								samples/tracepoints/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/tracepoints/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| # builds the tracepoint example kernel modules;
 | ||||
| # then to use one (as root):  insmod <module_name.ko>
 | ||||
| 
 | ||||
| obj-$(CONFIG_SAMPLE_TRACEPOINTS) += tracepoint-sample.o | ||||
| obj-$(CONFIG_SAMPLE_TRACEPOINTS) += tracepoint-probe-sample.o | ||||
| obj-$(CONFIG_SAMPLE_TRACEPOINTS) += tracepoint-probe-sample2.o | ||||
							
								
								
									
										13
									
								
								samples/tracepoints/tp-samples-trace.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/tracepoints/tp-samples-trace.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| #ifndef _TP_SAMPLES_TRACE_H | ||||
| #define _TP_SAMPLES_TRACE_H | ||||
| 
 | ||||
| #include <linux/proc_fs.h>	/* for struct inode and struct file */ | ||||
| #include <linux/tracepoint.h> | ||||
| 
 | ||||
| DEFINE_TRACE(subsys_event, | ||||
| 	TPPROTO(struct inode *inode, struct file *file), | ||||
| 	TPARGS(inode, file)); | ||||
| DEFINE_TRACE(subsys_eventb, | ||||
| 	TPPROTO(void), | ||||
| 	TPARGS()); | ||||
| #endif | ||||
							
								
								
									
										55
									
								
								samples/tracepoints/tracepoint-probe-sample.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								samples/tracepoints/tracepoint-probe-sample.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| /*
 | ||||
|  * tracepoint-probe-sample.c | ||||
|  * | ||||
|  * sample tracepoint probes. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/file.h> | ||||
| #include <linux/dcache.h> | ||||
| #include "tp-samples-trace.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Here the caller only guarantees locking for struct file and struct inode. | ||||
|  * Locking must therefore be done in the probe to use the dentry. | ||||
|  */ | ||||
| static void probe_subsys_event(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	path_get(&file->f_path); | ||||
| 	dget(file->f_path.dentry); | ||||
| 	printk(KERN_INFO "Event is encountered with filename %s\n", | ||||
| 		file->f_path.dentry->d_name.name); | ||||
| 	dput(file->f_path.dentry); | ||||
| 	path_put(&file->f_path); | ||||
| } | ||||
| 
 | ||||
| static void probe_subsys_eventb(void) | ||||
| { | ||||
| 	printk(KERN_INFO "Event B is encountered\n"); | ||||
| } | ||||
| 
 | ||||
| int __init tp_sample_trace_init(void) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = register_trace_subsys_event(probe_subsys_event); | ||||
| 	WARN_ON(ret); | ||||
| 	ret = register_trace_subsys_eventb(probe_subsys_eventb); | ||||
| 	WARN_ON(ret); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| module_init(tp_sample_trace_init); | ||||
| 
 | ||||
| void __exit tp_sample_trace_exit(void) | ||||
| { | ||||
| 	unregister_trace_subsys_eventb(probe_subsys_eventb); | ||||
| 	unregister_trace_subsys_event(probe_subsys_event); | ||||
| } | ||||
| 
 | ||||
| module_exit(tp_sample_trace_exit); | ||||
| 
 | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_AUTHOR("Mathieu Desnoyers"); | ||||
| MODULE_DESCRIPTION("Tracepoint Probes Samples"); | ||||
							
								
								
									
										42
									
								
								samples/tracepoints/tracepoint-probe-sample2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								samples/tracepoints/tracepoint-probe-sample2.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | ||||
| /*
 | ||||
|  * tracepoint-probe-sample2.c | ||||
|  * | ||||
|  * 2nd sample tracepoint probes. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/fs.h> | ||||
| #include "tp-samples-trace.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Here the caller only guarantees locking for struct file and struct inode. | ||||
|  * Locking must therefore be done in the probe to use the dentry. | ||||
|  */ | ||||
| static void probe_subsys_event(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	printk(KERN_INFO "Event is encountered with inode number %lu\n", | ||||
| 		inode->i_ino); | ||||
| } | ||||
| 
 | ||||
| int __init tp_sample_trace_init(void) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = register_trace_subsys_event(probe_subsys_event); | ||||
| 	WARN_ON(ret); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| module_init(tp_sample_trace_init); | ||||
| 
 | ||||
| void __exit tp_sample_trace_exit(void) | ||||
| { | ||||
| 	unregister_trace_subsys_event(probe_subsys_event); | ||||
| } | ||||
| 
 | ||||
| module_exit(tp_sample_trace_exit); | ||||
| 
 | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_AUTHOR("Mathieu Desnoyers"); | ||||
| MODULE_DESCRIPTION("Tracepoint Probes Samples"); | ||||
							
								
								
									
										53
									
								
								samples/tracepoints/tracepoint-sample.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								samples/tracepoints/tracepoint-sample.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | ||||
| /* tracepoint-sample.c
 | ||||
|  * | ||||
|  * Executes a tracepoint when /proc/tracepoint-example is opened. | ||||
|  * | ||||
|  * (C) Copyright 2007 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> | ||||
|  * | ||||
|  * This file is released under the GPLv2. | ||||
|  * See the file COPYING for more details. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/sched.h> | ||||
| #include <linux/proc_fs.h> | ||||
| #include "tp-samples-trace.h" | ||||
| 
 | ||||
| struct proc_dir_entry *pentry_example; | ||||
| 
 | ||||
| static int my_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	trace_subsys_event(inode, file); | ||||
| 	for (i = 0; i < 10; i++) | ||||
| 		trace_subsys_eventb(); | ||||
| 	return -EPERM; | ||||
| } | ||||
| 
 | ||||
| static struct file_operations mark_ops = { | ||||
| 	.open = my_open, | ||||
| }; | ||||
| 
 | ||||
| static int example_init(void) | ||||
| { | ||||
| 	printk(KERN_ALERT "example init\n"); | ||||
| 	pentry_example = proc_create("tracepoint-example", 0444, NULL, | ||||
| 		&mark_ops); | ||||
| 	if (!pentry_example) | ||||
| 		return -EPERM; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void example_exit(void) | ||||
| { | ||||
| 	printk(KERN_ALERT "example exit\n"); | ||||
| 	remove_proc_entry("tracepoint-example", NULL); | ||||
| } | ||||
| 
 | ||||
| module_init(example_init) | ||||
| module_exit(example_exit) | ||||
| 
 | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_AUTHOR("Mathieu Desnoyers"); | ||||
| MODULE_DESCRIPTION("Tracepoint example"); | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user