svn commit: r252267 - head/sbin/nvmecontrol

Jim Harris jimharris at FreeBSD.org
Wed Jun 26 23:02:49 UTC 2013


Author: jimharris
Date: Wed Jun 26 23:02:48 2013
New Revision: 252267
URL: http://svnweb.freebsd.org/changeset/base/252267

Log:
  Break out code related to the perftest command into a separate file.
  
  Sponsored by:	Intel
  MFC after:	3 days

Added:
  head/sbin/nvmecontrol/perftest.c   (contents, props changed)
Modified:
  head/sbin/nvmecontrol/Makefile
  head/sbin/nvmecontrol/nvmecontrol.c
  head/sbin/nvmecontrol/nvmecontrol.h

Modified: head/sbin/nvmecontrol/Makefile
==============================================================================
--- head/sbin/nvmecontrol/Makefile	Wed Jun 26 23:00:42 2013	(r252266)
+++ head/sbin/nvmecontrol/Makefile	Wed Jun 26 23:02:48 2013	(r252267)
@@ -1,7 +1,7 @@
 # $FreeBSD$
 
 PROG=	nvmecontrol
-SRCS=	nvmecontrol.c devlist.c identify.c
+SRCS=	nvmecontrol.c devlist.c identify.c perftest.c
 MAN=	nvmecontrol.8
 
 .include <bsd.prog.mk>

Modified: head/sbin/nvmecontrol/nvmecontrol.c
==============================================================================
--- head/sbin/nvmecontrol/nvmecontrol.c	Wed Jun 26 23:00:42 2013	(r252266)
+++ head/sbin/nvmecontrol/nvmecontrol.c	Wed Jun 26 23:02:48 2013	(r252267)
@@ -44,8 +44,6 @@ __FBSDID("$FreeBSD$");
 
 #include "nvmecontrol.h"
 
