diff options
author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2011-03-16 19:04:29 -0400 |
---|---|---|
committer | Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> | 2011-03-16 19:04:29 -0400 |
commit | fa1cc6aa284a3bae836b009e3816619852672834 (patch) | |
tree | c274c98ffc3646e5024dd4a28949b3bb421936ef /samples | |
parent | 4224a05e8598970a6455729ccc7dc02dbda4c6ee (diff) |
lttng-instrumentation/markers-multi-probes-test
Markers : multi-probes test
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Diffstat (limited to 'samples')
-rw-r--r-- | samples/markers/Makefile | 2 | ||||
-rw-r--r-- | samples/markers/test-multi.c | 116 |
2 files changed, 117 insertions, 1 deletions
diff --git a/samples/markers/Makefile b/samples/markers/Makefile index 6d7231265f0..2244152159d 100644 --- a/samples/markers/Makefile +++ b/samples/markers/Makefile @@ -1,4 +1,4 @@ # builds the kprobes example kernel modules; # then to use one (as root): insmod <module_name.ko> -obj-$(CONFIG_SAMPLE_MARKERS) += probe-example.o marker-example.o +obj-$(CONFIG_SAMPLE_MARKERS) += probe-example.o marker-example.o test-multi.o diff --git a/samples/markers/test-multi.c b/samples/markers/test-multi.c new file mode 100644 index 00000000000..98fb03cfd93 --- /dev/null +++ b/samples/markers/test-multi.c @@ -0,0 +1,116 @@ +/* test-multi.c + * + * Connects multiple callbacks. + * + * (C) Copyright 2007 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> + * + * This file is released under the GPLv2. + * See the file COPYING for more details. + */ + +#include <linux/sched.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/marker.h> +#include <asm/atomic.h> + +struct probe_data { + const char *name; + const char *format; + marker_probe_func *probe_func; +}; + +atomic_t eventb_count = ATOMIC_INIT(0); + +void probe_subsystem_eventa(void *probe_data, void *call_data, + const char *format, va_list *args) +{ + /* Increment counter */ + atomic_inc(&eventb_count); +} + +void probe_subsystem_eventb(void *probe_data, void *call_data, + const char *format, va_list *args) +{ + /* Increment counter */ + atomic_inc(&eventb_count); +} + +void probe_subsystem_eventc(void *probe_data, void *call_data, + const char *format, va_list *args) +{ + /* Increment counter */ + atomic_inc(&eventb_count); +} + +void probe_subsystem_eventd(void *probe_data, void *call_data, + const char *format, va_list *args) +{ + /* Increment counter */ + atomic_inc(&eventb_count); +} + +static struct probe_data probe_array[] = +{ + { .name = "test_multi", + .format = MARK_NOARGS, + .probe_func = (marker_probe_func*)0xa }, + { .name = "test_multi", + .format = MARK_NOARGS, + .probe_func = (marker_probe_func*)0xb }, + { .name = "test_multi", + .format = MARK_NOARGS, + .probe_func = (marker_probe_func*)0xc }, + { .name = "test_multi", + .format = MARK_NOARGS, + .probe_func = (marker_probe_func*)0xd }, + { .name = "test_multi", + .format = MARK_NOARGS, + .probe_func = (marker_probe_func*)0x10 }, + { .name = "test_multi", + .format = MARK_NOARGS, + .probe_func = (marker_probe_func*)0x20 }, + { .name = "test_multi", + .format = MARK_NOARGS, + .probe_func = (marker_probe_func*)0x30 }, +}; + +static int __init probe_init(void) +{ + int result; + int i; + + for (i = 0; i < ARRAY_SIZE(probe_array); i++) { + result = marker_probe_register(probe_array[i].name, + probe_array[i].format, + probe_array[i].probe_func, (void*)(long)i); + if (result) + printk(KERN_INFO "Unable to register probe %s\n", + probe_array[i].name); + } + return 0; +} + +static void __exit probe_fini(void) +{ + int result; + int i; + + for (i = 0; i < ARRAY_SIZE(probe_array); i++) { + result = marker_probe_unregister(probe_array[i].name, + probe_array[i].probe_func, (void*)(long)i); + if (result) + printk(KERN_INFO "Unable to unregister probe %s\n", + probe_array[i].name); + } + printk(KERN_INFO "Number of event b : %u\n", + atomic_read(&eventb_count)); + marker_synchronize_unregister(); +} + +module_init(probe_init); +module_exit(probe_fini); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mathieu Desnoyers"); +MODULE_DESCRIPTION("SUBSYSTEM Probe"); |