1 /* test-cmpxchg-nolock.c
3 * Compare local cmpxchg with irq disable / enable.
7 #include <linux/jiffies.h>
8 #include <linux/compiler.h>
9 #include <linux/init.h>
10 #include <linux/module.h>
11 #include <linux/calc64.h>
12 #include <asm/timex.h>
13 #include <asm/system.h>
15 #define NR_LOOPS 20000
19 static void do_test_sync_cmpxchg(void)
24 cycles_t time1
, time2
, time
;
27 local_irq_save(flags
);
30 for (i
= 0; i
< NR_LOOPS
; i
++) {
32 ret
= sync_cmpxchg(&test_val
, 0, 0);
34 ret
= cmpxchg(&test_val
, 0, 0);
38 local_irq_restore(flags
);
42 printk(KERN_ALERT
"test results: time for locked cmpxchg\n");
43 printk(KERN_ALERT
"number of loops: %d\n", NR_LOOPS
);
44 printk(KERN_ALERT
"total time: %llu\n", time
);
45 time
= div_long_long_rem(time
, NR_LOOPS
, &rem
);
46 printk(KERN_ALERT
"-> locked cmpxchg takes %llu cycles\n", time
);
47 printk(KERN_ALERT
"test end\n");
50 static void do_test_cmpxchg(void)
55 cycles_t time1
, time2
, time
;
58 local_irq_save(flags
);
61 for (i
= 0; i
< NR_LOOPS
; i
++) {
62 ret
= cmpxchg_local(&test_val
, 0, 0);
65 local_irq_restore(flags
);
69 printk(KERN_ALERT
"test results: time for non locked cmpxchg\n");
70 printk(KERN_ALERT
"number of loops: %d\n", NR_LOOPS
);
71 printk(KERN_ALERT
"total time: %llu\n", time
);
72 time
= div_long_long_rem(time
, NR_LOOPS
, &rem
);
73 printk(KERN_ALERT
"-> non locked cmpxchg takes %llu cycles\n", time
);
74 printk(KERN_ALERT
"test end\n");
78 * This test will have a higher standard deviation due to incoming interrupts.
80 static void do_test_enable_int(void)
84 cycles_t time1
, time2
, time
;
87 local_irq_save(flags
);
90 for (i
= 0; i
< NR_LOOPS
; i
++) {
91 local_irq_restore(flags
);
94 local_irq_restore(flags
);
98 printk(KERN_ALERT
"test results: time for enabling interrupts (STI)\n");
99 printk(KERN_ALERT
"number of loops: %d\n", NR_LOOPS
);
100 printk(KERN_ALERT
"total time: %llu\n", time
);
101 time
= div_long_long_rem(time
, NR_LOOPS
, &rem
);
102 printk(KERN_ALERT
"-> enabling interrupts (STI) takes %llu cycles\n",
104 printk(KERN_ALERT
"test end\n");
107 static void do_test_disable_int(void)
109 unsigned long flags
, flags2
;
111 cycles_t time1
, time2
, time
;
114 local_irq_save(flags
);
116 time1
= get_cycles();
117 for ( i
= 0; i
< NR_LOOPS
; i
++) {
118 local_irq_save(flags2
);
120 time2
= get_cycles();
121 local_irq_restore(flags
);
123 time
= time2
- time1
;
125 printk(KERN_ALERT
"test results: time for disabling interrupts (CLI)\n");
126 printk(KERN_ALERT
"number of loops: %d\n", NR_LOOPS
);
127 printk(KERN_ALERT
"total time: %llu\n", time
);
128 time
= div_long_long_rem(time
, NR_LOOPS
, &rem
);
129 printk(KERN_ALERT
"-> disabling interrupts (CLI) takes %llu cycles\n",
131 printk(KERN_ALERT
"test end\n");
136 static int ltt_test_init(void)
138 printk(KERN_ALERT
"test init\n");
141 do_test_enable_int();
142 do_test_disable_int();
143 return -EAGAIN
; /* Fail will directly unload the module */
146 static void ltt_test_exit(void)
148 printk(KERN_ALERT
"test exit\n");
151 module_init(ltt_test_init
)
152 module_exit(ltt_test_exit
)
154 MODULE_LICENSE("GPL");
155 MODULE_AUTHOR("Mathieu Desnoyers");
156 MODULE_DESCRIPTION("Cmpxchg vs int Test");
This page took 0.033705 seconds and 5 git commands to generate.