All of lore.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 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.