* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox