aboutsummaryrefslogtreecommitdiff
path: root/testing/sg_tst_async.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'testing/sg_tst_async.cpp')
-rw-r--r--testing/sg_tst_async.cpp46
1 files changed, 30 insertions, 16 deletions
diff --git a/testing/sg_tst_async.cpp b/testing/sg_tst_async.cpp
index 74123456..aa05ca95 100644
--- a/testing/sg_tst_async.cpp
+++ b/testing/sg_tst_async.cpp
@@ -89,7 +89,7 @@
#include "sg_pt.h"
#include "sg_cmds.h"
-static const char * version_str = "1.37 20190618";
+static const char * version_str = "1.38 20190728";
static const char * util_name = "sg_tst_async";
/* This is a test program for checking the async usage of the Linux sg
@@ -191,6 +191,7 @@ struct opts_t {
bool block;
bool cmd_time;
bool direct;
+ bool excl;
bool generic_sync;
bool masync;
bool mmap_io;
@@ -274,6 +275,7 @@ static struct option long_options[] = {
{"cmd-time", no_argument, 0, 'c'},
{"cmd_time", no_argument, 0, 'c'},
{"direct", no_argument, 0, 'd'},
+ {"excl", no_argument, 0, 'e'},
{"force", no_argument, 0, 'f'},
{"generic-sync", no_argument, 0, 'g'},
{"generic_sync", no_argument, 0, 'g'},
@@ -309,23 +311,24 @@ static struct option long_options[] = {
static void
usage(void)
{
- printf("Usage: %s [--cmd-time] [--direct] [--force] [--generic-sync]\n"
- " [--help] [--lba=LBA+] [--lbsz=LBSZ] "
- "[--masync]\n"
- " [--maxqpt=QPT] [--mmap-io] [--numpt=NPT] "
- "[--noxfer]\n"
- " [--override=OVN] [--pack-id] [--qat=AT] "
- "[-qfav=FAV]\n"
- " [--read] [--stats] [--submit] "
- "[--szlb=LB[,NLBS]]\n"
- " [--tnum=NT] [--tur] [--v3] [--v4] "
- "[--verbose]\n"
- " [--version] [--wait=MS] [--write] "
- "<sg_disk_device>*\n",
+ printf("Usage: %s [--cmd-time] [--direct] [--excl] [--force]\n"
+ " [--generic-sync] [--help] [--lba=LBA+] "
+ "[--lbsz=LBSZ]\n"
+ " [--masync] [--maxqpt=QPT] [--mmap-io] "
+ "[--numpt=NPT]\n"
+ " [--noxfer] [--override=OVN] [--pack-id] "
+ "[--qat=AT]\n"
+ " [-qfav=FAV] [--read] [--stats] [--submit]\n"
+ " [--szlb=LB[,NLBS]] [--tnum=NT] [--tur] "
+ "[--v3] [--v4]\n"
+ " [--verbose] [--version] [--wait=MS] "
+ "[--write]\n"
+ " <sg_disk_device>*\n",
util_name);
printf(" where\n");
printf(" --cmd-time|-c calculate per command average time (ns)\n");
printf(" --direct|-d do direct_io (def: indirect)\n");
+ printf(" --excl|-e do wait_exclusive calls\n");
printf(" --force|-f force: any sg device (def: only scsi_debug "
"owned)\n");
printf(" WARNING: <lba> written to if '-W' given\n");
@@ -883,6 +886,8 @@ work_sync_thread(int id, const char * dev_name, unsigned int /* hi_lba */,
pr_rusage(id);
goto err_out;
}
+ if (vb > 2)
+ pr2serr_lk(">>>> id=%d: open(%s) --> fd=%d\n", id, dev_name, sg_fd);
ptp = construct_scsi_pt_obj_with_fd(sg_fd, vb);
err = 0;
@@ -897,7 +902,7 @@ work_sync_thread(int id, const char * dev_name, unsigned int /* hi_lba */,
memset(cdb, 0, sizeof(cdb)); /* TUR's cdb is 6 zeros */
set_scsi_pt_cdb(ptp, cdb, sizeof(cdb));
set_scsi_pt_sense(ptp, sense_b, sizeof(sense_b));
- set_scsi_pt_packet_id(ptp, uniq_pack_id.fetch_add(1));
+ set_scsi_pt_packet_id(ptp, uniq_pack_id.fetch_add(1));
++thr_sync_starts;
rs = do_scsi_pt(ptp, -1, DEF_PT_TIMEOUT, vb);
n = sg_cmds_process_resp(ptp, "Test unit ready", rs,
@@ -1026,6 +1031,8 @@ work_thread(int id, struct opts_t * op)
pr_rusage(id);
return;
}
+ if (vb > 2)
+ pr2serr_lk(">>>> id=%d: open(%s) --> fd=%d\n", id, dev_name, sg_fd);
if (op->pack_id_force) {
k = 1;
if (ioctl(sg_fd, SG_SET_FORCE_PACK_ID, &k) < 0)
@@ -1054,6 +1061,10 @@ work_thread(int id, struct opts_t * op)
seip->ctl_flags_wr_mask |= SG_CTL_FLAGM_MORE_ASYNC;
seip->ctl_flags |= SG_CTL_FLAGM_MORE_ASYNC;
}
+ if (op->excl) {
+ seip->ctl_flags_wr_mask |= SG_CTL_FLAGM_EXCL_WAITQ;
+ seip->ctl_flags |= SG_CTL_FLAGM_EXCL_WAITQ;
+ }
if (ioctl(sg_fd, SG_SET_GET_EXTENDED, seip) < 0) {
pr2serr_lk("ioctl(EXTENDED(TIME_IN_NS)) failed, errno=%d %s\n",
errno, strerror(errno));
@@ -1764,7 +1775,7 @@ main(int argc, char * argv[])
while (1) {
int option_index = 0;
- c = getopt_long(argc, argv, "34acdfghl:L:mM:n:NO:pq:Q:Rs:St:TuvVw:W",
+ c = getopt_long(argc, argv, "34acdefghl:L:mM:n:NO:pq:Q:Rs:St:TuvVw:W",
long_options, &option_index);
if (c == -1)
break;
@@ -1791,6 +1802,9 @@ main(int argc, char * argv[])
case 'd':
op->direct = true;
break;
+ case 'e':
+ op->excl = true;
+ break;
case 'f':
force = true;
break;