update rw test
[lttv.git] / trunk / tests / kernel / test-fair-rwlock.c
CommitLineData
f0a36bb1 1/* test-fair-rwlock.c
2 *
3 */
4
5#include <linux/module.h>
6#include <linux/proc_fs.h>
7#include <linux/sched.h>
8#include <linux/timex.h>
9#include <linux/fair-rwlock.h>
10#include <linux/kthread.h>
11#include <linux/delay.h>
12#include <linux/hardirq.h>
13#include <linux/module.h>
7f563886 14#include <linux/percpu.h>
f0a36bb1 15#include <asm/ptrace.h>
16
7f563886 17#if (NR_CPUS > 64 && (BITS_PER_LONG == 32 || NR_CPUS > 32768))
f0a36bb1 18#error "fair rwlock needs more bits per long to deal with that many CPUs"
19#endif
20
68f25f81 21/* Test with no contention duration, in seconds */
22#define SINGLE_WRITER_TEST_DURATION 10
23#define SINGLE_READER_TEST_DURATION 10
24#define MULTIPLE_READERS_TEST_DURATION 10
25
89889f86 26/* Test duration, in seconds */
f36c4112 27#define TEST_DURATION 60
89889f86 28
f0a36bb1 29#define THREAD_ROFFSET 1UL
30#define THREAD_RMASK ((NR_CPUS - 1) * THREAD_ROFFSET)
31#define SOFTIRQ_ROFFSET (THREAD_RMASK + 1)
32#define SOFTIRQ_RMASK ((NR_CPUS - 1) * SOFTIRQ_ROFFSET)
33#define HARDIRQ_ROFFSET ((SOFTIRQ_RMASK | THREAD_RMASK) + 1)
34#define HARDIRQ_RMASK ((NR_CPUS - 1) * HARDIRQ_ROFFSET)
35
7f563886 36#define SUBSCRIBERS_WOFFSET \
37 ((HARDIRQ_RMASK | SOFTIRQ_RMASK | THREAD_RMASK) + 1)
38#define SUBSCRIBERS_WMASK \
39 ((NR_CPUS - 1) * SUBSCRIBERS_WOFFSET)
40#define WRITER_MUTEX \
41 ((SUBSCRIBERS_WMASK | HARDIRQ_RMASK | SOFTIRQ_RMASK | THREAD_RMASK) + 1)
42#define SOFTIRQ_WMASK (WRITER_MUTEX << 1)
43#define SOFTIRQ_WOFFSET SOFTIRQ_WMASK
426d6b67 44#define HARDIRQ_WMASK (SOFTIRQ_WMASK << 1)
7f563886 45#define HARDIRQ_WOFFSET HARDIRQ_WMASK
f0a36bb1 46
47#define NR_VARS 100
1c21e42c 48#define NR_WRITERS 2
49#define NR_TRYLOCK_WRITERS 2
50#define NR_READERS 4
51#define NR_TRYLOCK_READERS 2
4fd25765 52
53/*
54 * 1 : test with thread and interrupt readers.
55 * 0 : test only with thread readers.
56 */
57#define TEST_INTERRUPTS 1
58
59#if (TEST_INTERRUPTS)
1c21e42c 60#define NR_INTERRUPT_READERS 1
61#define NR_TRYLOCK_INTERRUPT_READERS 1
4fd25765 62#else
63#define NR_INTERRUPT_READERS 0
64#define NR_TRYLOCK_INTERRUPT_READERS 0
65#endif
f0a36bb1 66
4d1751f9 67/*
68 * Writer iteration delay, in us. 0 for busy loop. Caution : writers can
69 * starve readers.
70 */
71#define WRITER_DELAY 10
4fd25765 72#define TRYLOCK_WRITER_DELAY 1000
73
74/*
75 * Number of iterations after which a trylock writer fails.
76 * -1 for infinite loop.
77 */
78#define TRYLOCK_WRITERS_FAIL_ITER 100
79
80/* Thread and interrupt reader delay, in ms */
81#define THREAD_READER_DELAY 0 /* busy loop */
82#define INTERRUPT_READER_DELAY 100
89889f86 83
f0a36bb1 84static int var[NR_VARS];
85static struct task_struct *reader_threads[NR_READERS];
1c21e42c 86static struct task_struct *trylock_reader_threads[NR_TRYLOCK_READERS];
f0a36bb1 87static struct task_struct *writer_threads[NR_WRITERS];
1c21e42c 88static struct task_struct *trylock_writer_threads[NR_TRYLOCK_WRITERS];
4fd25765 89static struct task_struct *interrupt_reader[NR_INTERRUPT_READERS];
90static struct task_struct *trylock_interrupt_reader[NR_TRYLOCK_INTERRUPT_READERS];
f0a36bb1 91
92static struct fair_rwlock frwlock = {
93 .value = ATOMIC_LONG_INIT(0),
f0a36bb1 94};
95
68f25f81 96static cycles_t cycles_calibration_min,
97 cycles_calibration_avg,
98 cycles_calibration_max;
99
100static inline cycles_t calibrate_cycles(cycles_t cycles)
101{
102 return cycles - cycles_calibration_avg;
103}
104
f0a36bb1 105struct proc_dir_entry *pentry = NULL;
106
107static int reader_thread(void *data)
108{
109 int i;
110 int prev, cur;
111 unsigned long iter = 0;
68f25f81 112 cycles_t time1, time2, delay, delaymax = 0, delaymin = ULLONG_MAX,
113 delayavg = 0;
f0a36bb1 114
115 printk("reader_thread/%lu runnning\n", (unsigned long)data);
116 do {
117 iter++;
7f563886 118 preempt_disable(); /* for get_cycles accuracy */
68f25f81 119 rdtsc_barrier();
7f563886 120 time1 = get_cycles();
68f25f81 121 rdtsc_barrier();
122
f0a36bb1 123 fair_read_lock(&frwlock);
68f25f81 124
125 rdtsc_barrier();
7f563886 126 time2 = get_cycles();
68f25f81 127 rdtsc_barrier();
128 delay = time2 - time1;
129 delaymax = max(delaymax, delay);
130 delaymin = min(delaymin, delay);
131 delayavg += delay;
f0a36bb1 132 prev = var[0];
133 for (i = 1; i < NR_VARS; i++) {
134 cur = var[i];
135 if (cur != prev)
136 printk(KERN_ALERT
137 "Unequal cur %d/prev %d at i %d, iter %lu "
138 "in thread\n", cur, prev, i, iter);
139 }
140 fair_read_unlock(&frwlock);
7f563886 141 preempt_enable(); /* for get_cycles accuracy */
4fd25765 142 if (THREAD_READER_DELAY)
143 msleep(THREAD_READER_DELAY);
f0a36bb1 144 } while (!kthread_should_stop());
4fd25765 145 if (!iter) {
146 printk("reader_thread/%lu iterations : %lu",
147 (unsigned long)data, iter);
148 } else {
149 delayavg /= iter;
150 printk("reader_thread/%lu iterations : %lu, "
151 "lock delay [min,avg,max] %llu,%llu,%llu cycles\n",
152 (unsigned long)data, iter,
153 calibrate_cycles(delaymin),
154 calibrate_cycles(delayavg),
155 calibrate_cycles(delaymax));
156 }
f0a36bb1 157 return 0;
158}
159
1c21e42c 160static int trylock_reader_thread(void *data)
161{
162 int i;
163 int prev, cur;
164 unsigned long iter = 0, success_iter = 0;
165
166 printk("trylock_reader_thread/%lu runnning\n", (unsigned long)data);
167 do {
168 while (!fair_read_trylock(&frwlock))
169 iter++;
170 success_iter++;
171 prev = var[0];
172 for (i = 1; i < NR_VARS; i++) {
173 cur = var[i];
174 if (cur != prev)
175 printk(KERN_ALERT
176 "Unequal cur %d/prev %d at i %d, iter %lu "
177 "in thread\n", cur, prev, i, iter);
178 }
179 fair_read_unlock(&frwlock);
4fd25765 180 if (THREAD_READER_DELAY)
181 msleep(THREAD_READER_DELAY);
1c21e42c 182 } while (!kthread_should_stop());
183 printk("trylock_reader_thread/%lu iterations : %lu, "
184 "successful iterations : %lu\n",
185 (unsigned long)data, iter, success_iter);
186 return 0;
187}
188
68f25f81 189DEFINE_PER_CPU(cycles_t, int_delaymin);
190DEFINE_PER_CPU(cycles_t, int_delayavg);
7f563886 191DEFINE_PER_CPU(cycles_t, int_delaymax);
68f25f81 192DEFINE_PER_CPU(cycles_t, int_ipi_nr);
7f563886 193
f0a36bb1 194static void interrupt_reader_ipi(void *data)
195{
196 int i;
197 int prev, cur;
7f563886 198 cycles_t time1, time2;
68f25f81 199 cycles_t *delaymax, *delaymin, *delayavg, *ipi_nr, delay;
7f563886 200
201 /*
202 * Skip the ipi caller, not in irq context.
203 */
204 if (!in_irq())
205 return;
f0a36bb1 206
7f563886 207 delaymax = &per_cpu(int_delaymax, smp_processor_id());
68f25f81 208 delaymin = &per_cpu(int_delaymin, smp_processor_id());
209 delayavg = &per_cpu(int_delayavg, smp_processor_id());
210 ipi_nr = &per_cpu(int_ipi_nr, smp_processor_id());
211
212 rdtsc_barrier();
7f563886 213 time1 = get_cycles();
68f25f81 214 rdtsc_barrier();
215
f0a36bb1 216 fair_read_lock(&frwlock);
68f25f81 217
218 rdtsc_barrier();
7f563886 219 time2 = get_cycles();
68f25f81 220 rdtsc_barrier();
221 delay = time2 - time1;
222 *delaymax = max(*delaymax, delay);
223 *delaymin = min(*delaymin, delay);
224 *delayavg += delay;
225 (*ipi_nr)++;
f0a36bb1 226 prev = var[0];
227 for (i = 1; i < NR_VARS; i++) {
228 cur = var[i];
229 if (cur != prev)
230 printk(KERN_ALERT
231 "Unequal cur %d/prev %d at i %d in interrupt\n",
232 cur, prev, i);
233 }
234 fair_read_unlock(&frwlock);
235}
236
1c21e42c 237DEFINE_PER_CPU(unsigned long, trylock_int_iter);
238DEFINE_PER_CPU(unsigned long, trylock_int_success);
239
240static void trylock_interrupt_reader_ipi(void *data)
241{
242 int i;
243 int prev, cur;
244
245 /*
246 * Skip the ipi caller, not in irq context.
247 */
248 if (!in_irq())
249 return;
250
251 per_cpu(trylock_int_iter, smp_processor_id())++;
252 while (!fair_read_trylock(&frwlock))
253 per_cpu(trylock_int_iter, smp_processor_id())++;
254 per_cpu(trylock_int_success, smp_processor_id())++;
255 prev = var[0];
256 for (i = 1; i < NR_VARS; i++) {
257 cur = var[i];
258 if (cur != prev)
259 printk(KERN_ALERT
260 "Unequal cur %d/prev %d at i %d in interrupt\n",
261 cur, prev, i);
262 }
263 fair_read_unlock(&frwlock);
264}
265
266
f0a36bb1 267static int interrupt_reader_thread(void *data)
268{
269 unsigned long iter = 0;
7f563886 270 int i;
271
68f25f81 272 for_each_online_cpu(i) {
273 per_cpu(int_delaymax, i) = 0;
274 per_cpu(int_delaymin, i) = ULLONG_MAX;
275 per_cpu(int_delayavg, i) = 0;
276 per_cpu(int_ipi_nr, i) = 0;
277 }
f0a36bb1 278 do {
279 iter++;
280 on_each_cpu(interrupt_reader_ipi, NULL, 0);
4fd25765 281 if (INTERRUPT_READER_DELAY)
282 msleep(INTERRUPT_READER_DELAY);
f0a36bb1 283 } while (!kthread_should_stop());
284 printk("interrupt_reader_thread/%lu iterations : %lu\n",
285 (unsigned long)data, iter);
7f563886 286 for_each_online_cpu(i) {
4fd25765 287 if (!per_cpu(int_ipi_nr, i))
288 continue;
68f25f81 289 per_cpu(int_delayavg, i) /= per_cpu(int_ipi_nr, i);
7f563886 290 printk("interrupt readers on CPU %i, "
68f25f81 291 "lock delay [min,avg,max] %llu,%llu,%llu cycles\n",
292 i,
293 calibrate_cycles(per_cpu(int_delaymin, i)),
294 calibrate_cycles(per_cpu(int_delayavg, i)),
295 calibrate_cycles(per_cpu(int_delaymax, i)));
7f563886 296 }
f0a36bb1 297 return 0;
298}
299
1c21e42c 300static int trylock_interrupt_reader_thread(void *data)
301{
302 unsigned long iter = 0;
303 int i;
304
305 do {
306 iter++;
307 on_each_cpu(trylock_interrupt_reader_ipi, NULL, 0);
4fd25765 308 if (INTERRUPT_READER_DELAY)
309 msleep(INTERRUPT_READER_DELAY);
1c21e42c 310 } while (!kthread_should_stop());
311 printk("trylock_interrupt_reader_thread/%lu iterations : %lu\n",
312 (unsigned long)data, iter);
313 for_each_online_cpu(i) {
314 printk("trylock interrupt readers on CPU %i, "
315 "iterations %lu, "
316 "successful iterations : %lu\n",
317 i, per_cpu(trylock_int_iter, i),
318 per_cpu(trylock_int_success, i));
68f25f81 319 per_cpu(trylock_int_iter, i) = 0;
320 per_cpu(trylock_int_success, i) = 0;
1c21e42c 321 }
322 return 0;
323}
324
f0a36bb1 325static int writer_thread(void *data)
326{
327 int i;
328 int new;
329 unsigned long iter = 0;
68f25f81 330 cycles_t time1, time2, delay, delaymax = 0, delaymin = ULLONG_MAX,
331 delayavg = 0;
f0a36bb1 332
333 printk("writer_thread/%lu runnning\n", (unsigned long)data);
334 do {
335 iter++;
7f563886 336 preempt_disable(); /* for get_cycles accuracy */
68f25f81 337 rdtsc_barrier();
7f563886 338 time1 = get_cycles();
68f25f81 339 rdtsc_barrier();
340
4fd25765 341#if (TEST_INTERRUPTS)
f0a36bb1 342 fair_write_lock_irq(&frwlock);
4fd25765 343#else
344 fair_write_lock(&frwlock);
345#endif
68f25f81 346
347 rdtsc_barrier();
7f563886 348 time2 = get_cycles();
68f25f81 349 rdtsc_barrier();
350 delay = time2 - time1;
351 delaymax = max(delaymax, delay);
352 delaymin = min(delaymin, delay);
353 delayavg += delay;
f0a36bb1 354 new = (int)get_cycles();
355 for (i = 0; i < NR_VARS; i++) {
356 var[i] = new;
357 }
4fd25765 358#if (TEST_INTERRUPTS)
f0a36bb1 359 fair_write_unlock_irq(&frwlock);
4fd25765 360#else
361 fair_write_unlock(&frwlock);
362#endif
7f563886 363 preempt_enable(); /* for get_cycles accuracy */
89889f86 364 if (WRITER_DELAY > 0)
4d1751f9 365 udelay(WRITER_DELAY);
f0a36bb1 366 } while (!kthread_should_stop());
68f25f81 367 delayavg /= iter;
7f563886 368 printk("writer_thread/%lu iterations : %lu, "
68f25f81 369 "lock delay [min,avg,max] %llu,%llu,%llu cycles\n",
370 (unsigned long)data, iter,
371 calibrate_cycles(delaymin),
372 calibrate_cycles(delayavg),
373 calibrate_cycles(delaymax));
f0a36bb1 374 return 0;
375}
376
1c21e42c 377static int trylock_writer_thread(void *data)
378{
379 int i;
380 int new;
4fd25765 381 unsigned long iter = 0, success = 0, fail = 0;
1c21e42c 382
383 printk("trylock_writer_thread/%lu runnning\n", (unsigned long)data);
384 do {
4fd25765 385 iter++;
386#if (TEST_INTERRUPTS)
387 if (fair_write_trylock_irq_else_subscribe(&frwlock))
388#else
389 if (fair_write_trylock_else_subscribe(&frwlock))
390#endif
391 goto locked;
392#if (TRYLOCK_WRITERS_FAIL_ITER == -1)
393 for (;;) {
1c21e42c 394 iter++;
4fd25765 395#if (TEST_INTERRUPTS)
396 if (fair_write_trylock_irq_subscribed(&frwlock))
397#else
398 if (fair_write_trylock_subscribed(&frwlock))
399#endif
400 goto locked;
1c21e42c 401 }
4fd25765 402#else
403 for (i = 0; i < TRYLOCK_WRITERS_FAIL_ITER; i++) {
404 iter++;
405#if (TEST_INTERRUPTS)
406 if (fair_write_trylock_irq_subscribed(&frwlock))
407#else
408 if (fair_write_trylock_subscribed(&frwlock))
409#endif
410 goto locked;
411 }
412#endif
413 fail++;
414 fair_write_unsubscribe(&frwlock);
415 goto loop;
416locked:
1c21e42c 417 success++;
1c21e42c 418 new = (int)get_cycles();
419 for (i = 0; i < NR_VARS; i++) {
420 var[i] = new;
421 }
4fd25765 422#if (TEST_INTERRUPTS)
1c21e42c 423 fair_write_unlock_irq(&frwlock);
4fd25765 424#else
425 fair_write_unlock(&frwlock);
426#endif
427loop:
428 if (TRYLOCK_WRITER_DELAY > 0)
429 udelay(TRYLOCK_WRITER_DELAY);
1c21e42c 430 } while (!kthread_should_stop());
4fd25765 431 printk("trylock_writer_thread/%lu iterations : "
432 "[try,success,fail after %d try], "
433 "%lu,%lu,%lu\n",
434 (unsigned long)data, TRYLOCK_WRITERS_FAIL_ITER,
435 iter, success, fail);
1c21e42c 436 return 0;
437}
438
f0a36bb1 439static void fair_rwlock_create(void)
440{
441 unsigned long i;
442
443 for (i = 0; i < NR_READERS; i++) {
444 printk("starting reader thread %lu\n", i);
445 reader_threads[i] = kthread_run(reader_thread, (void *)i,
446 "frwlock_reader");
447 BUG_ON(!reader_threads[i]);
448 }
449
1c21e42c 450 for (i = 0; i < NR_TRYLOCK_READERS; i++) {
451 printk("starting trylock reader thread %lu\n", i);
452 trylock_reader_threads[i] = kthread_run(trylock_reader_thread,
453 (void *)i, "frwlock_trylock_reader");
454 BUG_ON(!trylock_reader_threads[i]);
455 }
4fd25765 456 for (i = 0; i < NR_INTERRUPT_READERS; i++) {
457 printk("starting interrupt reader %lu\n", i);
458 interrupt_reader[i] = kthread_run(interrupt_reader_thread,
459 (void *)i,
460 "frwlock_interrupt_reader");
461 }
462 for (i = 0; i < NR_TRYLOCK_INTERRUPT_READERS; i++) {
463 printk("starting trylock interrupt reader %lu\n", i);
464 trylock_interrupt_reader[i] =
465 kthread_run(trylock_interrupt_reader_thread,
466 (void *)i, "frwlock_trylock_interrupt_reader");
467 }
f0a36bb1 468 for (i = 0; i < NR_WRITERS; i++) {
469 printk("starting writer thread %lu\n", i);
470 writer_threads[i] = kthread_run(writer_thread, (void *)i,
471 "frwlock_writer");
472 BUG_ON(!writer_threads[i]);
473 }
1c21e42c 474 for (i = 0; i < NR_TRYLOCK_WRITERS; i++) {
475 printk("starting trylock writer thread %lu\n", i);
476 trylock_writer_threads[i] = kthread_run(trylock_writer_thread,
477 (void *)i, "frwlock_trylock_writer");
478 BUG_ON(!trylock_writer_threads[i]);
479 }
f0a36bb1 480}
481
482static void fair_rwlock_stop(void)
483{
484 unsigned long i;
485
1c21e42c 486 for (i = 0; i < NR_WRITERS; i++)
7f563886 487 kthread_stop(writer_threads[i]);
1c21e42c 488 for (i = 0; i < NR_TRYLOCK_WRITERS; i++)
489 kthread_stop(trylock_writer_threads[i]);
490 for (i = 0; i < NR_READERS; i++)
f0a36bb1 491 kthread_stop(reader_threads[i]);
1c21e42c 492 for (i = 0; i < NR_TRYLOCK_READERS; i++)
493 kthread_stop(trylock_reader_threads[i]);
4fd25765 494 for (i = 0; i < NR_INTERRUPT_READERS; i++)
495 kthread_stop(interrupt_reader[i]);
496 for (i = 0; i < NR_TRYLOCK_INTERRUPT_READERS; i++)
497 kthread_stop(trylock_interrupt_reader[i]);
f0a36bb1 498}
499
500
501static void perform_test(const char *name, void (*callback)(void))
502{
503 printk("%s\n", name);
504 callback();
505}
506
507static int my_open(struct inode *inode, struct file *file)
508{
68f25f81 509 unsigned long i;
510 cycles_t time1, time2, delay;
511
512 printk("** get_cycles calibration **\n");
513 cycles_calibration_min = ULLONG_MAX;
514 cycles_calibration_avg = 0;
515 cycles_calibration_max = 0;
516
517 local_irq_disable();
518 for (i = 0; i < 10; i++) {
519 rdtsc_barrier();
520 time1 = get_cycles();
521 rdtsc_barrier();
522 rdtsc_barrier();
523 time2 = get_cycles();
524 rdtsc_barrier();
525 delay = time2 - time1;
526 cycles_calibration_min = min(cycles_calibration_min, delay);
527 cycles_calibration_avg += delay;
528 cycles_calibration_max = max(cycles_calibration_max, delay);
529 }
530 cycles_calibration_avg /= 10;
531 local_irq_enable();
532
533 printk("get_cycles takes [min,avg,max] %llu,%llu,%llu cycles, "
534 "results calibrated on avg\n",
535 cycles_calibration_min,
536 cycles_calibration_avg,
537 cycles_calibration_max);
538
539 printk("** Single writer test, no contention **\n");
540 writer_threads[0] = kthread_run(writer_thread, (void *)0,
541 "frwlock_writer");
542 BUG_ON(!writer_threads[0]);
543 ssleep(SINGLE_WRITER_TEST_DURATION);
544 kthread_stop(writer_threads[0]);
545
4fd25765 546 printk("** Single trylock writer test, no contention **\n");
547 trylock_writer_threads[0] = kthread_run(trylock_writer_thread,
548 (void *)0,
549 "trylock_frwlock_writer");
550 BUG_ON(!trylock_writer_threads[0]);
551 ssleep(SINGLE_WRITER_TEST_DURATION);
552 kthread_stop(trylock_writer_threads[0]);
553
68f25f81 554 printk("** Single reader test, no contention **\n");
555 reader_threads[0] = kthread_run(reader_thread, (void *)0,
556 "frwlock_reader");
557 BUG_ON(!reader_threads[0]);
558 ssleep(SINGLE_READER_TEST_DURATION);
559 kthread_stop(reader_threads[0]);
560
561 printk("** Multiple readers test, no contention **\n");
562 for (i = 0; i < NR_READERS; i++) {
563 printk("starting reader thread %lu\n", i);
564 reader_threads[i] = kthread_run(reader_thread, (void *)i,
565 "frwlock_reader");
566 BUG_ON(!reader_threads[i]);
567 }
568 ssleep(SINGLE_READER_TEST_DURATION);
569 for (i = 0; i < NR_READERS; i++)
570 kthread_stop(reader_threads[i]);
571
572 printk("** High contention test **\n");
f0a36bb1 573 perform_test("fair-rwlock-create", fair_rwlock_create);
f36c4112 574 ssleep(TEST_DURATION);
f0a36bb1 575 perform_test("fair-rwlock-stop", fair_rwlock_stop);
576
577 return -EPERM;
578}
579
580
581static struct file_operations my_operations = {
582 .open = my_open,
583};
584
585int init_module(void)
586{
587 pentry = create_proc_entry("testfrwlock", 0444, NULL);
588 if (pentry)
589 pentry->proc_fops = &my_operations;
590
591 printk("NR_CPUS : %d\n", NR_CPUS);
592 printk("THREAD_ROFFSET : %lX\n", THREAD_ROFFSET);
593 printk("THREAD_RMASK : %lX\n", THREAD_RMASK);
f0a36bb1 594 printk("SOFTIRQ_ROFFSET : %lX\n", SOFTIRQ_ROFFSET);
595 printk("SOFTIRQ_RMASK : %lX\n", SOFTIRQ_RMASK);
f0a36bb1 596 printk("HARDIRQ_ROFFSET : %lX\n", HARDIRQ_ROFFSET);
597 printk("HARDIRQ_RMASK : %lX\n", HARDIRQ_RMASK);
7f563886 598 printk("SUBSCRIBERS_WOFFSET : %lX\n", SUBSCRIBERS_WOFFSET);
599 printk("SUBSCRIBERS_WMASK : %lX\n", SUBSCRIBERS_WMASK);
600 printk("WRITER_MUTEX : %lX\n", WRITER_MUTEX);
601 printk("SOFTIRQ_WMASK : %lX\n", SOFTIRQ_WMASK);
f0a36bb1 602 printk("HARDIRQ_WMASK : %lX\n", HARDIRQ_WMASK);
603
604 return 0;
605}
606
607void cleanup_module(void)
608{
609 remove_proc_entry("testfrwlock", NULL);
610}
611
612MODULE_LICENSE("GPL");
613MODULE_AUTHOR("Mathieu Desnoyers");
614MODULE_DESCRIPTION("Fair rwlock test");
This page took 0.048687 seconds and 4 git commands to generate.