linux/samples/markers/probe-example.c
<<
>>
Prefs
   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");
  92
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.