public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Wink Saville <wink-hKg/bvL8yClBDgjK7y7TUQ@public.gmane.org>
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: [PATCH 4/4] ACE simple test program
Date: Sat, 05 May 2007 18:55:15 -0700	[thread overview]
Message-ID: <463D3583.3000804@saville.com> (raw)

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/

                 reply	other threads:[~2007-05-06  1:55 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=463D3583.3000804@saville.com \
    --to=wink-hkg/bvl8yclbdgjk7y7tuq@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox