Commit 771f712b authored by Douglas Gilbert's avatar Douglas Gilbert Committed by Martin K. Petersen

scsi: scsi_debug: Fix cmd duration calculation

In some cases, sdebug_defer::cmpl_ts (completion timestamp) wasn't being
properly set when REQ_HIPRI was given. Fix that and improve code to only
call ktime_get_boottime_ns() for commands with REQ_HIPRI set as cmpl_ts is
only used in that case.

Link: https://lore.kernel.org/r/20210304014107.307625-1-dgilbert@interlog.comSigned-off-by: default avatarDouglas Gilbert <dgilbert@interlog.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4309ea74
...@@ -5367,6 +5367,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, ...@@ -5367,6 +5367,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
{ {
bool new_sd_dp; bool new_sd_dp;
bool inject = false; bool inject = false;
bool hipri = (cmnd->request->cmd_flags & REQ_HIPRI);
int k, num_in_q, qdepth; int k, num_in_q, qdepth;
unsigned long iflags; unsigned long iflags;
u64 ns_from_boot = 0; u64 ns_from_boot = 0;
...@@ -5453,7 +5454,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, ...@@ -5453,7 +5454,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
if (sdebug_host_max_queue) if (sdebug_host_max_queue)
sd_dp->hc_idx = get_tag(cmnd); sd_dp->hc_idx = get_tag(cmnd);
if (ndelay > 0 && ndelay < INCLUSIVE_TIMING_MAX_NS) if (hipri)
ns_from_boot = ktime_get_boottime_ns(); ns_from_boot = ktime_get_boottime_ns();
/* one of the resp_*() response functions is called here */ /* one of the resp_*() response functions is called here */
...@@ -5513,8 +5514,8 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, ...@@ -5513,8 +5514,8 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
kt -= d; kt -= d;
} }
} }
if (hipri) {
sd_dp->cmpl_ts = ktime_add(ns_to_ktime(ns_from_boot), kt); sd_dp->cmpl_ts = ktime_add(ns_to_ktime(ns_from_boot), kt);
if (cmnd->request->cmd_flags & REQ_HIPRI) {
spin_lock_irqsave(&sqp->qc_lock, iflags); spin_lock_irqsave(&sqp->qc_lock, iflags);
if (!sd_dp->init_poll) { if (!sd_dp->init_poll) {
sd_dp->init_poll = true; sd_dp->init_poll = true;
...@@ -5544,8 +5545,8 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, ...@@ -5544,8 +5545,8 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
if (unlikely((sdebug_opts & SDEBUG_OPT_CMD_ABORT) && if (unlikely((sdebug_opts & SDEBUG_OPT_CMD_ABORT) &&
atomic_read(&sdeb_inject_pending))) atomic_read(&sdeb_inject_pending)))
sd_dp->aborted = true; sd_dp->aborted = true;
if (hipri) {
sd_dp->cmpl_ts = ns_to_ktime(ns_from_boot); sd_dp->cmpl_ts = ns_to_ktime(ns_from_boot);
if (cmnd->request->cmd_flags & REQ_HIPRI) {
spin_lock_irqsave(&sqp->qc_lock, iflags); spin_lock_irqsave(&sqp->qc_lock, iflags);
if (!sd_dp->init_poll) { if (!sd_dp->init_poll) {
sd_dp->init_poll = true; sd_dp->init_poll = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment