update tests
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 21 May 2009 15:10:38 +0000 (15:10 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 21 May 2009 15:10:38 +0000 (15:10 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@3387 04897980-b3bd-0310-b5e0-8ef037075253

trunk/tests/kernel/Makefile
trunk/tests/kernel/test-rcu-speed.c

index 22cff93e045b00c19d731cbacc8d2798ac6cf547..eada47cae7b0f94ebbf7fb052fd85e46924d6068 100644 (file)
@@ -14,9 +14,9 @@ ifneq ($(CONFIG_LTT),)
 endif
        #obj-m += test-sys_call.o
 #      obj-m += test-bug.o
-       obj-m += genkprobe.o
-       obj-m += test-lttng-tp.o
-       obj-m += test-trace.o
+#      obj-m += genkprobe.o
+#      obj-m += test-lttng-tp.o
+#      obj-m += test-trace.o
        #obj-m += test-tsc-sync2.o
        #obj-m += test-63.o
        #obj-m += test-nop-speed.o
@@ -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-rcu-speed.o
 #      obj-m += test-fct-speed.o
 #      obj-m += test-int3-speed.o
 #      obj-m += test-kprobes2.o
index 15fbe7029c3f08874e786c64d95d7b94a52ef3b4..49930b9a84a71dfeb39efff78859deb8eb193005 100644 (file)
@@ -1,6 +1,9 @@
-/* test-cmpxchg-nolock.c
+/* test-rcu-speed.c
  *
- * Compare local cmpxchg with irq disable / enable.
+ * Compare speed of :
+ * - spin lock irqsave/ spin unlock irqrestore
+ * - using a sequence read lock (uncontended)
+ * - preempt disable/enable
  */
 
 
 #include <linux/compiler.h>
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/calc64.h>
+#include <linux/math64.h>
 #include <linux/spinlock.h>
 #include <linux/seqlock.h>
+#include <linux/cpumask.h>
 #include <asm/timex.h>
 #include <asm/system.h>
 
 #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)
 {
-       long flags;
+       unsigned long flags;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        local_irq_save(flags);
        preempt_disable();
@@ -39,7 +59,7 @@ static void do_testbaseline(void)
        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);
+       time = div_u64_rem(time, NR_LOOPS, &rem);
        printk(KERN_ALERT "-> baseline takes %llu cycles\n", time);
        printk(KERN_ALERT "test end\n");
 }
@@ -47,10 +67,10 @@ static void do_testbaseline(void)
 static void do_test_spinlock(void)
 {
        static DEFINE_SPINLOCK(mylock);
-       long flags;
+       unsigned long flags;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        preempt_disable();
        spin_lock_irqsave(&mylock, flags);
@@ -67,7 +87,7 @@ static void do_test_spinlock(void)
        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);
+       time = div_u64_rem(time, NR_LOOPS, &rem);
        printk(KERN_ALERT "-> spinlock takes %llu cycles\n", time);
        printk(KERN_ALERT "test end\n");
 }
@@ -76,13 +96,12 @@ static void do_test_seqlock(void)
 {
        static seqlock_t test_lock;
        unsigned long seq;
-       long flags;
+       unsigned long flags;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        local_irq_save(flags);
-       preempt_disable();
        time1 = get_cycles();
        for (i = 0; i < NR_LOOPS; i++) {
                do {
@@ -90,27 +109,29 @@ static void do_test_seqlock(void)
                } 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);
+       time = div_u64_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.
+ * 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)
 {
-       long flags;
+       unsigned long flags;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        local_irq_save(flags);
        preempt_disable();
@@ -127,7 +148,7 @@ static void do_test_preempt(void)
        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);
+       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");
@@ -137,6 +158,7 @@ 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();
This page took 0.032844 seconds and 4 git commands to generate.