diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2019-12-06 19:21:44 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2019-12-06 19:21:44 +0000 |
commit | 4b4f37348b25f04b6f2f898aeebc6f5246e56831 (patch) | |
tree | af52b1a76e9aa3e80891125a8455218f74b776ca /testing | |
parent | 207e52594d920e902f839b8e1aeac0e0abc476f5 (diff) | |
download | sg3_utils-4b4f37348b25f04b6f2f898aeebc6f5246e56831.tar.gz |
changes for zbc2r04, awaiting new mode page number; sgh_dd
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@836 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'testing')
-rw-r--r-- | testing/Makefile | 4 | ||||
-rw-r--r-- | testing/sgh_dd.cpp | 107 |
2 files changed, 86 insertions, 25 deletions
diff --git a/testing/Makefile b/testing/Makefile index 34c746c2..a9718f8c 100644 --- a/testing/Makefile +++ b/testing/Makefile @@ -28,10 +28,10 @@ LD = $(CXX) CXXLD = $(CXX) CPPFLAGS = -iquote ../include -iquote .. -D_REENTRANT $(LARGE_FILE_FLAGS) -DHAVE_CONFIG_H -DHAVE_NVME -CXXFLAGS = -std=c++17 -pthread -g -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) # CPPFLAGS = -iquote ../include -iquote .. -D_REENTRANT $(LARGE_FILE_FLAGS) -DHAVE_CONFIG_H -DHAVE_NVME -DDEBUG # CFLAGS = -g -O2 -W -Wall -CFLAGS = -g -O2 -W -Wall -DDEBUG +CFLAGS = -ggdb -O2 -W -Wall -DDEBUG # CFLAGS = -g -O2 -Wall -DSG_KERNEL_INCLUDES # CFLAGS = -g -O2 -Wall -pedantic # CFLAGS = -Wall -W -pedantic -std=c11 --analyze diff --git a/testing/sgh_dd.cpp b/testing/sgh_dd.cpp index f21ad456..d512aac1 100644 --- a/testing/sgh_dd.cpp +++ b/testing/sgh_dd.cpp @@ -108,7 +108,7 @@ using namespace std; -static const char * version_str = "1.53 20191119"; +static const char * version_str = "1.55 20191201"; #ifdef __GNUC__ #ifndef __clang__ @@ -174,6 +174,7 @@ struct flags_t { bool masync; /* more async sg v4 driver flag */ bool mmap; bool mrq_immed; /* mrq submit non-blocking */ + bool mrq_svb; /* mrq shared_variable_block, for sg->sg copy */ bool no_dur; bool noshare; bool no_unshare; /* leave it for driver close/release */ @@ -336,6 +337,7 @@ static atomic<int> num_abort_req(0); static atomic<int> num_abort_req_success(0); static atomic<int> num_mrq_abort_req(0); static atomic<int> num_mrq_abort_req_success(0); +static atomic<long> num_waiting_calls(0); static sigset_t signal_set; static pthread_t sig_listen_thread_id; @@ -374,11 +376,18 @@ static int64_t dd_count = -1; static int num_threads = DEF_NUM_THREADS; static int exit_status = 0; static volatile bool swait_reported = false; +static bool after1 = false; static mutex rand_lba_mutex; static const char * my_name = "sgh_dd: "; +static const char * mrq_blk_s = "mrq: ordinary blocking"; +static const char * mrq_vb_s = "mrq: variable blocking"; +static const char * mrq_svb_s = "mrq: shared variable blocking (svb)"; +static const char * mrq_s_nb_s = "mrq: submit non-blocking"; +static const char * mrq_nw_nb_s = "mrq: waitless non-blocking"; + #ifdef __GNUC__ static int pr2serr_lk(const char * fmt, ...) @@ -806,10 +815,10 @@ usage(int pg_num) " if file or device to read from (def: stdin)\n" " iflag comma separated list from: [coe,defres,dio," "direct,dpo,\n" - " dsync,excl,fua,masync,mmap,mrq_immed,nodur, " - "noshare\n" - " no_waitq,noxfer,null,qtail,same_fds,v3,v4," - "wq_excl]\n" + " dsync,excl,fua,masync,mmap,mrq_immed,mrq_svb," + "nodur,\n" + " noshare,no_waitq,noxfer,null,qtail,same_fds," + "v3,v4,wq_excl]\n" " of file or device to write to (def: /dev/null " "N.B. different\n" " from dd it defaults to stdout). If 'of=.' " @@ -898,6 +907,8 @@ page3: " mrq_immed if mrq active, do submit non-blocking (def: " "ordered\n" " blocking)\n" + " mrq_svb if mrq and sg->sg copy, do shared_variable_" + "blocking\n" " nodur turns off command duration calculations\n" " noshare if IFILE and OFILE are sg devices, don't set " "up sharing\n" @@ -1066,6 +1077,7 @@ mrq_abort_thread(void * v_maip) pr2serr_lk("%s: from_id=%d: to abort mrq_pack_id=%d\n", __func__, l_mai.from_tid, l_mai.mrq_id); res = ioctl(l_mai.fd, SG_GET_NUM_WAITING, &n); + ++num_waiting_calls; if (res < 0) { err = errno; pr2serr_lk("%s: ioctl(SG_GET_NUM_WAITING) failed: %s [%d]\n", @@ -1537,6 +1549,7 @@ fini: } if (own_infd && (rep->infd >= 0)) { if (vb && (FT_SG == clp->in_type)) { + ++num_waiting_calls; if (ioctl(rep->infd, SG_GET_NUM_WAITING, &n) >= 0) { if (n > 0) pr2serr_lk("%s: tid=%d: num_waiting=%d prior close(in)\n", @@ -1551,6 +1564,7 @@ fini: } if (own_outfd && (rep->outfd >= 0)) { if (vb && (FT_SG == clp->out_type)) { + ++num_waiting_calls; if (ioctl(rep->outfd, SG_GET_NUM_WAITING, &n) >= 0) { if (n > 0) pr2serr_lk("%s: tid=%d: num_waiting=%d prior " @@ -2066,10 +2080,19 @@ sgh_do_async_mrq(Rq_elem * rep, mrq_arr_t & def_arr, int fd, b_len = sizeof(b); a_v4p = def_arr.first.data(); ctlop->flags = SGV4_FLAG_MULTIPLE_REQS; - if (clp->in_flags.no_waitq || clp->out_flags.no_waitq) + if (clp->in_flags.no_waitq || clp->out_flags.no_waitq) { ctlop->flags |= SGV4_FLAG_NO_WAITQ; /* waitless non-blocking */ - else + if (!after1 && (clp->debug > 1)) { + after1 = true; + pr2serr_lk("%s: %s\n", __func__, mrq_nw_nb_s); + } + } else { ctlop->flags |= SGV4_FLAG_IMMED; /* submit non-blocking */ + if (!after1 && (clp->debug > 1)) { + after1 = true; + pr2serr_lk("%s: %s\n", __func__, mrq_s_nb_s); + } + } if (clp->debug > 4) { pr2serr_lk("%s: Controlling object _before_ ioctl(SG_IOSUBMIT):\n", __func__); @@ -2087,6 +2110,7 @@ sgh_do_async_mrq(Rq_elem * rep, mrq_arr_t & def_arr, int fd, } /* fetch first half */ for (k = 0; k < 100000; ++k) { + ++num_waiting_calls; res = ioctl(fd, SG_GET_NUM_WAITING, &nwait); if (res < 0) { err = errno; @@ -2154,6 +2178,7 @@ sgh_do_async_mrq(Rq_elem * rep, mrq_arr_t & def_arr, int fd, goto fini; /* fetch remaining */ for (k = 0; k < 100000; ++k) { + ++num_waiting_calls; res = ioctl(fd, SG_GET_NUM_WAITING, &nwait); if (res < 0) { pr2serr_lk("%s: ioctl(SG_GET_NUM_WAITING)-->%d, errno=%d: %s\n", @@ -2393,7 +2418,6 @@ sgh_do_deferred_mrq(Rq_elem * rep, mrq_arr_t & def_arr) sizeof(*aa_v4p), 1); } } - fd_ctl.flags = SGV4_FLAG_MULTIPLE_REQS; fd_ctl.dout_xferp = (uint64_t)aa_v4p; /* request array */ fd_ctl.dout_xfer_len = num_fd * sizeof(*aa_v4p); fd_ctl.din_xferp = (uint64_t)aa_v4p; /* response array */ @@ -2424,7 +2448,6 @@ sgh_do_deferred_mrq(Rq_elem * rep, mrq_arr_t & def_arr) sizeof(*aa_v4p), 1); } } - o_fd_ctl.flags = SGV4_FLAG_MULTIPLE_REQS; o_fd_ctl.dout_xferp = (uint64_t)aa_v4p; /* request array */ o_fd_ctl.dout_xfer_len = o_num_fd * sizeof(*aa_v4p); o_fd_ctl.din_xferp = (uint64_t)aa_v4p; /* response array */ @@ -2438,14 +2461,37 @@ sgh_do_deferred_mrq(Rq_elem * rep, mrq_arr_t & def_arr) goto fini; } - if (clp->unbalanced_mrq) + if (clp->unbalanced_mrq) { + if (!after1 && (clp->debug > 1)) { + after1 = true; + pr2serr_lk("%s: unbalanced %s\n", __func__, mrq_vb_s); + } res = ioctl(fd, SG_IOSUBMIT, &ctl_v4); - else { + } else { if (clp->mrq_async) { - iosub_str = "SUBMIT(variable)"; + iosub_str = "SUBMIT(variable_blocking)"; + if (!after1 && (clp->debug > 1)) { + after1 = true; + pr2serr_lk("%s: %s\n", __func__, mrq_vb_s); + } res = ioctl(fd, SG_IOSUBMIT, &ctl_v4); - } else + } else if (clp->in_flags.mrq_svb || clp->in_flags.mrq_svb) { + ctl_v4.flags |= SGV4_FLAG_SHARE; + iosub_str = "SUBMIT(shared_variable_blocking)"; + if (!after1 && (clp->debug > 1)) { + after1 = true; + pr2serr_lk("%s: %s\n", __func__, mrq_svb_s); + } +// v4hdr_out_lk("cop: shared_variable_blocking", &ctl_v4, id); + res = ioctl(fd, SG_IOSUBMIT, &ctl_v4); + } else { + iosub_str = "SG_IO(ordered_blocking)"; + if (!after1 && (clp->debug > 1)) { + after1 = true; + pr2serr_lk("%s: %s\n", __func__, mrq_blk_s); + } res = ioctl(fd, SG_IO, &ctl_v4); + } } if (res < 0) { pr2serr_lk("%s: ioctl(SG_IO%s, %s)-->%d, errno=%d: %s\n", @@ -2545,7 +2591,7 @@ sg_start_io(Rq_elem * rep, mrq_arr_t & def_arr, int & pack_id, crwp = "reading"; } if (qhead) - qtail = false; /* qhead takes precedence */ + qtail = false; /* qhead takes precedence */ if (sg_build_scsi_cdb(rep->cmd, cdbsz, rep->num_blks, blk, wr, fua, dpo)) { pr2serr_lk("%sbad cdb build, start_blk=%" PRId64 ", blocks=%d\n", @@ -2719,10 +2765,11 @@ do_v4: res = ioctl(fd, SG_IOABORT, h4p); if (res < 0) { err = errno; - if (ENODATA == err) - pr2serr_lk("%s: ioctl(SG_IOABORT) no match on " - "pack_id=%d\n", __func__, pack_id); - else + if (ENODATA == err) { + if (clp->debug > 2) + pr2serr_lk("%s: ioctl(SG_IOABORT) no match on " + "pack_id=%d\n", __func__, pack_id); + } else pr2serr_lk("%s: ioctl(SG_IOABORT) failed: %s [%d]\n", __func__, safe_strerror(err), err); } else { @@ -3177,6 +3224,10 @@ bypass: } } fini: + t = 1; + res = ioctl(fd, SG_SET_DEBUG, &t); /* more info in /proc/scsi/sg/debug */ + if (res < 0) + perror("sgh_dd: SG_SET_DEBUG error"); return (res < 0) ? 0 : num; } @@ -3220,8 +3271,12 @@ process_flags(const char * arg, struct flags_t * fp) fp->masync = true; else if (0 == strcmp(cp, "mmap")) fp->mmap = true; + else if (0 == strcmp(cp, "mrq_imm")) + fp->mrq_immed = true; else if (0 == strcmp(cp, "mrq_immed")) fp->mrq_immed = true; + else if (0 == strcmp(cp, "mrq_svb")) + fp->mrq_svb = true; else if (0 == strcmp(cp, "nodur")) fp->no_dur = true; else if (0 == strcmp(cp, "no_dur")) @@ -3596,11 +3651,11 @@ parse_cmdline_sanity(int argc, char * argv[], Gbl_coll * clp, char * inf, #endif if (version_given) { pr2serr("%s%s\n", my_name, version_str); - return 0; + return SG_LIB_OK_FALSE; } if (clp->help > 0) { usage(clp->help); - return 0; + return SG_LIB_OK_FALSE; } if (clp->bs <= 0) { clp->bs = DEF_BLOCK_SIZE; @@ -3724,6 +3779,8 @@ main(int argc, char * argv[]) } res = parse_cmdline_sanity(argc, argv, clp, inf, outf, out2f, outregf); + if (SG_LIB_OK_FALSE == res) + return 0; if (res) return res; @@ -4247,8 +4304,12 @@ fini: pr2serr("Number of successful MRQ Aborts: %d\n", num_mrq_abort_req_success.load()); } - if (clp->debug > 3) - pr2serr("Final pack_id=%d, mrq_id=%d\n", mono_pack_id.load(), - mono_mrq_id.load()); + if (clp->debug > 1) { + if (clp->debug > 3) + pr2serr("Final pack_id=%d, mrq_id=%d\n", mono_pack_id.load(), + mono_mrq_id.load()); + pr2serr("Number of SG_GET_NUM_WAITING calls=%ld\n", + num_waiting_calls.load()); + } return (res >= 0) ? res : SG_LIB_CAT_OTHER; } |