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 17struct probe_data { 18 const char *name; 19 const char *format; 20 marker_probe_func *probe_func; 21}; 22 23void probe_subsystem_event(const struct marker *mdata, void *private, 24 const char *format, ...) 25{ 26 va_list ap; 27 /* Declare args */ 28 unsigned int value; 29 const char *mystr; 30 31 /* Assign args */ 32 va_start(ap, format); 33 value = va_arg(ap, typeof(value)); 34 mystr = va_arg(ap, typeof(mystr)); 35 36 /* Call printk */ 37 printk(KERN_DEBUG "Value %u, string %s\n", value, mystr); 38 39 /* or count, check rights, serialize data in a buffer */ 40 41 va_end(ap); 42} 43 44atomic_t eventb_count = ATOMIC_INIT(0); 45 46void probe_subsystem_eventb(const struct marker *mdata, void *private, 47 const char *format, ...) 48{ 49 /* Increment counter */ 50 atomic_inc(&eventb_count); 51} 52 53static struct probe_data probe_array[] = 54{ 55 { .name = "subsystem_event", 56 .format = "integer %d string %s", 57 .probe_func = probe_subsystem_event }, 58 { .name = "subsystem_eventb", 59 .format = MARK_NOARGS, 60 .probe_func = probe_subsystem_eventb }, 61}; 62 63static int __init probe_init(void) 64{ 65 int result; 66 int i; 67 68 for (i = 0; i < ARRAY_SIZE(probe_array); i++) { 69 result = marker_probe_register(probe_array[i].name, 70 probe_array[i].format, 71 probe_array[i].probe_func, &probe_array[i]); 72 if (result) 73 printk(KERN_INFO "Unable to register probe %s\n", 74 probe_array[i].name); 75 result = marker_arm(probe_array[i].name); 76 if (result) 77 printk(KERN_INFO "Unable to arm probe %s\n", 78 probe_array[i].name); 79 } 80 return 0; 81} 82 83static void __exit probe_fini(void) 84{ 85 int i; 86 87 for (i = 0; i < ARRAY_SIZE(probe_array); i++) 88 marker_probe_unregister(probe_array[i].name); 89 printk(KERN_INFO "Number of event b : %u\n", 90 atomic_read(&eventb_count)); 91} 92 93module_init(probe_init); 94module_exit(probe_fini); 95 96MODULE_LICENSE("GPL"); 97MODULE_AUTHOR("Mathieu Desnoyers"); 98MODULE_DESCRIPTION("SUBSYSTEM Probe");