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:
parent
2f56a7f1b5
commit
ce1025cd4b
|
@ -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 | |
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -1868,6 +1868,7 @@ skip_cmd_array:
|
||||||
}
|
}
|
||||||
|
|
||||||
queuing_error:
|
queuing_error:
|
||||||
|
vha->tgt_counters.num_alloc_iocb_failed++;
|
||||||
return pkt;
|
return pkt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue