From f3be6faa4412880c51061167f24a2d1f0ac48120 Mon Sep 17 00:00:00 2001 From: compudj Date: Mon, 7 Apr 2008 13:53:46 +0000 Subject: [PATCH] update test-mark-speed git-svn-id: http://ltt.polymtl.ca/svn@2838 04897980-b3bd-0310-b5e0-8ef037075253 --- markers-test/Makefile | 23 ++++++ markers-test/test-mark-speed-edit.c | 104 ++++++++++++++++++++++++++++ markers-test/test-mark-speed-opt.c | 103 +++++++++++++++++++++++++++ markers-test/test-mark-speed.c | 103 +++++++++++++++++++++++++++ tests/kernel/Makefile | 5 +- 5 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 markers-test/Makefile create mode 100644 markers-test/test-mark-speed-edit.c create mode 100644 markers-test/test-mark-speed-opt.c create mode 100644 markers-test/test-mark-speed.c diff --git a/markers-test/Makefile b/markers-test/Makefile new file mode 100644 index 00000000..7b599935 --- /dev/null +++ b/markers-test/Makefile @@ -0,0 +1,23 @@ +ifneq ($(KERNELRELEASE),) + obj-m += test-mark-speed.o + obj-m += test-mark-speed-edit.o + obj-m += test-mark-speed-opt.o +else + KERNELDIR ?= /lib/modules/$(shell uname -r)/build + PWD := $(shell pwd) + KERNELRELEASE = $(shell cat $(KERNELDIR)/$(KBUILD_OUTPUT)/include/linux/version.h | sed -n 's/.*UTS_RELEASE.*\"\(.*\)\".*/\1/p') +ifneq ($(INSTALL_MOD_PATH),) + DEPMOD_OPT := -b $(INSTALL_MOD_PATH) +endif + +default: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules + +modules_install: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install + if [ -f $(KERNELDIR)/$(KBUILD_OUTPUT)/System.map ] ; then /sbin/depmod -ae -F $(KERNELDIR)/$(KBUILD_OUTPUT)/System.map $(DEPMOD_OPT) $(KERNELRELEASE) ; fi + + +clean: + $(MAKE) -C $(KERNELDIR) M=$(PWD) clean +endif diff --git a/markers-test/test-mark-speed-edit.c b/markers-test/test-mark-speed-edit.c new file mode 100644 index 00000000..62558917 --- /dev/null +++ b/markers-test/test-mark-speed-edit.c @@ -0,0 +1,104 @@ +/* test-mark.c + * + */ + +#include +#include +#include +#include +#include +#include +static void noinline test2(const struct marker *mdata, + void *call_private, ...) +{ + /* not called */ + printk("blah\n"); +} + +/* + * Generic marker flavor always available. + * Note : the empty asm volatile with read constraint is used here instead of a + * "used" attribute to fix a gcc 4.1.x bug. + * Make sure the alignment of the structure in the __markers section will + * not add unwanted padding between the beginning of the section and the + * structure. Force alignment to the same alignment as the section start. + */ +#define __my_trace_mark(generic, name, call_private, format, args...) \ + do { \ + static const char __mstrtab_##name[] \ + __attribute__((section("__markers_strings"))) \ + = #name "\0" format; \ + static struct marker __mark_##name \ + __attribute__((section("__markers"), aligned(8))) = \ + { __mstrtab_##name, &__mstrtab_##name[sizeof(#name)], \ + 0, 0, marker_probe_cb, \ + { __mark_empty_function, NULL}, NULL }; \ + __mark_check_format(format, ## args); \ + if (!generic) { \ + if (unlikely(imv_read(__mark_##name.state))) \ + test2 \ + (&__mark_##name, call_private, \ + ## args); \ + } else { \ + if (unlikely(_imv_read(__mark_##name.state))) \ + test2 \ + (&__mark_##name, call_private, \ + ## args); \ + } \ + } while (0) + + //asm volatile (""); +struct proc_dir_entry *pentry = NULL; + +static inline void test(unsigned long arg, unsigned long arg2) +{ + //asm volatile (""); + //__my_trace_mark(1, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2); + test2(NULL, NULL, 2, current->pid, arg, arg2); + //__my_trace_mark(0, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2); +} + +static int my_open(struct inode *inode, struct file *file) +{ + unsigned int i; + cycles_t cycles1, cycles2; + unsigned long flags; + + local_irq_save(flags); + rdtsc_barrier(); + cycles1 = get_cycles(); + rdtsc_barrier(); + for(i=0; i<20000; i++) { + test(i, i); + } + rdtsc_barrier(); + cycles2 = get_cycles(); + rdtsc_barrier(); + local_irq_restore(flags); + printk("cycles : %llu\n", cycles2-cycles1); + return -EPERM; +} + + +static struct file_operations my_operations = { + .open = my_open, +}; + +int init_module(void) +{ + pentry = create_proc_entry("testmark", 0444, NULL); + if (pentry) + pentry->proc_fops = &my_operations; + + return 0; +} + +void cleanup_module(void) +{ + remove_proc_entry("testmark", NULL); +} + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mathieu Desnoyers"); +MODULE_DESCRIPTION("Marker Test"); + diff --git a/markers-test/test-mark-speed-opt.c b/markers-test/test-mark-speed-opt.c new file mode 100644 index 00000000..d4098d40 --- /dev/null +++ b/markers-test/test-mark-speed-opt.c @@ -0,0 +1,103 @@ +/* test-mark.c + * + */ + +#include +#include +#include +#include +#include +#include +static void noinline test2(const struct marker *mdata, + void *call_private, ...) +{ + /* not called */ + printk("blah\n"); +} + +/* + * Generic marker flavor always available. + * Note : the empty asm volatile with read constraint is used here instead of a + * "used" attribute to fix a gcc 4.1.x bug. + * Make sure the alignment of the structure in the __markers section will + * not add unwanted padding between the beginning of the section and the + * structure. Force alignment to the same alignment as the section start. + */ +#define __my_trace_mark(generic, name, call_private, format, args...) \ + do { \ + static const char __mstrtab_##name[] \ + __attribute__((section("__markers_strings"))) \ + = #name "\0" format; \ + static struct marker __mark_##name \ + __attribute__((section("__markers"), aligned(8))) = \ + { __mstrtab_##name, &__mstrtab_##name[sizeof(#name)], \ + 0, 0, marker_probe_cb, \ + { __mark_empty_function, NULL}, NULL }; \ + __mark_check_format(format, ## args); \ + if (!generic) { \ + if (unlikely(imv_read(__mark_##name.state))) \ + test2 \ + (&__mark_##name, call_private, \ + ## args); \ + } else { \ + if (unlikely(_imv_read(__mark_##name.state))) \ + test2 \ + (&__mark_##name, call_private, \ + ## args); \ + } \ + } while (0) + + //asm volatile (""); +struct proc_dir_entry *pentry = NULL; + +static inline void test(unsigned long arg, unsigned long arg2) +{ + //asm volatile (""); + //__my_trace_mark(1, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2); + __my_trace_mark(0, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2); +} + +static int my_open(struct inode *inode, struct file *file) +{ + unsigned int i; + cycles_t cycles1, cycles2; + unsigned long flags; + + local_irq_save(flags); + rdtsc_barrier(); + cycles1 = get_cycles(); + rdtsc_barrier(); + for(i=0; i<20000; i++) { + test(i, i); + } + rdtsc_barrier(); + cycles2 = get_cycles(); + rdtsc_barrier(); + local_irq_restore(flags); + printk("cycles : %llu\n", cycles2-cycles1); + return -EPERM; +} + + +static struct file_operations my_operations = { + .open = my_open, +}; + +int init_module(void) +{ + pentry = create_proc_entry("testmark", 0444, NULL); + if (pentry) + pentry->proc_fops = &my_operations; + + return 0; +} + +void cleanup_module(void) +{ + remove_proc_entry("testmark", NULL); +} + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mathieu Desnoyers"); +MODULE_DESCRIPTION("Marker Test"); + diff --git a/markers-test/test-mark-speed.c b/markers-test/test-mark-speed.c new file mode 100644 index 00000000..c3c5bc17 --- /dev/null +++ b/markers-test/test-mark-speed.c @@ -0,0 +1,103 @@ +/* test-mark.c + * + */ + +#include +#include +#include +#include +#include +#include +static void noinline test2(const struct marker *mdata, + void *call_private, ...) +{ + /* not called */ + printk("blah\n"); +} + +/* + * Generic marker flavor always available. + * Note : the empty asm volatile with read constraint is used here instead of a + * "used" attribute to fix a gcc 4.1.x bug. + * Make sure the alignment of the structure in the __markers section will + * not add unwanted padding between the beginning of the section and the + * structure. Force alignment to the same alignment as the section start. + */ +#define __my_trace_mark(generic, name, call_private, format, args...) \ + do { \ + static const char __mstrtab_##name[] \ + __attribute__((section("__markers_strings"))) \ + = #name "\0" format; \ + static struct marker __mark_##name \ + __attribute__((section("__markers"), aligned(8))) = \ + { __mstrtab_##name, &__mstrtab_##name[sizeof(#name)], \ + 0, 0, marker_probe_cb, \ + { __mark_empty_function, NULL}, NULL }; \ + __mark_check_format(format, ## args); \ + if (!generic) { \ + if (unlikely(imv_read(__mark_##name.state))) \ + test2 \ + (&__mark_##name, call_private, \ + ## args); \ + } else { \ + if (unlikely(_imv_read(__mark_##name.state))) \ + test2 \ + (&__mark_##name, call_private, \ + ## args); \ + } \ + } while (0) + + //asm volatile (""); +struct proc_dir_entry *pentry = NULL; + +static inline void test(unsigned long arg, unsigned long arg2) +{ + //asm volatile (""); + __my_trace_mark(1, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2); + //__my_trace_mark(0, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2); +} + +static int my_open(struct inode *inode, struct file *file) +{ + unsigned int i; + cycles_t cycles1, cycles2; + unsigned long flags; + + local_irq_save(flags); + rdtsc_barrier(); + cycles1 = get_cycles(); + rdtsc_barrier(); + for(i=0; i<20000; i++) { + test(i, i); + } + rdtsc_barrier(); + cycles2 = get_cycles(); + rdtsc_barrier(); + local_irq_restore(flags); + printk("cycles : %llu\n", cycles2-cycles1); + return -EPERM; +} + + +static struct file_operations my_operations = { + .open = my_open, +}; + +int init_module(void) +{ + pentry = create_proc_entry("testmark", 0444, NULL); + if (pentry) + pentry->proc_fops = &my_operations; + + return 0; +} + +void cleanup_module(void) +{ + remove_proc_entry("testmark", NULL); +} + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mathieu Desnoyers"); +MODULE_DESCRIPTION("Marker Test"); + diff --git a/tests/kernel/Makefile b/tests/kernel/Makefile index 7e01551c..e747fe8f 100644 --- a/tests/kernel/Makefile +++ b/tests/kernel/Makefile @@ -12,9 +12,12 @@ ifneq ($(CONFIG_LTT),) #obj-m += ltt-probe-tests.o #obj-m += test-time-probe3.o endif - obj-m += test-sys_call.o + #obj-m += test-sys_call.o # obj-m += test-bug.o obj-m += test-mark-speed.o + obj-m += test-mark-speed-edit.o + obj-m += test-mark-speed-opt.o +# obj-m += toggle-tester.o #obj-m += test-slub.o #obj-m += test-slub2.o #obj-m += test-showval.o -- 2.34.1