qla2xxx: Enable Target counters in DebugFS.

Following counters are added in target mode to help debugging efforts.

Target Counters

qla_core_sbt_cmd = 0
qla_core_ret_sta_ctio = 0
qla_core_ret_ctio = 0
core_qla_que_buf = 0
core_qla_snd_status = 0
core_qla_free_cmd = 0
num alloc iocb failed = 0
num term exchange sent = 0
num Q full sent = 0

Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Himanshu Madhani 2015-12-17 14:56:58 -05:00 committed by Nicholas Bellinger
parent 2f56a7f1b5
commit ce1025cd4b
6 changed files with 84 additions and 1 deletions

View File

@ -60,7 +60,7 @@
* | | | 0xb13c-0xb140 | * | | | 0xb13c-0xb140 |
* | | | 0xb149 | * | | | 0xb149 |
* | MultiQ | 0xc00c | | * | MultiQ | 0xc00c | |
* | Misc | 0xd300 | 0xd031-0xd0ff | * | Misc | 0xd301 | 0xd031-0xd0ff |
* | | | 0xd101-0xd1fe | * | | | 0xd101-0xd1fe |
* | | | 0xd214-0xd2fe | * | | | 0xd214-0xd2fe |
* | Target Mode | 0xe080 | | * | Target Mode | 0xe080 | |

View File

@ -3342,6 +3342,8 @@ struct qla_hw_data {
uint32_t chain_offset; uint32_t chain_offset;
struct dentry *dfs_dir; struct dentry *dfs_dir;
struct dentry *dfs_fce; struct dentry *dfs_fce;
struct dentry *dfs_tgt_counters;
dma_addr_t fce_dma; dma_addr_t fce_dma;
void *fce; void *fce;
uint32_t fce_bufs; uint32_t fce_bufs;
@ -3499,6 +3501,18 @@ struct qla_hw_data {
int allow_cna_fw_dump; int allow_cna_fw_dump;
}; };
struct qla_tgt_counters {
uint64_t qla_core_sbt_cmd;
uint64_t core_qla_que_buf;
uint64_t qla_core_ret_ctio;
uint64_t core_qla_snd_status;
uint64_t qla_core_ret_sta_ctio;
uint64_t core_qla_free_cmd;
uint64_t num_q_full_sent;
uint64_t num_alloc_iocb_failed;
uint64_t num_term_xchg_sent;
};
/* /*
* Qlogic scsi host structure * Qlogic scsi host structure
*/ */
@ -3651,6 +3665,7 @@ typedef struct scsi_qla_host {
atomic_t vref_count; atomic_t vref_count;
struct qla8044_reset_template reset_tmplt; struct qla8044_reset_template reset_tmplt;
struct qla_tgt_counters tgt_counters;
} scsi_qla_host_t; } scsi_qla_host_t;
#define SET_VP_IDX 1 #define SET_VP_IDX 1

View File

