From 4ddcd8da287c26e7baf866b8b7c67dc8afe3df3d Mon Sep 17 00:00:00 2001 From: Stephen Bates Date: Sat, 7 Feb 2015 03:52:24 +0000 Subject: [PATCH] Regression and improvements to nvme-read and nvme-write Added a short pass/fail regression for commit testing. Added the ability to show and dry-run submit_io commands. --- Makefile | 4 ++-- nvme.c | 33 ++++++++++++++++++++++++++++++--- regress | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) create mode 100755 regress diff --git a/Makefile b/Makefile index 5354fa20..17ad324b 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -CFLAGS := -m64 -O2 -g -pthread -D_GNU_SOURCE -D_REENTRANT -Wall +CFLAGS := -m64 -O2 -g -pthread -D_GNU_SOURCE -D_REENTRANT -Wall -Werror LDFLAGS := -m64 -lm NVME = nvme INSTALL ?= install @@ -11,7 +11,7 @@ doc: $(NVME) all: doc clean: - rm -f $(NVME) *.o + rm -f $(NVME) *.o *~ $(MAKE) -C Documentation clean clobber: clean diff --git a/nvme.c b/nvme.c index bfe60e30..d88027c5 100644 --- a/nvme.c +++ b/nvme.c @@ -1698,7 +1698,7 @@ static int submit_io(int opcode, char *command, int argc, char **argv) struct nvme_user_io io; void *buffer; int err, opt, dfd = opcode & 1 ? STDIN_FILENO : STDOUT_FILENO, - long_index = 0; + show = 0, dry_run = 0, long_index = 0; unsigned int data_size = 0; __u8 prinfo = 0; @@ -1714,11 +1714,13 @@ static int submit_io(int opcode, char *command, int argc, char **argv) {"app-tag", required_argument, 0, 'a'}, {"limited-retry", no_argument, 0, 'l'}, {"force-unit-access", no_argument, 0, 'f'}, + {"show-command", no_argument, 0, 'v'}, + {"dry-run", no_argument, 0, 'w'}, { 0, 0, 0, 0} }; memset(&io, 0, sizeof(io)); - while ((opt = getopt_long(argc, (char **)argv, "p:s:c:z:r:d:m:a:lf", opts, + while ((opt = getopt_long(argc, (char **)argv, "p:s:c:z:r:d:m:a:lfvw", opts, &long_index)) != -1) { switch(opt) { case 's': get_long(optarg, &io.slba); break; @@ -1740,12 +1742,17 @@ static int submit_io(int opcode, char *command, int argc, char **argv) io.control | NVME_RW_FUA; break; case 'd': - dfd = open(optarg, O_RDONLY); + if (opcode & 1) + dfd = open(optarg, O_RDONLY); + else + dfd = open(optarg, O_WRONLY | O_CREAT); if (dfd < 0) { perror(optarg); return EINVAL; } break; + case 'v': show = 1; break; + case 'w': dry_run = 1; break; default: return EINVAL; } @@ -1764,6 +1771,24 @@ static int submit_io(int opcode, char *command, int argc, char **argv) io.opcode = opcode; io.addr = (__u64)buffer; + + if (show) { + printf("opcode : %02x\n" , io.opcode); + printf("flags : %02x\n" , io.flags); + printf("control : %04x\n" , io.control); + printf("nblocks : %04x\n" , io.nblocks); + printf("rsvd : %04x\n" , io.rsvd); + printf("metadata : %p\n" , (void *)io.metadata); + printf("addr : %p\n" , (void *)io.addr); + printf("sbla : %p\n" , (void *)io.slba); + printf("dsmgmt : %08x\n" , io.dsmgmt); + printf("reftag : %08x\n" , io.reftag); + printf("apptag : %04x\n" , io.apptag); + printf("appmask : %04x\n" , io.appmask); + if (dry_run) + goto free_and_return; + } + err = ioctl(fd, NVME_IOCTL_SUBMIT_IO, &io); if (err < 0) perror("ioctl"); @@ -1776,6 +1801,8 @@ static int submit_io(int opcode, char *command, int argc, char **argv) } else printf("%s: success\n", command); } + free_and_return: + free(buffer); return 0; } diff --git a/regress b/regress new file mode 100755 index 00000000..a90ca3d3 --- /dev/null +++ b/regress @@ -0,0 +1,38 @@ +#!/bin/bash + +RAND_BASE=temp.rand +RAND_WFILE=${RAND_BASE}.write +RAND_RFILE=${RAND_BASE}.read +RAND_SIZE=512 + +green=$(tput bold)$(tput setaf 2) +red=$(tput bold)$(tput setaf 1) +rst=$(tput sgr0) + +function print_pass_fail { + $* > /dev/null 2>&1 + if (( $? )); then + echo ${red}"FAILED!"${rst} + echo "Failed running command: " + echo " $*" + exit 1 + else + echo ${green}"PASSED!"${rst} + fi +} + +function run_test { + LINE="$*" + printf " %-3s %-68s : " "RUN" "${LINE::67}" + print_pass_fail $* +} + +make clean > /dev/null || exit -1 +make install > /dev/null || exit -1 + +run_test dd if=/dev/urandom of=${RAND_WFILE} bs=${RAND_SIZE} count=1 +run_test nvme write /dev/nvme0n1 --start-block=0 --block-count=0 --data-size=${RAND_SIZE} --data ${RAND_WFILE} +run_test nvme read /dev/nvme0n1 --start-block=0 --block-count=0 --data-size=${RAND_SIZE} --data ${RAND_RFILE} +run_test diff ${RAND_RFILE} ${RAND_WFILE} + +rm ${RAND_RFILE} ${RAND_WFILE} > /dev/null \ No newline at end of file -- 2.50.1