svn commit: r214202 - head/tools/tools/syscall_timing

Robert Watson rwatson at FreeBSD.org
Fri Oct 22 11:22:19 UTC 2010


Author: rwatson
Date: Fri Oct 22 11:22:19 2010
New Revision: 214202
URL: http://svn.freebsd.org/changeset/base/214202

Log:
  Validate syscall_timing test names before starting to provide earlier
  feedback regarding user error.
  
  Provide default loop and timing settings.
  
  Add a new test that just times pread() without the open()/close().
  
  Mark tests requiring a path argument so we can provide better feedback
  to the user than EFAULT on (null).
  
  Sponsored by:	Google, Inc.
  MFC after:	2 weeks

Modified:
  head/tools/tools/syscall_timing/syscall_timing.c

Modified: head/tools/tools/syscall_timing/syscall_timing.c
==============================================================================
--- head/tools/tools/syscall_timing/syscall_timing.c	Fri Oct 22 08:57:25 2010	(r214201)
+++ head/tools/tools/syscall_timing/syscall_timing.c	Fri Oct 22 11:22:19 2010	(r214202)
@@ -284,6 +284,29 @@ test_open_close(uintmax_t num, uintmax_t
 }
 
 uintmax_t
+test_read(uintmax_t num, uintmax_t int_arg, const char *path)
+{
+	char buf[int_arg];
+	uintmax_t i;
+	int fd;
+
+	fd = open(path, O_RDONLY);
+	if (fd < 0)
+		err(-1, "test_open_close: %s", path);
+	(void)pread(fd, buf, int_arg, 0);
+
+	benchmark_start();
+	for (i = 0; i < num; i++) {
+		if (alarm_fired)
+			break;
+		(void)pread(fd, buf, int_arg, 0);
+	}
+	benchmark_stop();
+	close(fd);
+	return (i);
+}
+
+uintmax_t
 test_open_read_close(uintmax_t num, uintmax_t int_arg, const char *path)
 {
 	char buf[int_arg];
@@ -547,9 +570,12 @@ test_setuid(uintmax_t num, uintmax_t int
 struct test {
 	const char	*t_name;
 	uintmax_t	(*t_func)(uintmax_t, uintmax_t, const char *);
+	int		 t_flags;
 	uintmax_t	 t_int;
 };
 
+#define	FLAG_PATH	0x00000001
+
 static const struct test tests[] = {
 	{ "getuid", test_getuid },
 	{ "getppid", test_getppid },
@@ -561,13 +587,28 @@ static const struct test tests[] = {
 	{ "socketpair_dgram", test_socketpair_dgram },
 	{ "socket_tcp", test_socket_stream, .t_int = PF_INET },
 	{ "socket_udp", test_socket_dgram, .t_int = PF_INET },
-	{ "open_close", test_open_close },
-	{ "open_read_close_1", test_open_read_close, .t_int = 1 },
-	{ "open_read_close_10", test_open_read_close, .t_int = 10 },
-	{ "open_read_close_100", test_open_read_close, .t_int = 100 },
-	{ "open_read_close_1000", test_open_read_close, .t_int = 1000 },
-	{ "open_read_close_10000", test_open_read_close, .t_int = 10000 },
-	{ "open_read_close_100000", test_open_read_close, .t_int = 100000 },
+	{ "open_close", test_open_close, .t_flags = FLAG_PATH },
+	{ "open_read_close_1", test_open_read_close, .t_flags = FLAG_PATH,
+	    .t_int = 1 },
+	{ "open_read_close_10", test_open_read_close, .t_flags = FLAG_PATH,
+	    .t_int = 10 },
+	{ "open_read_close_100", test_open_read_close, .t_flags = FLAG_PATH,
+	    .t_int = 100 },
+	{ "open_read_close_1000", test_open_read_close, .t_flags = FLAG_PATH,
+	    .t_int = 1000 },
+	{ "open_read_close_10000", test_open_read_close,
+	    .t_flags = FLAG_PATH, .t_int = 10000 },
+	{ "open_read_close_100000", test_open_read_close,
+	    .t_flags = FLAG_PATH, .t_int = 100000 },
+	{ "open_read_close_1000000", test_open_read_close,
+	    .t_flags = FLAG_PATH, .t_int = 1000000 },
+	{ "read_1", test_read, .t_flags = FLAG_PATH, .t_int = 1 },
+	{ "read_10", test_read, .t_flags = FLAG_PATH, .t_int = 10 },
+	{ "read_100", test_read, .t_flags = FLAG_PATH, .t_int = 100 },
+	{ "read_1000", test_read, .t_flags = FLAG_PATH, .t_int = 1000 },
+	{ "read_10000", test_read, .t_flags = FLAG_PATH, .t_int = 10000 },
+	{ "read_100000", test_read, .t_flags = FLAG_PATH, .t_int = 100000 },
+	{ "read_1000000", test_read, .t_flags = FLAG_PATH, .t_int = 1000000 },
 	{ "dup", test_dup },
 	{ "shmfd", test_shmfd },
 	{ "fstat_shmfd", test_fstat_shmfd },
@@ -603,9 +644,9 @@ main(int argc, char *argv[])
 	int ch, i, j, k;
 	uintmax_t iterations, loops;
 
-	alarm_timeout = 0;
+	alarm_timeout = 1;
 	iterations = 0;
-	loops = 0;
+	loops = 10;
 	path = NULL;
 	while ((ch = getopt(argc, argv, "i:l:p:s:")) != -1) {
 		switch (ch) {
@@ -652,10 +693,27 @@ main(int argc, char *argv[])
 	if (argc < 1)
 		usage();
 
+	/*
+	 * Validate test list and that, if a path is required, it is
+	 * defined.
+	 */
+	for (j = 0; j < argc; j++) {
+		the_test = NULL;
+		for (i = 0; i < tests_count; i++) {
+			if (strcmp(argv[j], tests[i].t_name) == 0)
+				the_test = &tests[i];
+		}
+		if (the_test == NULL)
+			usage();
+		if ((the_test->t_flags & FLAG_PATH) && (path == NULL)) {
+			errx(-1, "%s requires -p", the_test->t_name);
+		}
+	}
+
 	assert(clock_getres(CLOCK_REALTIME, &ts_res) == 0);
 	printf("Clock resolution: %ju.%09ju\n", (uintmax_t)ts_res.tv_sec,
 	    (uintmax_t)ts_res.tv_nsec);
-	printf("test\tloop\ttotal\titerations\tperiteration\n");
+	printf("test\tloop\ttime\titerations\tperiteration\n");
 
 	for (j = 0; j < argc; j++) {
 		uintmax_t calls, nsecsperit;
@@ -665,8 +723,6 @@ main(int argc, char *argv[])
 			if (strcmp(argv[j], tests[i].t_name) == 0)
 				the_test = &tests[i];
 		}
-		if (the_test == NULL)
-			usage();
 
 		/*
 		 * Run one warmup, then do the real thing (loops) times.


More information about the svn-src-all mailing list