@ -12,6 +12,48 @@
static struct dentry *qla2x00_dfs_root; static struct dentry *qla2x00_dfs_root;
static atomic_t qla2x00_dfs_root_count; static atomic_t qla2x00_dfs_root_count;
static int
qla_dfs_tgt_counters_show(struct seq_file *s, void *unused)
{
struct scsi_qla_host *vha = s->private;
seq_puts(s, "Target Counters\n");
seq_printf(s, "qla_core_sbt_cmd = %lld\n",
vha->tgt_counters.qla_core_sbt_cmd);
seq_printf(s, "qla_core_ret_sta_ctio = %lld\n",
vha->tgt_counters.qla_core_ret_sta_ctio);
seq_printf(s, "qla_core_ret_ctio = %lld\n",
vha->tgt_counters.qla_core_ret_ctio);
seq_printf(s, "core_qla_que_buf = %lld\n",
vha->tgt_counters.core_qla_que_buf);
seq_printf(s, "core_qla_snd_status = %lld\n",
vha->tgt_counters.core_qla_snd_status);
seq_printf(s, "core_qla_free_cmd = %lld\n",
vha->tgt_counters.core_qla_free_cmd);
seq_printf(s, "num alloc iocb failed = %lld\n",
vha->tgt_counters.num_alloc_iocb_failed);
seq_printf(s, "num term exchange sent = %lld\n",
vha->tgt_counters.num_term_xchg_sent);
seq_printf(s, "num Q full sent = %lld\n",
vha->tgt_counters.num_q_full_sent);
return 0;
}
static int
qla_dfs_tgt_counters_open(struct inode *inode, struct file *file)
{
struct scsi_qla_host *vha = inode->i_private;
return single_open(file, qla_dfs_tgt_counters_show, vha);
}
static const struct file_operations dfs_tgt_counters_ops = {
.open = qla_dfs_tgt_counters_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int static int
qla2x00_dfs_fce_show(struct seq_file *s, void *unused) qla2x00_dfs_fce_show(struct seq_file *s, void *unused)
{ {
@ -146,6 +188,14 @@ create_dir:
atomic_inc(&qla2x00_dfs_root_count); atomic_inc(&qla2x00_dfs_root_count);
create_nodes: create_nodes:
ha->dfs_tgt_counters = debugfs_create_file("tgt_counters", S_IRUSR,
ha->dfs_dir, vha, &dfs_tgt_counters_ops);
if (!ha->dfs_tgt_counters) {
ql_log(ql_log_warn, vha, 0xd301,
"Unable to create debugFS tgt_counters node.\n");
goto out;
}
ha->dfs_fce = debugfs_create_file("fce", S_IRUSR, ha->dfs_dir, vha, ha->dfs_fce = debugfs_create_file("fce", S_IRUSR, ha->dfs_dir, vha,
&dfs_fce_ops); &dfs_fce_ops);
if (!ha->dfs_fce) { if (!ha->dfs_fce) {
@ -161,6 +211,12 @@ int
qla2x00_dfs_remove(scsi_qla_host_t *vha) qla2x00_dfs_remove(scsi_qla_host_t *vha)
{ {
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
if (ha->dfs_tgt_counters) {
debugfs_remove(ha->dfs_tgt_counters);
ha->dfs_tgt_counters = NULL;
}
if (ha->dfs_fce) { if (ha->dfs_fce) {
debugfs_remove(ha->dfs_fce); debugfs_remove(ha->dfs_fce);
ha->dfs_fce = NULL; ha->dfs_fce = NULL;

View File

@ -1868,6 +1868,7 @@ skip_cmd_array:
} }
queuing_error: queuing_error:
vha->tgt_counters.num_alloc_iocb_failed++;
return pkt; return pkt;
} }

View File

@ -2510,6 +2510,11 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type,
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (xmit_type == QLA_TGT_XMIT_STATUS)
vha->tgt_counters.core_qla_snd_status++;
else
vha->tgt_counters.core_qla_que_buf++;
if (qla2x00_reset_active(vha) || cmd->reset_count != ha->chip_reset) { if (qla2x00_reset_active(vha) || cmd->reset_count != ha->chip_reset) {
/* /*
* Either a chip reset is active or this request was from * Either a chip reset is active or this request was from
@ -2957,6 +2962,7 @@ static int __qlt_send_term_exchange(struct scsi_qla_host *vha,
ret = 1; ret = 1;
} }
vha->tgt_counters.num_term_xchg_sent++;
pkt->entry_count = 1; pkt->entry_count = 1;
pkt->handle = QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK; pkt->handle = QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK;
@ -4916,6 +4922,7 @@ static int __qlt_send_busy(struct scsi_qla_host *vha,
return -ENOMEM; return -ENOMEM;
} }
vha->tgt_counters.num_q_full_sent++;
pkt->entry_count = 1; pkt->entry_count = 1;
pkt->handle = QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK; pkt->handle = QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK;

View File

@ -284,6 +284,7 @@ static void tcm_qla2xxx_complete_free(struct work_struct *work)
WARN_ON(cmd->cmd_flags & BIT_16); WARN_ON(cmd->cmd_flags & BIT_16);
cmd->vha->tgt_counters.qla_core_ret_sta_ctio++;
cmd->cmd_flags |= BIT_16; cmd->cmd_flags |= BIT_16;
transport_generic_free_cmd(&cmd->se_cmd, 0); transport_generic_free_cmd(&cmd->se_cmd, 0);
} }
@ -295,6 +296,7 @@ static void tcm_qla2xxx_complete_free(struct work_struct *work)
*/ */
static void tcm_qla2xxx_free_cmd(struct qla_tgt_cmd *cmd) static void tcm_qla2xxx_free_cmd(struct qla_tgt_cmd *cmd)
{ {
cmd->vha->tgt_counters.core_qla_free_cmd++;
cmd->cmd_in_wq = 1; cmd->cmd_in_wq = 1;
INIT_WORK(&cmd->work, tcm_qla2xxx_complete_free); INIT_WORK(&cmd->work, tcm_qla2xxx_complete_free);
queue_work(tcm_qla2xxx_free_wq, &cmd->work); queue_work(tcm_qla2xxx_free_wq, &cmd->work);
@ -454,6 +456,7 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
return -EINVAL; return -EINVAL;
} }
cmd->vha->tgt_counters.qla_core_sbt_cmd++;
return target_submit_cmd(se_cmd, se_sess, cdb, &cmd->sense_buffer[0], return target_submit_cmd(se_cmd, se_sess, cdb, &cmd->sense_buffer[0],
cmd->unpacked_lun, data_length, fcp_task_attr, cmd->unpacked_lun, data_length, fcp_task_attr,
data_dir, flags); data_dir, flags);
@ -469,6 +472,7 @@ static void tcm_qla2xxx_handle_data_work(struct work_struct *work)
*/ */
cmd->cmd_in_wq = 0; cmd->cmd_in_wq = 0;
cmd->cmd_flags |= BIT_11; cmd->cmd_flags |= BIT_11;
cmd->vha->tgt_counters.qla_core_ret_ctio++;
if (!cmd->write_data_transferred) { if (!cmd->write_data_transferred) {
/* /*
* Check if se_cmd has already been aborted via LUN_RESET, and * Check if se_cmd has already been aborted via LUN_RESET, and