From: compudj Date: Mon, 7 Apr 2008 20:16:45 +0000 (+0000) Subject: update X-Git-Tag: v0.12.20~641 X-Git-Url: http://git.lttng.org/?a=commitdiff_plain;h=727779461101f040206ba81ec8adda5c1440a871;p=lttv.git update git-svn-id: http://ltt.polymtl.ca/svn@2848 04897980-b3bd-0310-b5e0-8ef037075253 --- diff --git a/markers-test/Makefile b/markers-test/Makefile index a727d022..4499bb27 100644 --- a/markers-test/Makefile +++ b/markers-test/Makefile @@ -3,6 +3,7 @@ ifneq ($(KERNELRELEASE),) obj-m += test-mark-speed-empty.o obj-m += test-mark-speed-edit.o obj-m += test-mark-speed-opt.o + obj-m += test-mark-speed-local.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) diff --git a/markers-test/runtest.sh b/markers-test/runtest.sh index 6381cc14..f8ee3b42 100644 --- a/markers-test/runtest.sh +++ b/markers-test/runtest.sh @@ -29,6 +29,14 @@ for a in `seq 1 $ITER`; do cat /proc/testmark;done rmmod test-mark-speed-edit RESNOP=`dmesg |tail -n 10 |sed 's/^\[.*\] //'| sed 's/cycles : \(.*\)$/\1/'` +insmod test-mark-speed-local.ko +#Patch with nops +cat /proc/testmark + +for a in `seq 1 $ITER`; do cat /proc/testmark;done +rmmod test-mark-speed-local +RESNOPLOCAL=`dmesg |tail -n 10 |sed 's/^\[.*\] //'| sed 's/cycles : \(.*\)$/\1/'` + make clean make EXTRA_CFLAGS=-DCACHEFLUSH @@ -56,6 +64,14 @@ for a in `seq 1 $ITER`; do cat /proc/testmark;done rmmod test-mark-speed-edit RESNOPFL=`dmesg |tail -n 10 |sed 's/^\[.*\] //'| sed 's/cycles : \(.*\)$/\1/'` +insmod test-mark-speed-local.ko +#Patch with nops +cat /proc/testmark + +for a in `seq 1 $ITER`; do cat /proc/testmark;done +rmmod test-mark-speed-local +RESNOPLOCALFL=`dmesg |tail -n 10 |sed 's/^\[.*\] //'| sed 's/cycles : \(.*\)$/\1/'` + @@ -101,16 +117,27 @@ RESOPTFL=`echo $SUM/$ITER/$LOOPS - $RESEMPFL | bc -l /dev/stdin` echo $RESOPTFL -echo "Added cycles for NOP replacement of function call (cached)" +echo "Added cycles for NOP replacement of function call (cached) (1 pointer read, 5 local vars)" SUM="0" for a in $RESNOP; do SUM=$[$SUM + $a]; done RESNOP=`echo $SUM/$ITER/$LOOPS - $RESEMP | bc -l /dev/stdin` echo $RESNOP -echo "Added cycles for NOP replacement of function call (uncached)" +echo "Added cycles for NOP replacement of function call (uncached) (1 pointer read, 5 local vars)" SUM="0" for a in $RESNOPFL; do SUM=$[$SUM + $a]; done RESNOPFL=`echo $SUM/$ITER/$LOOPS - $RESEMPFL | bc -l /dev/stdin` echo $RESNOPFL +echo "Added cycles for NOP replacement of function call (cached) (6 local vars)" +SUM="0" +for a in $RESNOPLOCAL; do SUM=$[$SUM + $a]; done +RESNOPLOCAL=`echo $SUM/$ITER/$LOOPS - $RESEMP | bc -l /dev/stdin` +echo $RESNOPLOCAL + +echo "Added cycles for NOP replacement of function call (uncached) (6 local vars)" +SUM="0" +for a in $RESNOPLOCALFL; do SUM=$[$SUM + $a]; done +RESNOPLOCALFL=`echo $SUM/$ITER/$LOOPS - $RESEMPFL | bc -l /dev/stdin` +echo $RESNOPLOCALFL diff --git a/markers-test/test-mark-speed-local.c b/markers-test/test-mark-speed-local.c new file mode 100644 index 00000000..254d882f --- /dev/null +++ b/markers-test/test-mark-speed-local.c @@ -0,0 +1,120 @@ +/* test-mark.c + * + */ + +#include +#include +#include +#include +#include +#include +#include + +static void noinline test2(const struct marker *mdata, + void *call_private, ...) +{ + unsigned char *ins = __builtin_return_address(0) - 5; +#if 0 + /* not called */ + printk("ip %p\n", __builtin_return_address(0)); + printk("prev_ins %hX %hX %hX %hX %hX\n", + ins[0], ins[1], ins[2], ins[3], ins[4]); +#endif //0 + ins[0] = 0x90; + ins[1] = 0x8d; + ins[2] = 0x74; + ins[3] = 0x26; + ins[4] = 0x00; +} + +/* + * 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) +{ +#ifdef CACHEFLUSH + wbinvd(); +#endif + //asm volatile (""); + //__my_trace_mark(1, kernel_debug_test, NULL, "%d %d %ld %ld", 2, current->pid, arg, arg2); + test2(NULL, NULL, 2, 10, 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<2000; 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"); +MODULE_VERSION("1.0"); +