probe-example.c 2.2 KB

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