diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2021-02-09 01:22:53 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2021-02-09 01:22:53 +0000 |
commit | 28d27daf0d8ff9ab8ee957a3f9917e2c2a23d232 (patch) | |
tree | cbbdd7eefff01b0d647a09cd56ac8baa9f8a659b /testing | |
parent | 245e8d347a48c70d5a2e047bf85b98609b64b900 (diff) | |
download | sg3_utils-28d27daf0d8ff9ab8ee957a3f9917e2c2a23d232.tar.gz |
sg_dd: add command timeout after comma in time= operand; testing/sg_mrq_dd+sgh_dd work
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@875 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'testing')
-rw-r--r-- | testing/Makefile | 7 | ||||
-rw-r--r-- | testing/sg_mrq_dd.cpp | 81 | ||||
-rw-r--r-- | testing/sgh_dd.cpp | 40 |
3 files changed, 91 insertions, 37 deletions
diff --git a/testing/Makefile b/testing/Makefile index 8383cc5b..ac152d8d 100644 --- a/testing/Makefile +++ b/testing/Makefile @@ -29,9 +29,11 @@ LD = $(CXX) CXXLD = $(CXX) CPPFLAGS = -iquote ../include -iquote .. -D_REENTRANT $(LARGE_FILE_FLAGS) -DHAVE_CONFIG_H -DHAVE_NVME -CXXFLAGS = -std=c++17 -pthread -ggdb -O2 -W -Wall -iquote ../include -D_REENTRANT $(LARGE_FILE_FLAGS) +CXXFLAGS = -std=c++11 -pthread -ggdb -O2 -W -Wall -iquote ../include -D_REENTRANT $(LARGE_FILE_FLAGS) +## CXXFLAGS = -std=c++14 -pthread -ggdb -O2 -W -Wall -iquote ../include -D_REENTRANT $(LARGE_FILE_FLAGS) +## CXXFLAGS = -std=c++17 -pthread -ggdb -O2 -W -Wall -iquote ../include -D_REENTRANT $(LARGE_FILE_FLAGS) +## CXXFLAGS = -std=c++20 -pthread -ggdb -O2 -W -Wall -iquote ../include -D_REENTRANT $(LARGE_FILE_FLAGS) # CXXFLAGS = -std=c++2a -pthread -ggdb -O2 -W -Wall -iquote ../include -D_REENTRANT $(LARGE_FILE_FLAGS) -# CXXFLAGS = -std=c++11 -pthread -ggdb -O2 -W -Wall -iquote ../include -D_REENTRANT $(LARGE_FILE_FLAGS) # CPPFLAGS = -iquote ../include -iquote .. -D_REENTRANT $(LARGE_FILE_FLAGS) -DHAVE_CONFIG_H -DHAVE_NVME -DDEBUG CFLAGS = -g -O2 -W -Wall # CFLAGS = -ggdb -O2 -W -Wall -DDEBUG @@ -39,6 +41,7 @@ CFLAGS = -g -O2 -W -Wall # CFLAGS = -g -O2 -Wall -pedantic # CFLAGS = -Wall -W -pedantic -std=c11 --analyze # CFLAGS = -Wall -W -pedantic -std=c++14 -fPIC +# CFLAGS = -Wall -W -pedantic -std=c++20 LDFLAGS = diff --git a/testing/sg_mrq_dd.cpp b/testing/sg_mrq_dd.cpp index 32f0f4d6..5beb9b31 100644 --- a/testing/sg_mrq_dd.cpp +++ b/testing/sg_mrq_dd.cpp @@ -30,7 +30,7 @@ * */ -static const char * version_str = "1.18 20210130"; +static const char * version_str = "1.19 20210208"; #define _XOPEN_SOURCE 600 #ifndef _GNU_SOURCE @@ -237,6 +237,7 @@ struct global_collection /* one instance visible to all threads */ mutex infant_mut; int bs; int bpt; + int cmd_timeout; /* in milliseconds */ int elem_sz; int outregfd; int outreg_type; @@ -252,6 +253,7 @@ struct global_collection /* one instance visible to all threads */ bool cdbsz_given; bool count_given; bool flexible; + bool mrq_hipri; bool ofile_given; bool unit_nanosec; /* default duration unit is millisecond */ bool no_waitq; /* if set use polling for response instead */ @@ -838,12 +840,13 @@ usage(int pg_num) "[--version]\n\n"); pr2serr(" [bpt=BPT] [cdbsz=6|10|12|16] [dio=0|1] " "[elemsz_kb=EKB]\n" - " [fua=0|1|2|3] [mrq=MRQ] [no_waitq=0|1] " - "[ofreg=OFREG]\n" - " [sync=0|1] [thr=THR] [time=0|1|2] " - "[verbose=VERB]\n" - " [--dry-run] [--pre-fetch] [--verbose] " - "[--version]\n\n" + " [fua=0|1|2|3] [hipri=NRQS] [mrq=NRQS] " + "[no_waitq=0|1]\n" + " [ofreg=OFREG] [sync=0|1] [thr=THR] " + "[time=0|1|2[,TO]]\n" + " [verbose=VERB] [--dry-run] [--pre-fetch] " + "[--verbose]\n" + " [--version]\n\n" " where: operands have the form name=value and are pecular to " "'dd'\n" " style commands, and options start with one or " @@ -899,8 +902,11 @@ page2: " 3->OFILE+IFILE\n" " ibs IFILE logical block size, cannot differ from " "obs or bs\n" - " mrq number of cmds placed in each sg call " - "(def: 16)\n" + " hipri similar to mrq=NRQS operand but does set mrq " + "hipri flag\n" + " mrq NRQS is number of cmds placed in each sg " + "ioctl\n" + " (def: 16). Does not set mrq hipri flag.\n" " if mrq=0 does one-by-one, blocking " "ioctl(SG_IO)s\n" " no_waitq=0|1 poll for completion when 1; def: 0 (use " @@ -915,7 +921,8 @@ page2: " thr is number of threads, must be > 0, default 4, " "max 1024\n" " time 0->no timing; 1/2->millisec/nanosec precision " - "(def: 1)\n" + "(def: 1);\n" + " TO is command timeout in seconds (def: 60)\n" " verbose increase verbosity (def: VERB=0)\n" " --dry-run|-d prepare but bypass copy/read\n" " --prefetch|-p with verify: do pre-fetch first\n" @@ -1904,7 +1911,7 @@ sg_half_segment_mrq0(Rq_elem * rep, scat_gath_iter & sg_it, bool is_wr, t_v4p->din_xfer_len = num * clp->bs; t_v4p->din_xferp = (uint64_t)(dp + (q_blks * clp->bs)); } - t_v4p->timeout = DEF_TIMEOUT; + t_v4p->timeout = clp->cmd_timeout; t_v4p->request_extra = pack_id_base + ++rep->mrq_pack_id_off; clp->most_recent_pack_id.store(t_v4p->request_extra); mrq0_again: @@ -2013,6 +2020,9 @@ sg_half_segment(Rq_elem * rep, scat_gath_iter & sg_it, bool is_wr, t_v4p->guard = 'Q'; t_v4p->flags = rflags; t_v4p->request_len = cdbsz; + t_v4p->response = (uint64_t)rep->sb; + t_v4p->max_response_len = sizeof(rep->sb); + t_v4p->flags = rflags; t_v4p->usr_ptr = (uint64_t)&a_cdb[a_cdb.size() - 1]; if (is_wr) { t_v4p->dout_xfer_len = num * clp->bs; @@ -2021,7 +2031,7 @@ sg_half_segment(Rq_elem * rep, scat_gath_iter & sg_it, bool is_wr, t_v4p->din_xfer_len = num * clp->bs; t_v4p->din_xferp = (uint64_t)(dp + (mrq_q_blks * clp->bs)); } - t_v4p->timeout = DEF_TIMEOUT; + t_v4p->timeout = clp->cmd_timeout; mrq_q_blks += num; t_v4p->request_extra = mrq_pack_id_base + ++rep->mrq_pack_id_off; clp->most_recent_pack_id.store(t_v4p->request_extra); @@ -2050,8 +2060,8 @@ sg_half_segment(Rq_elem * rep, scat_gath_iter & sg_it, bool is_wr, ctl_v4.flags = SGV4_FLAG_MULTIPLE_REQS; if (! flagsp->coe) ctl_v4.flags |= SGV4_FLAG_STOP_IF; - if (flagsp->hipri) - rflags |= SGV4_FLAG_HIPRI; + if (clp->mrq_hipri) + ctl_v4.flags |= SGV4_FLAG_HIPRI; ctl_v4.dout_xferp = (uint64_t)a_v4.data(); /* request array */ ctl_v4.dout_xfer_len = a_v4.size() * sizeof(struct sg_io_v4); ctl_v4.din_xferp = (uint64_t)a_v4.data(); /* response array */ @@ -2434,7 +2444,7 @@ do_both_sg_segment_mrq0(Rq_elem * rep, scat_gath_iter & i_sg_it, t_v4p->flags = iflags; t_v4p->request_len = cdbsz; t_v4p->din_xfer_len = num * clp->bs; - t_v4p->timeout = DEF_TIMEOUT; + t_v4p->timeout = clp->cmd_timeout; t_v4p->request_extra = pack_id_base + ++rep->mrq_pack_id_off; clp->most_recent_pack_id.store(t_v4p->request_extra); mrq0_again: @@ -2481,10 +2491,11 @@ mrq0_again: t_v4p->request = (uint64_t)t_cdb.data(); t_v4p->usr_ptr = t_v4p->request; t_v4p->response = (uint64_t)rep->sb; + t_v4p->max_response_len = sizeof(rep->sb); t_v4p->flags = oflags; t_v4p->request_len = cdbsz; t_v4p->dout_xfer_len = num * clp->bs; - t_v4p->timeout = DEF_TIMEOUT; + t_v4p->timeout = clp->cmd_timeout; t_v4p->request_extra = pack_id_base + ++rep->mrq_pack_id_off; clp->most_recent_pack_id.store(t_v4p->request_extra); mrq0_again2: @@ -2614,9 +2625,11 @@ do_both_sg_segment(Rq_elem * rep, scat_gath_iter & i_sg_it, t_v4p->guard = 'Q'; t_v4p->flags = iflags; t_v4p->request_len = cdbsz; + t_v4p->response = (uint64_t)rep->sb; + t_v4p->max_response_len = sizeof(rep->sb); t_v4p->usr_ptr = (uint64_t)&a_cdb[a_cdb.size() - 1]; t_v4p->din_xfer_len = num * clp->bs; - t_v4p->timeout = DEF_TIMEOUT; + t_v4p->timeout = clp->cmd_timeout; in_mrq_q_blks += num; t_v4p->request_extra = mrq_pack_id_base + ++rep->mrq_pack_id_off; clp->most_recent_pack_id.store(t_v4p->request_extra); @@ -2638,9 +2651,11 @@ do_both_sg_segment(Rq_elem * rep, scat_gath_iter & i_sg_it, t_v4p->guard = 'Q'; t_v4p->flags = oflags; t_v4p->request_len = cdbsz; + t_v4p->response = (uint64_t)rep->sb; + t_v4p->max_response_len = sizeof(rep->sb); t_v4p->usr_ptr = (uint64_t)&a_cdb[a_cdb.size() - 1]; t_v4p->dout_xfer_len = num * clp->bs; - t_v4p->timeout = DEF_TIMEOUT; + t_v4p->timeout = clp->cmd_timeout; out_mrq_q_blks += num; t_v4p->request_extra = mrq_pack_id_base + ++rep->mrq_pack_id_off; clp->most_recent_pack_id.store(t_v4p->request_extra); @@ -2677,7 +2692,7 @@ do_both_sg_segment(Rq_elem * rep, scat_gath_iter & i_sg_it, ctl_v4.flags |= SGV4_FLAG_STOP_IF; if ((! clp->verify) && clp->out_flags.order) ctl_v4.flags |= SGV4_FLAG_ORDERED_WR; - if (! (iflagsp->hipri || oflagsp->hipri)) + if (clp->mrq_hipri) ctl_v4.flags |= SGV4_FLAG_HIPRI; ctl_v4.dout_xferp = (uint64_t)a_v4.data(); /* request array */ ctl_v4.dout_xfer_len = a_v4.size() * sizeof(struct sg_io_v4); @@ -3309,12 +3324,13 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp, pr2serr("%sbad argument to 'iflag='\n", my_name); goto syn_err; } - } else if (0 == strcmp(key, "mrq")) { + } else if ((0 == strcmp(key, "hipri")) || + (0 == strcmp(key, "mrq"))) { if (isdigit(buf[0])) cp = buf; else { - pr2serr("%sonly mrq=NRQS which is a number allowed here\n", - my_name); + pr2serr("%sonly mrq=NRQS or hipri=NRQS which is a number " + "allowed here\n", my_name); goto syn_err; } clp->mrq_num = sg_get_num(cp); @@ -3327,6 +3343,8 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp, clp->mrq_num = 1; pr2serr("note: send single, non-mrq commands\n"); } + if ('h' == key[0]) + clp->mrq_hipri = true; } else if ((0 == strcmp(key, "no_waitq")) || (0 == strcmp(key, "no-waitq"))) { n = sg_get_num(buf); @@ -3384,9 +3402,23 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp, do_sync = !! sg_get_num(buf); else if (0 == strcmp(key, "thr")) num_threads = sg_get_num(buf); - else if (0 == strcmp(key, "time")) + else if (0 == strcmp(key, "time")) { + const char * ccp = strchr(buf, ','); + do_time = sg_get_num(buf); - else if (0 == strncmp(key, "verb", 4)) + if (do_time < 0) { + pr2serr("%sbad argument to 'time=0|1|2'\n", my_name); + goto syn_err; + } + if (ccp) { + n = sg_get_num(ccp + 1); + if (n < 0) { + pr2serr("%sbad argument to 'time=0|1|2,TO'\n", my_name); + goto syn_err; + } + clp->cmd_timeout = n ? (n * 1000) : DEF_TIMEOUT; + } + } else if (0 == strncmp(key, "verb", 4)) clp->verbose = sg_get_num(buf); else if ((keylen > 1) && ('-' == key[0]) && ('-' != key[1])) { res = 0; @@ -3794,6 +3826,7 @@ main(int argc, char * argv[]) /* memset(clp, 0, sizeof(*clp)); */ clp->dd_count = SG_COUNT_INDEFINITE; clp->bpt = DEF_BLOCKS_PER_TRANSFER; + clp->cmd_timeout = DEF_TIMEOUT; clp->in_type = FT_FIFO; /* change dd's default: if of=OFILE not given, assume /dev/null */ clp->out_type = FT_DEV_NULL; diff --git a/testing/sgh_dd.cpp b/testing/sgh_dd.cpp index f0b145f8..35358352 100644 --- a/testing/sgh_dd.cpp +++ b/testing/sgh_dd.cpp @@ -36,7 +36,7 @@ * renamed [20181221] */ -static const char * version_str = "1.98 20210106"; +static const char * version_str = "1.98 20210108"; #define _XOPEN_SOURCE 600 #ifndef _GNU_SOURCE @@ -231,6 +231,7 @@ struct global_collection pthread_mutex_t out2_mutex; int bs; int bpt; + int cmd_timeout; /* in milliseconds */ int outregfd; int outreg_type; int ofsplit; @@ -912,11 +913,12 @@ usage(int pg_num) "[fua=0|1|2|3]\n" " [mrq=[I|O,]NRQS[,C]] [noshare=0|1] " "[of2=OFILE2]\n" - " [ofreg=OFREG] [ofsplit=OSP] [sync=0|1] [thr=THR] " - "[time=0|1|2]\n" - " [unshare=1|0] [verbose=VERB] [--dry-run] " - "[--prefetch]\n" - " [--verbose] [--verify] [--version]\n\n" + " [ofreg=OFREG] [ofsplit=OSP] [sync=0|1] " + "[thr=THR]\n" + " [time=0|1|2[,TO]] [unshare=1|0] [verbose=VERB] " + "[--dry-run]\n" + " [--prefetch] [--verbose] [--verify] " + "[--version]\n\n" " where the main options (shown in first group above) are:\n" " bs must be device logical block size (default " "512)\n" @@ -996,7 +998,9 @@ page2: " thr is number of threads, must be > 0, default 4, " "max 1024\n" " time 0->no timing, 1->calc throughput(def), " - "2->nanosec precision\n" + "2->nanosec\n" + " precision; TO is command timeout in seconds " + "(def: 60)\n" " unshare 0->don't explicitly unshare after share; 1->let " "close do\n" " file unshare (default)\n" @@ -3164,7 +3168,7 @@ sg_start_io(Rq_elem * rep, mrq_arr_t & def_arr, int & pack_id, hp->dxfer_direction = SG_DXFER_TO_DEV; hp->mx_sb_len = sizeof(rep->sb); hp->sbp = rep->sb; - hp->timeout = DEF_TIMEOUT; + hp->timeout = clp->cmd_timeout; hp->usr_ptr = rep; hp->pack_id = pack_id; hp->flags = flags; @@ -3215,7 +3219,7 @@ do_v4: } h4p->max_response_len = sizeof(rep->sb); h4p->response = (uint64_t)rep->sb; - h4p->timeout = DEF_TIMEOUT; + h4p->timeout = clp->cmd_timeout; h4p->usr_ptr = (uint64_t)rep; h4p->request_extra = pack_id; /* this is the pack_id */ h4p->flags = flags; @@ -4060,9 +4064,22 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp, do_sync = !! sg_get_num(buf); else if (0 == strcmp(key, "thr")) num_threads = sg_get_num(buf); - else if (0 == strcmp(key, "time")) + else if (0 == strcmp(key, "time")) { do_time = sg_get_num(buf); - else if (0 == strcmp(key, "unshare")) + if (do_time < 0) { + pr2serr("%sbad argument to 'time=0|1|2'\n", my_name); + return SG_LIB_SYNTAX_ERROR; + } + cp = strchr(buf, ','); + if (cp) { + n = sg_get_num(cp + 1); + if (n < 0) { + pr2serr("%sbad argument to 'time=0|1|2,TO'\n", my_name); + return SG_LIB_SYNTAX_ERROR; + } + clp->cmd_timeout = n ? (n * 1000) : DEF_TIMEOUT; + } + } else if (0 == strcmp(key, "unshare")) clp->unshare = !! sg_get_num(buf); /* default: true */ else if (0 == strncmp(key, "verb", 4)) clp->verbose = sg_get_num(buf); @@ -4273,6 +4290,7 @@ main(int argc, char * argv[]) /* memset(clp, 0, sizeof(*clp)); */ memset(thread_arr, 0, sizeof(thread_arr)); clp->bpt = DEF_BLOCKS_PER_TRANSFER; + clp->cmd_timeout = DEF_TIMEOUT; clp->in_type = FT_OTHER; /* change dd's default: if of=OFILE not given, assume /dev/null */ clp->out_type = FT_DEV_NULL; |