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(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");
  99
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.