X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=tests%2Fkernel%2Ftest-cmpxchg-nolock2.c;h=a0a994035d6d29a894ece903275fdade2df3fcb4;hb=31efe1f8304f09a4f4139c387a98d3215cd423c9;hp=52d1af85097aba3f7d683b0b22161327080dc51a;hpb=236f9aae165a5a12d117dea44d0a78de72fbbd46;p=lttv.git diff --git a/tests/kernel/test-cmpxchg-nolock2.c b/tests/kernel/test-cmpxchg-nolock2.c index 52d1af85..a0a99403 100644 --- a/tests/kernel/test-cmpxchg-nolock2.c +++ b/tests/kernel/test-cmpxchg-nolock2.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include @@ -16,13 +16,39 @@ 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,7 +209,7 @@ 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"); @@ -133,10 +217,10 @@ static void do_test_disable_int(void) static void do_test_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(); @@ -153,7 +237,7 @@ static void do_test_int(void) 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_long_long_rem(time, NR_LOOPS, &rem); + 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"); @@ -165,8 +249,11 @@ 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();