* [PATCH 4/4] ACE simple test program
@ 2007-05-06 1:55 Wink Saville
0 siblings, 0 replies; only message in thread
From: Wink Saville @ 2007-05-06 1:55 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Signed-off-by: Wink Saville <wink-hKg/bvL8yClBDgjK7y7TUQ@public.gmane.org>
---
test/ace_test/Makefile | 19 ++++
test/ace_test/ace_test.c | 224 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 243 insertions(+), 0 deletions(-)
create mode 100644 test/ace_test/Makefile
create mode 100644 test/ace_test/ace_test.c
Index: linux-2.6/test/ace_test/Makefile
===================================================================
--- /dev/null
+++ linux-2.6/test/ace_test/Makefile
@@ -0,0 +1,19 @@
+CFLAGS=-m64 -O2 -Wall -g -DDEBUG=0
+INCLUDE= -I../../include
+
+.PHONY: all
+all: ace_test
+
+ace_test: ace_test.c ace.o
+ gcc ${CFLAGS} ${INCLUDE} ace_test.c ace.o -o ace_test -lpthread -lrt
+ objdump -d ace_test > ace_test.dis
+
+ace.o: ace.S
+ gcc ${CFLAGS} ${INCLUDE} -c ace.S -o ace.o
+
+ace.S: ../../arch/x86_64/kernel/ace.S
+ cp ../../arch/x86_64/kernel/ace.S .
+
+clean:
+ rm -f ace_test.o ace.S ace.o ace_test.dis ace_test
+
Index: linux-2.6/test/ace_test/ace_test.c
===================================================================
--- /dev/null
+++ linux-2.6/test/ace_test/ace_test.c
@@ -0,0 +1,234 @@
+/**
+ * @file: ace_test.c
+ *
+ * Copyright (C) 2006, Saville Software, Inc.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <time.h>
+#include <pthread.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#include <linux/wait.h>
+
+#include <asm/ace.h>
+
+#ifndef DEBUG
+#define DEBUG 0
+#endif
+
+#define countof(x) ((sizeof(x))/sizeof(x[0]))
+
+#if DEBUG
+ #define DPRINTF(fmt, args...) do { printf(fmt, ## args); } while (0)
+#else
+ #define DPRINTF(fmt, args...) do { } while (0)
+#endif
+
+uint64_t start_time_us;
+uint64_t end_time_us;
+
+uint64_t inline gtod_us(void)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+
+ return ((uint64_t)tv.tv_sec * 1000000) + (uint64_t)tv.tv_usec;
+}
+
+/**
+ * Test ace_atomic
+ */
+void test_ace_atomic(void)
+{
+ int total = 0;
+ int failed = 0;
+ int i = 0;
+ int result;
+
+ total += 1;
+ ace_inc(&i);
+ if (i != 1) {
+ printf("test_ace_atomic: ace_inc didn't work was %d expected 1\n", i);
+ failed += 1;
+ }
+
+ total += 1;
+ ace_dec(&i);
+ if (i != 0) {
+ printf("test_ace_atomic: ace_dec didn't work was %d expected 0\n", i);
+ failed += 1;
+ }
+
+ total += 1;
+ i = 10;
+ result = ace_dec_and_test(&i);
+ if (result || (i != 9)) {
+ printf("test_ace_atomic: ace_dec_and_test didn't work result was %s i was %d expected false and 9\n",
+ result ? "true" : "false", i);
+ failed += 1;
+ }
+ total += 1;
+ i = 1;
+ result = ace_dec_and_test(&i);
+ if (!result || (i != 0)) {
+ printf("test_ace_atomic: ace_dec_and_test didn't work result was %s i was %d expected true and 0\n",
+ result ? "true" : "false", i);
+ failed += 1;
+ }
+ total += 1;
+ i = 0;
+ result = ace_dec_and_test(&i);
+ if (result || (i != -1)) {
+ printf("test_ace_atomic: ace_dec_and_test didn't work result was %s i was %d expected false and -1\n",
+ result ? "true" : "false", i);
+ failed += 1;
+ }
+
+ total += 1;
+ i = 0;
+ ace_cmpxchg(&i, 0, 1);
+ if (i != 1) {
+ printf("test_ace_atomic: ace_cmpxchg didn't work was %d expected 1\n", i);
+ failed += 1;
+ }
+
+ total += 1;
+ i = 8;
+ ace_cmpxchg(&i, 8, 1);
+ if (i != 1) {
+ printf("test_ace_atomic: ace_cmpxchg didn't work was %d expected 1\n", i);
+ failed += 1;
+ }
+
+ total += 1;
+ i = 3;
+ ace_cmpxchg(&i, 0, 2);
+ if (i != 3) {
+ printf("test_ace_atomic: ace_cmpxchg didn't work was %d expected 3\n", i);
+ failed += 1;
+ }
+
+ if (failed) {
+ printf("test_ace_atomic: failed %d tests of %d\n", failed, total);
+ } else {
+ printf("test_ace_atomic: PASSED %d tests\n", total);
+ }
+}
+
+void display_counters(uint64_t *initial, uint64_t *final)
+{
+ int i;
+
+ printf("%20s %20s\n", "initial value", "final value");
+ for (i = 0; i < ACE_TEST_NUM_COUNTERS; i++) {
+ printf("%20ld %20ld\n", initial[i], final[i]);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ long int loops;
+ long int i;
+ int fd = -1;
+ void *pAceCode = NULL;
+ char *file_name = "/dev/ace";
+ int counter_index;
+ uint64_t ace_counters_initial[ACE_TEST_NUM_COUNTERS];
+ uint64_t ace_counters_final[ACE_TEST_NUM_COUNTERS];
+ int quiet;
+
+ if (argc < 3) {
+ printf("Usage: ace_test loops counter_index [q]\n");
+ return 1;
+ }
+
+ if (sscanf(argv[1], "%li", &loops) != 1) {
+ printf("Usage: ace_test loops counter_index [q]\n");
+ return 1;
+ }
+
+ if (sscanf(argv[2], "%i", &counter_index) != 1) {
+ printf("Usage: ace_test loops counter_index [q]\n");
+ return 1;
+ }
+
+ if (argc == 4) {
+ quiet = argv[3][0] == 'q';
+ } else {
+ quiet = false;
+ }
+
+ fd = open(file_name, O_RDWR);
+ if (fd < 0) {
+ printf("Error opening %s err=%s\n", file_name, strerror(errno));
+ return 1;
+ }
+ pAceCode = (void *)ACE_CODE_ADDR;
+
+ if (mlockall(MCL_CURRENT) != 0)
+ {
+ perror("Couldn't lock memory");
+ return 1;
+ }
+
+ if (!quiet) {
+ test_ace_atomic();
+ printf("Running %ld loops...", loops);
+ fflush(stdout);
+ }
+ start_time_us = gtod_us();
+ ace_get_counters_snapshot(ace_counters_initial);
+ for (i = 0; i < loops; i++)
+ {
+ ace_inc_two_counters(0, counter_index);
+ }
+ ace_get_counters_snapshot(ace_counters_final);
+ end_time_us = gtod_us();
+ if (!quiet) {
+ printf(" done\n");
+ }
+
+ if (pAceCode != NULL) {
+ uint64_t duration = end_time_us - start_time_us;
+ double secs = (double)duration / 1000000.0;
+ uint64_t expected_value = 0;
+
+ for (i = 1; i < ACE_TEST_NUM_COUNTERS; i++) {
+ expected_value += ace_counters_final[i];
+ }
+
+ if (!quiet) {
+ display_counters(ace_counters_initial, ace_counters_final);
+
+ printf(" expected_value=%ld\n", expected_value);
+ printf(" loops=%ld\n", loops);
+ printf(" duration secs=%.2lf\n", secs);
+ printf(" rate per sec=%.0lf\n", loops ? loops/secs : 0);
+ printf(" secs per=%.9lf\n", loops ? secs/loops : 0.0);
+ printf(" result=%s\n", expected_value == ace_counters_final[0] ? "success" : "failure");
+ } else {
+ printf("%s\n", expected_value == ace_counters_final[0] ? "success" : "failure");
+ }
+ }
+
+ if (fd >= 0)
+ close(fd);
+
+
+ return 0;
+}
+
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-05-06 1:55 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-06 1:55 [PATCH 4/4] ACE simple test program Wink Saville
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.