From: compudj Date: Thu, 21 May 2009 18:50:22 +0000 (+0000) Subject: update test module X-Git-Tag: v0.12.20~100 X-Git-Url: http://git.liburcu.org/?a=commitdiff_plain;h=f7d26a17e6b5b50aff4bf49e583566bbfd18e056;p=lttv.git update test module git-svn-id: http://ltt.polymtl.ca/svn@3389 04897980-b3bd-0310-b5e0-8ef037075253 --- diff --git a/trunk/tests/kernel/Makefile b/trunk/tests/kernel/Makefile index eada47ca..adcc35c5 100644 --- a/trunk/tests/kernel/Makefile +++ b/trunk/tests/kernel/Makefile @@ -26,7 +26,7 @@ endif #obj-m += test-psrwlock.o obj-m += test-cmpxchg-nolock2.o # obj-m += test-trace-speed.o - obj-m += test-rcu-speed.o + obj-m += test-read-lock-speed.o # obj-m += test-fct-speed.o # obj-m += test-int3-speed.o # obj-m += test-kprobes2.o diff --git a/trunk/tests/kernel/test-rcu-speed.c b/trunk/tests/kernel/test-rcu-speed.c deleted file mode 100644 index 49930b9a..00000000 --- a/trunk/tests/kernel/test-rcu-speed.c +++ /dev/null @@ -1,180 +0,0 @@ -/* test-rcu-speed.c - * - * Compare speed of : - * - spin lock irqsave/ spin unlock irqrestore - * - using a sequence read lock (uncontended) - * - preempt disable/enable - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NR_LOOPS 20000 - -#ifndef CONFIG_PREEMPT -#error "Your kernel should be build with preemption enabled" -#endif - -#ifdef CONFIG_DEBUG_PREEMPT -#error "Please disable CONFIG_DEBUG_PREEMPT" -#endif - -#ifdef CONFIG_DEBUG_SPINLOCK -#error "Please disable CONFIG_DEBUG_SPINLOCK" -#endif - -#ifdef CONFIG_LOCKDEP -#error "Please disable CONFIG_LOCKDEP" -#endif - -int test_val; - -static void do_testbaseline(void) -{ - unsigned long flags; - unsigned int i; - cycles_t time1, time2, time; - u32 rem; - - local_irq_save(flags); - preempt_disable(); - time1 = get_cycles(); - for (i = 0; i < NR_LOOPS; i++) { - asm volatile (""); - } - time2 = get_cycles(); - local_irq_restore(flags); - preempt_enable(); - time = time2 - time1; - - printk(KERN_ALERT "test results: time for baseline\n"); - printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); - printk(KERN_ALERT "total time: %llu\n", time); - time = div_u64_rem(time, NR_LOOPS, &rem); - printk(KERN_ALERT "-> baseline takes %llu cycles\n", time); - printk(KERN_ALERT "test end\n"); -} - -static void do_test_spinlock(void) -{ - static DEFINE_SPINLOCK(mylock); - unsigned long flags; - unsigned int i; - cycles_t time1, time2, time; - u32 rem; - - preempt_disable(); - spin_lock_irqsave(&mylock, flags); - time1 = get_cycles(); - for (i = 0; i < NR_LOOPS; i++) { - spin_unlock(&mylock); - spin_lock(&mylock); - } - time2 = get_cycles(); - spin_unlock_irqrestore(&mylock, flags); - preempt_enable(); - time = time2 - time1; - - printk(KERN_ALERT "test results: time for spinlock\n"); - printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); - printk(KERN_ALERT "total time: %llu\n", time); - time = div_u64_rem(time, NR_LOOPS, &rem); - printk(KERN_ALERT "-> spinlock takes %llu cycles\n", time); - printk(KERN_ALERT "test end\n"); -} - -static void do_test_seqlock(void) -{ - static seqlock_t test_lock; - unsigned long seq; - unsigned long flags; - unsigned int i; - cycles_t time1, time2, time; - u32 rem; - - local_irq_save(flags); - time1 = get_cycles(); - for (i = 0; i < NR_LOOPS; i++) { - do { - seq = read_seqbegin(&test_lock); - } while (read_seqretry(&test_lock, seq)); - } - time2 = get_cycles(); - time = time2 - time1; - local_irq_restore(flags); - - printk(KERN_ALERT "test results: time for seqlock\n"); - printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); - printk(KERN_ALERT "total time: %llu\n", time); - time = div_u64_rem(time, NR_LOOPS, &rem); - printk(KERN_ALERT "-> seqlock takes %llu cycles\n", time); - printk(KERN_ALERT "test end\n"); -} - -/* - * Note : This test _should_ trigger lockdep errors due to preemption - * disabling/enabling within irq off section. Given we are only interested in - * having the most precise measurement for preemption disable/enable, we don't - * care about this. - */ -static void do_test_preempt(void) -{ - unsigned long flags; - unsigned int i; - cycles_t time1, time2, time; - u32 rem; - - local_irq_save(flags); - preempt_disable(); - time1 = get_cycles(); - for (i = 0; i < NR_LOOPS; i++) { - preempt_disable(); - preempt_enable(); - } - time2 = get_cycles(); - preempt_enable(); - time = time2 - time1; - local_irq_restore(flags); - - printk(KERN_ALERT "test results: time for preempt disable/enable pairs\n"); - printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); - printk(KERN_ALERT "total time: %llu\n", time); - time = div_u64_rem(time, NR_LOOPS, &rem); - printk(KERN_ALERT "-> preempt disable/enable pair takes %llu cycles\n", - time); - printk(KERN_ALERT "test end\n"); -} - -static int ltt_test_init(void) -{ - printk(KERN_ALERT "test init\n"); - - printk(KERN_ALERT "Number of active CPUs : %d\n", num_online_cpus()); - do_testbaseline(); - do_test_spinlock(); - do_test_seqlock(); - do_test_preempt(); - return -EAGAIN; /* Fail will directly unload the module */ -} - -static void ltt_test_exit(void) -{ - printk(KERN_ALERT "test exit\n"); -} - -module_init(ltt_test_init) -module_exit(ltt_test_exit) - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Mathieu Desnoyers"); -MODULE_DESCRIPTION("Cmpxchg vs int Test"); - diff --git a/trunk/tests/kernel/test-read-lock-speed.c b/trunk/tests/kernel/test-read-lock-speed.c new file mode 100644 index 00000000..62d60463 --- /dev/null +++ b/trunk/tests/kernel/test-read-lock-speed.c @@ -0,0 +1,184 @@ +/* + * test-read-lock-speed.c + * + * Compare speed of : + * - spin lock irqsave / spin unlock irqrestore (close to rwlocks when + * uncontended) + * - using a sequence read lock (uncontended) + * - preempt disable/enable (RCU) + * + * Copyright 2009 - Mathieu Desnoyers + * Distributed under GPLv2 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NR_LOOPS 20000 + +#ifndef CONFIG_PREEMPT +#error "Your kernel should be build with preemption enabled" +#endif + +#ifdef CONFIG_DEBUG_PREEMPT +#error "Please disable CONFIG_DEBUG_PREEMPT" +#endif + +#ifdef CONFIG_DEBUG_SPINLOCK +#error "Please disable CONFIG_DEBUG_SPINLOCK" +#endif + +#ifdef CONFIG_LOCKDEP +#error "Please disable CONFIG_LOCKDEP" +#endif + +int test_val; + +static void do_testbaseline(void) +{ + unsigned long flags; + unsigned int i; + cycles_t time1, time2, time; + u32 rem; + + local_irq_save(flags); + preempt_disable(); + time1 = get_cycles(); + for (i = 0; i < NR_LOOPS; i++) { + asm volatile (""); + } + time2 = get_cycles(); + local_irq_restore(flags); + preempt_enable(); + time = time2 - time1; + + printk(KERN_ALERT "test results: time for baseline\n"); + printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); + printk(KERN_ALERT "total time: %llu\n", time); + time = div_u64_rem(time, NR_LOOPS, &rem); + printk(KERN_ALERT "-> baseline takes %llu cycles\n", time); + printk(KERN_ALERT "test end\n"); +} + +static void do_test_spinlock(void) +{ + static DEFINE_SPINLOCK(mylock); + unsigned long flags; + unsigned int i; + cycles_t time1, time2, time; + u32 rem; + + preempt_disable(); + spin_lock_irqsave(&mylock, flags); + time1 = get_cycles(); + for (i = 0; i < NR_LOOPS; i++) { + spin_unlock(&mylock); + spin_lock(&mylock); + } + time2 = get_cycles(); + spin_unlock_irqrestore(&mylock, flags); + preempt_enable(); + time = time2 - time1; + + printk(KERN_ALERT "test results: time for spinlock\n"); + printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); + printk(KERN_ALERT "total time: %llu\n", time); + time = div_u64_rem(time, NR_LOOPS, &rem); + printk(KERN_ALERT "-> spinlock takes %llu cycles\n", time); + printk(KERN_ALERT "test end\n"); +} + +static void do_test_seqlock(void) +{ + static seqlock_t test_lock; + unsigned long seq; + unsigned long flags; + unsigned int i; + cycles_t time1, time2, time; + u32 rem; + + local_irq_save(flags); + time1 = get_cycles(); + for (i = 0; i < NR_LOOPS; i++) { + do { + seq = read_seqbegin(&test_lock); + } while (read_seqretry(&test_lock, seq)); + } + time2 = get_cycles(); + time = time2 - time1; + local_irq_restore(flags); + + printk(KERN_ALERT "test results: time for seqlock\n"); + printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); + printk(KERN_ALERT "total time: %llu\n", time); + time = div_u64_rem(time, NR_LOOPS, &rem); + printk(KERN_ALERT "-> seqlock takes %llu cycles\n", time); + printk(KERN_ALERT "test end\n"); +} + +/* + * Note : This test _should_ trigger lockdep errors due to preemption + * disabling/enabling within irq off section. Given we are only interested in + * having the most precise measurement for preemption disable/enable, we don't + * care about this. + */ +static void do_test_preempt(void) +{ + unsigned long flags; + unsigned int i; + cycles_t time1, time2, time; + u32 rem; + + local_irq_save(flags); + preempt_disable(); + time1 = get_cycles(); + for (i = 0; i < NR_LOOPS; i++) { + preempt_disable(); + preempt_enable(); + } + time2 = get_cycles(); + preempt_enable(); + time = time2 - time1; + local_irq_restore(flags); + + printk(KERN_ALERT + "test results: time for preempt disable/enable pairs\n"); + printk(KERN_ALERT "number of loops: %d\n", NR_LOOPS); + printk(KERN_ALERT "total time: %llu\n", time); + time = div_u64_rem(time, NR_LOOPS, &rem); + printk(KERN_ALERT "-> preempt disable/enable pair takes %llu cycles\n", + time); + printk(KERN_ALERT "test end\n"); +} + +static int ltt_test_init(void) +{ + printk(KERN_ALERT "test init\n"); + + printk(KERN_ALERT "Number of active CPUs : %d\n", num_online_cpus()); + do_testbaseline(); + do_test_spinlock(); + do_test_seqlock(); + do_test_preempt(); + return -EAGAIN; /* Fail will directly unload the module */ +} + +static void ltt_test_exit(void) +{ + printk(KERN_ALERT "test exit\n"); +} + +module_init(ltt_test_init) +module_exit(ltt_test_exit) + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mathieu Desnoyers"); +MODULE_DESCRIPTION("Test read lock speed");