• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* probe-example.c
2  *
3  * Connects two functions to marker call sites.
4  *
5  * (C) Copyright 2007 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
6  *
7  * This file is released under the GPLv2.
8  * See the file COPYING for more details.
9  */
10 
11 #include <linux/sched.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/marker.h>
15 #include <asm/atomic.h>
16 
17 struct probe_data {
18 	const char *name;
19 	const char *format;
20 	marker_probe_func *probe_func;
21 };
22 
probe_subsystem_event(void * probe_data,void * call_data,const char * format,va_list * args)23 void probe_subsystem_event(void *probe_data, void *call_data,
24 	const char *format, va_list *args)
25 {
26 	/* Declare args */
27 	unsigned int value;
28 	const char *mystr;
29 
30 	/* Assign args */
31 	value = va_arg(*args, typeof(value));
32 	mystr = va_arg(*args, typeof(mystr));
33 
34 	/* Call printk */
35 	printk(KERN_INFO "Value %u, string %s\n", value, mystr);
36 
37 	/* or count, check rights, serialize data in a buffer */
38 }
39 
40 atomic_t eventb_count = ATOMIC_INIT(0);
41 
probe_subsystem_eventb(void * probe_data,void * call_data,const char * format,va_list * args)42 void probe_subsystem_eventb(void *probe_data, void *call_data,
43 	const char *format, va_list *args)
44 {
45 	/* Increment counter */
46 	atomic_inc(&eventb_count);
47 }
48 
49 static struct probe_data probe_array[] =
50 {
51 	{	.name = "subsystem_event",
52 		.format = "integer %d string %s",
53 		.probe_func = probe_subsystem_event },
54 	{	.name = "subsystem_eventb",
55 		.format = MARK_NOARGS,
56 		.probe_func = probe_subsystem_eventb },
57 };
58 
probe_init(void)59 static int __init probe_init(void)
60 {
61 	int result;
62 	int i;
63 
64 	for (i = 0; i < ARRAY_SIZE(probe_array); i++) {
65 		result = marker_probe_register(probe_array[i].name,
66 				probe_array[i].format,
67 				probe_array[i].probe_func, &probe_array[i]);
68 		if (result)
69 			printk(KERN_INFO "Unable to register probe %s\n",
70 				probe_array[i].name);
71 	}
72 	return 0;
73 }
74 
probe_fini(void)75 static void __exit probe_fini(void)
76 {
77 	int i;
78 
79 	for (i = 0; i < ARRAY_SIZE(probe_array); i++)
80 		marker_probe_unregister(probe_array[i].name,
81 			probe_array[i].probe_func, &probe_array[i]);
82 	printk(KERN_INFO "Number of event b : %u\n",
83 			atomic_read(&eventb_count));
84 	marker_synchronize_unregister();
85 }
86 
87 module_init(probe_init);
88 module_exit(probe_fini);
89 
90 MODULE_LICENSE("GPL");
91 MODULE_AUTHOR("Mathieu Desnoyers");
92 MODULE_DESCRIPTION("SUBSYSTEM Probe");
93