Commit 71e80106 authored by Kashyap Desai's avatar Kashyap Desai Committed by Martin K. Petersen

scsi: mpi3mr: Print pending host I/Os for debugging

Link: https://lore.kernel.org/r/20210520152545.2710479-20-kashyap.desai@broadcom.com
Cc: sathya.prakash@broadcom.com
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarKashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent f061178e
......@@ -333,6 +333,37 @@ void mpi3mr_invalidate_devhandles(struct mpi3mr_ioc *mrioc)
}
}
/**
* mpi3mr_print_scmd - print individual SCSI command
* @rq: Block request
* @data: Adapter instance reference
* @reserved: N/A. Currently not used
*
* Print the SCSI command details if it is in LLD scope.
*
* Return: true always.
*/
static bool mpi3mr_print_scmd(struct request *rq,
void *data, bool reserved)
{
struct mpi3mr_ioc *mrioc = (struct mpi3mr_ioc *)data;
struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
struct scmd_priv *priv = NULL;
if (scmd) {
priv = scsi_cmd_priv(scmd);
if (!priv->in_lld_scope)
goto out;
ioc_info(mrioc, "%s :Host Tag = %d, qid = %d\n",
__func__, priv->host_tag, priv->req_q_idx + 1);
scsi_print_command(scmd);
}
out:
return(true);
}
/**
* mpi3mr_flush_scmd - Flush individual SCSI command
* @rq: Block request
......@@ -2341,6 +2372,43 @@ static int mpi3mr_map_queues(struct Scsi_Host *shost)
mrioc->pdev, mrioc->op_reply_q_offset);
}
/**
* mpi3mr_get_fw_pending_ios - Calculate pending I/O count
* @mrioc: Adapter instance reference
*
* Calculate the pending I/Os for the controller and return.
*
* Return: Number of pending I/Os
*/
static inline int mpi3mr_get_fw_pending_ios(struct mpi3mr_ioc *mrioc)
{
u16 i;
uint pend_ios = 0;
for (i = 0; i < mrioc->num_op_reply_q; i++)
pend_ios += atomic_read(&mrioc->op_reply_qinfo[i].pend_ios);
return pend_ios;
}
/**
* mpi3mr_print_pending_host_io - print pending I/Os
* @mrioc: Adapter instance reference
*
* Print number of pending I/Os and each I/O details prior to
* reset for debug purpose.
*
* Return: Nothing
*/
static void mpi3mr_print_pending_host_io(struct mpi3mr_ioc *mrioc)
{
struct Scsi_Host *shost = mrioc->shost;
ioc_info(mrioc, "%s :Pending commands prior to reset: %d\n",
__func__, mpi3mr_get_fw_pending_ios(mrioc));
blk_mq_tagset_busy_iter(&shost->tag_set,
mpi3mr_print_scmd, (void *)mrioc);
}
/**
* mpi3mr_eh_host_reset - Host reset error handling callback
* @scmd: SCSI command reference
......@@ -2357,6 +2425,7 @@ static int mpi3mr_eh_host_reset(struct scsi_cmnd *scmd)
struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host);
int retval = FAILED, ret;
mpi3mr_print_pending_host_io(mrioc);
ret = mpi3mr_soft_reset_handler(mrioc,
MPI3MR_RESET_FROM_EH_HOS, 1);
if (ret)
......
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