update rcu
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 8 May 2008 09:36:48 +0000 (09:36 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 8 May 2008 09:36:48 +0000 (09:36 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@2901 04897980-b3bd-0310-b5e0-8ef037075253

tests/kernel/Makefile
tests/kernel/test-rcu-speed.c [new file with mode: 0644]

index c9732c10930f00ce5c1ea78383ff9f1c82e25c13..a7a7d5bcebab5bf4f8ab4e833b870e66bf29444c 100644 (file)
@@ -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 (file)
index 0000000..827b2ce
--- /dev/null
@@ -0,0 +1,158 @@
+/* test-cmpxchg-nolock.c
+ *
+ * Compare local cmpxchg with irq disable / enable.
+ */
+
+
+#include <linux/jiffies.h>
+#include <linux/compiler.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/calc64.h>
+#include <asm/timex.h>
+#include <asm/system.h>
+
+#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");
+
This page took 0.046037 seconds and 4 git commands to generate.