From 3343768efd109915cad0a904a208535cef49480b Mon Sep 17 00:00:00 2001 From: compudj Date: Thu, 8 May 2008 09:36:48 +0000 Subject: [PATCH] update rcu git-svn-id: http://ltt.polymtl.ca/svn@2901 04897980-b3bd-0310-b5e0-8ef037075253 --- tests/kernel/Makefile | 2 + tests/kernel/test-rcu-speed.c | 158 ++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 tests/kernel/test-rcu-speed.c diff --git a/tests/kernel/Makefile b/tests/kernel/Makefile index c9732c10..a7a7d5bc 100644 --- a/tests/kernel/Makefile +++ b/tests/kernel/Makefile @@ -16,7 +16,9 @@ endif # obj-m += test-bug.o obj-m += test-cmpxchg-nolock2.o obj-m += test-trace-speed.o + obj-m += test-rcu-speed.o obj-m += test-fct-speed.o + obj-m += test-kprobes2.o #obj-m += test-mark-speed.o #obj-m += test-mark-speed-edit.o #obj-m += test-mark-speed-opt.o diff --git a/tests/kernel/test-rcu-speed.c b/tests/kernel/test-rcu-speed.c new file mode 100644 index 00000000..827b2ceb --- /dev/null +++ b/tests/kernel/test-rcu-speed.c @@ -0,0 +1,158 @@ +/* test-cmpxchg-nolock.c + * + * Compare local cmpxchg with irq disable / enable. + */ + + +#include +#include +#include +#include +#include +#include +#include + +#define NR_LOOPS 20000 + +int test_val; + +static void do_testbaseline(void) +{ + int ret; + long flags; + unsigned int i; + cycles_t time1, time2, time; + long 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_long_long_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; + int ret; + long flags; + unsigned int i; + cycles_t time1, time2, time; + long rem; + + preempt_disable(); + spin_lock_irqsave(flags); + time1 = get_cycles(); + for (i = 0; i < NR_LOOPS; i++) { + spin_unlock_irqrestore(flags); + spin_lock_irqsave(flags); + } + time2 = get_cycles(); + spin_unlock_irqrestore(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_long_long_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; + int ret; + long flags; + unsigned int i; + cycles_t time1, time2, time; + long rem; + + local_irq_save(flags); + preempt_disable(); + 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(); + preempt_enable(); + 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_long_long_rem(time, NR_LOOPS, &rem); + printk(KERN_ALERT "-> seqlock takes %llu cycles\n", time); + printk(KERN_ALERT "test end\n"); +} + +/* + * This test will have a higher standard deviation due to incoming interrupts. + */ +static void do_test_preempt(void) +{ + long flags; + unsigned int i; + cycles_t time1, time2, time; + long rem; + + local_irq_save(flags); + preempt_disable(); + time1 = get_cycles(); + for (i = 0; i < NR_LOOPS; i++) { + preempt_enable(); + preempt_disable(); + } + 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_long_long_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"); + + 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"); + -- 2.34.1