From b64661e6a2000fe3e41458dc27a9810ea1c48f6e Mon Sep 17 00:00:00 2001 From: compudj Date: Sat, 3 Jun 2006 09:49:17 +0000 Subject: [PATCH] add test cmpxchg git-svn-id: http://ltt.polymtl.ca/svn@1878 04897980-b3bd-0310-b5e0-8ef037075253 --- tests/kernel/Makefile | 1 + tests/kernel/test-cmpxchg-nolock.c | 105 +++++++++++++++++++++++++++++ tests/kernel/test-cmpxchg.c | 2 +- 3 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 tests/kernel/test-cmpxchg-nolock.c diff --git a/tests/kernel/Makefile b/tests/kernel/Makefile index b0a5bb43..c134b337 100644 --- a/tests/kernel/Makefile +++ b/tests/kernel/Makefile @@ -9,6 +9,7 @@ ifneq ($(CONFIG_LTT),) obj-m += test-printk-effect.o endif obj-m += test-cmpxchg.o + obj-m += test-cmpxchg-nolock.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build diff --git a/tests/kernel/test-cmpxchg-nolock.c b/tests/kernel/test-cmpxchg-nolock.c new file mode 100644 index 00000000..5f3d7981 --- /dev/null +++ b/tests/kernel/test-cmpxchg-nolock.c @@ -0,0 +1,105 @@ +/* test-cmpxchg.c + * + * Test time spent in a LTTng instrumentation probe. + */ + + +#include +#include +#include +#include +#include + + +#define cmpxchg_up(ptr,o,n)\ + ((__typeof__(*(ptr)))__cmpxchg_up((ptr),(unsigned long)(o),\ + (unsigned long)(n),sizeof(*(ptr)))) +static inline unsigned long __cmpxchg_up(volatile void *ptr, unsigned long old, + unsigned long new, int size) +{ + unsigned long prev; + switch (size) { + case 1: + __asm__ __volatile__("cmpxchgb %b1,%2" + : "=a"(prev) + : "q"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); + return prev; + case 2: + __asm__ __volatile__("cmpxchgw %w1,%2" + : "=a"(prev) + : "r"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); + return prev; + case 4: + __asm__ __volatile__("cmpxchgl %1,%2" + : "=a"(prev) + : "r"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); + return prev; + } + return old; +} + + +#define NR_LOOPS 20000 + +volatile int test_val = 100; + + +static inline void do_test(void) +{ + int val, ret; + + val = test_val; + + ret = cmpxchg_up(&test_val, val, val+1); +} + +static int ltt_test_init(void) +{ + unsigned int i; + cycles_t time1, time2, time; + cycles_t max_time = 0, min_time = 18446744073709551615ULL; /* (2^64)-1 */ + cycles_t tot_time = 0; + unsigned long flags; + printk(KERN_ALERT "test init\n"); + + local_irq_save(flags); + time1 = get_cycles(); + for(i=0; i