move everything out of trunk
[lttv.git] / tests / kernel / test-cmpxchg-nolock2.c
index 4b7b3cca8ba4de0206f6d56d13e0fe6ee4e5bb4a..a0a994035d6d29a894ece903275fdade2df3fcb4 100644 (file)
@@ -8,7 +8,7 @@
 #include <linux/compiler.h>
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/calc64.h>
+#include <linux/math64.h>
 #include <asm/timex.h>
 #include <asm/system.h>
 
 
 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_sync_cmpxchg(void)
 {
        int ret;
-       long flags;
+       unsigned long flags;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        local_irq_save(flags);
        preempt_disable();
@@ -42,7 +68,7 @@ static void do_test_sync_cmpxchg(void)
        printk(KERN_ALERT "test results: time for locked cmpxchg\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 "-> locked cmpxchg takes %llu cycles\n", time);
        printk(KERN_ALERT "test end\n");
 }
@@ -50,10 +76,10 @@ static void do_test_sync_cmpxchg(void)
 static void do_test_cmpxchg(void)
 {
        int ret;
-       long flags;
+       unsigned long flags;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        local_irq_save(flags);
        preempt_disable();
@@ -69,20 +95,78 @@ static void do_test_cmpxchg(void)
        printk(KERN_ALERT "test results: time for non locked cmpxchg\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 "-> non locked cmpxchg takes %llu cycles\n", time);
        printk(KERN_ALERT "test end\n");
 }
+static void do_test_sync_inc(void)
+{
+       int ret;
+       unsigned long flags;
+       unsigned int i;
+       cycles_t time1, time2, time;
+       u32 rem;
+       atomic_t val;
+
+       local_irq_save(flags);
+       preempt_disable();
+       time1 = get_cycles();
+       for (i = 0; i < NR_LOOPS; i++) {
+               ret = atomic_add_return(10, &val);
+       }
+       time2 = get_cycles();
+       local_irq_restore(flags);
+       preempt_enable();
+       time = time2 - time1;
+
+       printk(KERN_ALERT "test results: time for locked add return\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 "-> locked add return takes %llu cycles\n", time);
+       printk(KERN_ALERT "test end\n");
+}
+
+
+static void do_test_inc(void)
+{
+       int ret;
+       unsigned long flags;
+       unsigned int i;
+       cycles_t time1, time2, time;
+       u32 rem;
+       local_t loc_val;
+
+       local_irq_save(flags);
+       preempt_disable();
+       time1 = get_cycles();
+       for (i = 0; i < NR_LOOPS; i++) {
+               ret = local_add_return(10, &loc_val);
+       }
+       time2 = get_cycles();
+       local_irq_restore(flags);
+       preempt_enable();
+       time = time2 - time1;
+
+       printk(KERN_ALERT "test results: time for non locked add return\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 "-> non locked add return 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_enable_int(void)
 {
-       long flags;
+       unsigned long flags;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        local_irq_save(flags);
        preempt_disable();
@@ -98,7 +182,7 @@ static void do_test_enable_int(void)
        printk(KERN_ALERT "test results: time for enabling interrupts (STI)\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 "-> enabling interrupts (STI) takes %llu cycles\n",
                                        time);
        printk(KERN_ALERT "test end\n");
@@ -109,7 +193,7 @@ static void do_test_disable_int(void)
        unsigned long flags, flags2;
        unsigned int i;
        cycles_t time1, time2, time;
-       long rem;
+       u32 rem;
 
        local_irq_save(flags);
        preempt_disable();
@@ -125,21 +209,54 @@ static void do_test_disable_int(void)
        printk(KERN_ALERT "test results: time for disabling interrupts (CLI)\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 "-> disabling interrupts (CLI) takes %llu cycles\n",
                                time);
        printk(KERN_ALERT "test end\n");
 }
 
+static void do_test_int(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++) {
+               local_irq_restore(flags);
+               local_irq_save(flags);
+       }
+       time2 = get_cycles();
+       local_irq_restore(flags);
+       preempt_enable();
+       time = time2 - time1;
+
+       printk(KERN_ALERT "test results: time for disabling/enabling interrupts (STI/CLI)\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 "-> enabling/disabling interrupts (STI/CLI) 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_sync_cmpxchg();
        do_test_cmpxchg();
+       do_test_sync_inc();
+       do_test_inc();
        do_test_enable_int();
        do_test_disable_int();
+       do_test_int();
        return -EAGAIN; /* Fail will directly unload the module */
 }
 
This page took 0.02494 seconds and 4 git commands to generate.