at v2.6.27 2.1 kB view raw
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(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 40atomic_t eventb_count = ATOMIC_INIT(0); 41 42void 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 49static 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 59static 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 75static 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} 85 86module_init(probe_init); 87module_exit(probe_fini); 88 89MODULE_LICENSE("GPL"); 90MODULE_AUTHOR("Mathieu Desnoyers"); 91MODULE_DESCRIPTION("SUBSYSTEM Probe");