public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [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