-static void perftest_usage(void);
-
 static void
 usage(void)
 {
@@ -136,143 +134,6 @@ open_dev(const char *str, int *fd, int s
 }
 
 static void
-print_perftest(struct nvme_io_test *io_test, bool perthread)
-{
-	uint32_t i, io_completed = 0, iops, mbps;
-
-	for (i = 0; i < io_test->num_threads; i++)
-		io_completed += io_test->io_completed[i];
-
-	iops = io_completed/io_test->time;
-	mbps = iops * io_test->size / (1024*1024);
-
-	printf("Threads: %2d Size: %6d %5s Time: %3d IO/s: %7d MB/s: %4d\n",
-	    io_test->num_threads, io_test->size,
-	    io_test->opc == NVME_OPC_READ ? "READ" : "WRITE",
-	    io_test->time, iops, mbps);
-
-	if (perthread)
-		for (i = 0; i < io_test->num_threads; i++)
-			printf("\t%3d: %8d IO/s\n", i,
-			    io_test->io_completed[i]/io_test->time);
-
-	exit(1);
-}
-
-static void
-perftest_usage(void)
-{
-	fprintf(stderr, "usage:\n");
-	fprintf(stderr, PERFTEST_USAGE);
-	exit(EX_USAGE);
-}
-
-static void
-perftest(int argc, char *argv[])
-{
-	struct nvme_io_test		io_test;
-	int				fd;
-	char				ch;
-	char				*p;
-	u_long				ioctl_cmd = NVME_IO_TEST;
-	bool				nflag, oflag, sflag, tflag;
-	int				perthread = 0;
-
-	nflag = oflag = sflag = tflag = false;
-
-	memset(&io_test, 0, sizeof(io_test));
-
-	while ((ch = getopt(argc, argv, "f:i:n:o:ps:t:")) != -1) {
-		switch (ch) {
-		case 'f':
-			if (!strcmp(optarg, "refthread"))
-				io_test.flags |= NVME_TEST_FLAG_REFTHREAD;
-			break;
-		case 'i':
-			if (!strcmp(optarg, "bio") ||
-			    !strcmp(optarg, "wait"))
-				ioctl_cmd = NVME_BIO_TEST;
-			else if (!strcmp(optarg, "io") ||
-				 !strcmp(optarg, "intr"))
-				ioctl_cmd = NVME_IO_TEST;
-			break;
-		case 'n':
-			nflag = true;
-			io_test.num_threads = strtoul(optarg, &p, 0);
-			if (p != NULL && *p != '\0') {
-				fprintf(stderr,
-				    "\"%s\" not valid number of threads.\n",
-				    optarg);
-				perftest_usage();
-			} else if (io_test.num_threads == 0 ||
-				   io_test.num_threads > 128) {
-				fprintf(stderr,
-				    "\"%s\" not valid number of threads.\n",
-				    optarg);
-				perftest_usage();
-			}
-			break;
-		case 'o':
-			oflag = true;
-			if (!strcmp(optarg, "read") || !strcmp(optarg, "READ"))
-				io_test.opc = NVME_OPC_READ;
-			else if (!strcmp(optarg, "write") ||
-				 !strcmp(optarg, "WRITE"))
-				io_test.opc = NVME_OPC_WRITE;
-			else {
-				fprintf(stderr, "\"%s\" not valid opcode.\n",
-				    optarg);
-				perftest_usage();
-			}
-			break;
-		case 'p':
-			perthread = 1;
-			break;
-		case 's':
-			sflag = true;
-			io_test.size = strtoul(optarg, &p, 0);
-			if (p == NULL || *p == '\0' || toupper(*p) == 'B') {
-				// do nothing
-			} else if (toupper(*p) == 'K') {
-				io_test.size *= 1024;
-			} else if (toupper(*p) == 'M') {
-				io_test.size *= 1024 * 1024;
-			} else {
-				fprintf(stderr, "\"%s\" not valid size.\n",
-				    optarg);
-				perftest_usage();
-			}
-			break;
-		case 't':
-			tflag = true;
-			io_test.time = strtoul(optarg, &p, 0);
-			if (p != NULL && *p != '\0') {
-				fprintf(stderr,
-				    "\"%s\" not valid time duration.\n",
-				    optarg);
-				perftest_usage();
-			}
-			break;
-		}
-	}
-
-	if (!nflag || !oflag || !sflag || !tflag || optind >= argc)
-		perftest_usage();
-
-	open_dev(argv[optind], &fd, 1, 1);
-	if (ioctl(fd, ioctl_cmd, &io_test) < 0) {
-		fprintf(stderr, "NVME_IO_TEST failed. errno=%d (%s)\n", errno,
-		    strerror(errno));
-		close(fd);
-		exit(EX_IOERR);
-	}
-
-	close(fd);
-	print_perftest(&io_test, perthread);
-	exit(EX_OK);
-}
-
-static void
 reset_usage(void)
 {
 	fprintf(stderr, "usage:\n");

Modified: head/sbin/nvmecontrol/nvmecontrol.h
==============================================================================
--- head/sbin/nvmecontrol/nvmecontrol.h	Wed Jun 26 23:00:42 2013	(r252266)
+++ head/sbin/nvmecontrol/nvmecontrol.h	Wed Jun 26 23:02:48 2013	(r252267)
@@ -52,6 +52,7 @@ void read_namespace_data(int fd, int nsi
 
 void devlist(int argc, char *argv[]);
 void identify(int argc, char *argv[]);
+void perftest(int argc, char *argv[]);
 
 #endif
 

Added: head/sbin/nvmecontrol/perftest.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sbin/nvmecontrol/perftest.c	Wed Jun 26 23:02:48 2013	(r252267)
@@ -0,0 +1,181 @@
+/*-
+ * Copyright (C) 2012-2013 Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/ioccom.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+#include "nvmecontrol.h"
+
+static void
+print_perftest(struct nvme_io_test *io_test, bool perthread)
+{
+	uint32_t i, io_completed = 0, iops, mbps;
+
+	for (i = 0; i < io_test->num_threads; i++)
+		io_completed += io_test->io_completed[i];
+
+	iops = io_completed/io_test->time;
+	mbps = iops * io_test->size / (1024*1024);
+
+	printf("Threads: %2d Size: %6d %5s Time: %3d IO/s: %7d MB/s: %4d\n",
+	    io_test->num_threads, io_test->size,
+	    io_test->opc == NVME_OPC_READ ? "READ" : "WRITE",
+	    io_test->time, iops, mbps);
+
+	if (perthread)
+		for (i = 0; i < io_test->num_threads; i++)
+			printf("\t%3d: %8d IO/s\n", i,
+			    io_test->io_completed[i]/io_test->time);
+
+	exit(1);
+}
+
+static void
+perftest_usage(void)
+{
+	fprintf(stderr, "usage:\n");
+	fprintf(stderr, PERFTEST_USAGE);
+	exit(EX_USAGE);
+}
+
+void
+perftest(int argc, char *argv[])
+{
+	struct nvme_io_test		io_test;
+	int				fd;
+	char				ch;
+	char				*p;
+	u_long				ioctl_cmd = NVME_IO_TEST;
+	bool				nflag, oflag, sflag, tflag;
+	int				perthread = 0;
+
+	nflag = oflag = sflag = tflag = false;
+
+	memset(&io_test, 0, sizeof(io_test));
+
+	while ((ch = getopt(argc, argv, "f:i:n:o:ps:t:")) != -1) {
+		switch (ch) {
+		case 'f':
+			if (!strcmp(optarg, "refthread"))
+				io_test.flags |= NVME_TEST_FLAG_REFTHREAD;
+			break;
+		case 'i':
+			if (!strcmp(optarg, "bio") ||
+			    !strcmp(optarg, "wait"))
+				ioctl_cmd = NVME_BIO_TEST;
+			else if (!strcmp(optarg, "io") ||
+				 !strcmp(optarg, "intr"))
+				ioctl_cmd = NVME_IO_TEST;
+			break;
+		case 'n':
+			nflag = true;
+			io_test.num_threads = strtoul(optarg, &p, 0);
+			if (p != NULL && *p != '\0') {
+				fprintf(stderr,
+				    "\"%s\" not valid number of threads.\n",
+				    optarg);
+				perftest_usage();
+			} else if (io_test.num_threads == 0 ||
+				   io_test.num_threads > 128) {
+				fprintf(stderr,
+				    "\"%s\" not valid number of threads.\n",
+				    optarg);
+				perftest_usage();
+			}
+			break;
+		case 'o':
+			oflag = true;
+			if (!strcmp(optarg, "read") || !strcmp(optarg, "READ"))
+				io_test.opc = NVME_OPC_READ;
+			else if (!strcmp(optarg, "write") ||
+				 !strcmp(optarg, "WRITE"))
+				io_test.opc = NVME_OPC_WRITE;
+			else {
+				fprintf(stderr, "\"%s\" not valid opcode.\n",
+				    optarg);
+				perftest_usage();
+			}
+			break;
+		case 'p':
+			perthread = 1;
+			break;
+		case 's':
+			sflag = true;
+			io_test.size = strtoul(optarg, &p, 0);
+			if (p == NULL || *p == '\0' || toupper(*p) == 'B') {
+				// do nothing
+			} else if (toupper(*p) == 'K') {
+				io_test.size *= 1024;
+			} else if (toupper(*p) == 'M') {
+				io_test.size *= 1024 * 1024;
+			} else {
+				fprintf(stderr, "\"%s\" not valid size.\n",
+				    optarg);
+				perftest_usage();
+			}
+			break;
+		case 't':
+			tflag = true;
+			io_test.time = strtoul(optarg, &p, 0);
+			if (p != NULL && *p != '\0') {
+				fprintf(stderr,
+				    "\"%s\" not valid time duration.\n",
+				    optarg);
+				perftest_usage();
+			}
+			break;
+		}
+	}
+
+	if (!nflag || !oflag || !sflag || !tflag || optind >= argc)
+		perftest_usage();
+
+	open_dev(argv[optind], &fd, 1, 1);
+	if (ioctl(fd, ioctl_cmd, &io_test) < 0) {
+		fprintf(stderr, "NVME_IO_TEST failed. errno=%d (%s)\n", errno,
+		    strerror(errno));
+		close(fd);
+		exit(EX_IOERR);
+	}
+
+	close(fd);
+	print_perftest(&io_test, perthread);
+	exit(EX_OK);
+}


More information about the svn-src-all mailing list