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:
Родитель
2f56a7f1b5
Коммит
ce1025cd4b
|
@ -60,7 +60,7 @@
|
|||
* | | | 0xb13c-0xb140 |
|
||||
* | | | 0xb149 |
|
||||
* | MultiQ | 0xc00c | |
|
||||
* | Misc | 0xd300 | 0xd031-0xd0ff |
|
||||
* | Misc | 0xd301 | 0xd031-0xd0ff |
|
||||
* | | | 0xd101-0xd1fe |
|
||||
* | | | 0xd214-0xd2fe |
|
||||
* | Target Mode | 0xe080 | |
|
||||
|
|
|
@ -3342,6 +3342,8 @@ struct qla_hw_data {
|
|||
uint32_t chain_offset;
|
||||
struct dentry *dfs_dir;
|
||||
struct dentry *dfs_fce;
|
||||
struct dentry *dfs_tgt_counters;
|
||||
|
||||
dma_addr_t fce_dma;
|
||||
void *fce;
|
||||
uint32_t fce_bufs;
|
||||
|
@ -3499,6 +3501,18 @@ struct qla_hw_data {
|
|||
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
|
||||
*/
|
||||
|
@ -3651,6 +3665,7 @@ typedef struct scsi_qla_host {
|
|||
|
||||
atomic_t vref_count;
|
||||
struct qla8044_reset_template reset_tmplt;
|
||||
struct qla_tgt_counters tgt_counters;
|
||||
} scsi_qla_host_t;
|
||||
|
||||
#define SET_VP_IDX 1
|
||||
|
|
|
@ -12,6 +12,48 @@
|
|||
static struct dentry *qla2x00_dfs_root;
|
||||
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
|
||||
qla2x00_dfs_fce_show(struct seq_file *s, void *unused)
|
||||
{
|
||||
|
@ -146,6 +188,14 @@ create_dir:
|
|||
atomic_inc(&qla2x00_dfs_root_count);
|
||||
|
||||
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,
|
||||
&dfs_fce_ops);
|
||||
if (!ha->dfs_fce) {
|
||||
|
@ -161,6 +211,12 @@ int
|
|||
qla2x00_dfs_remove(scsi_qla_host_t *vha)
|
||||
{
|
||||
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) {
|
||||
debugfs_remove(ha->dfs_fce);
|
||||
ha->dfs_fce = NULL;
|
||||
|
|
|
@ -1868,6 +1868,7 @@ skip_cmd_array:
|
|||
}
|
||||
|
||||
queuing_error:
|
||||
vha->tgt_counters.num_alloc_iocb_failed++;
|
||||
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);
|
||||
|
||||
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) {
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
vha->tgt_counters.num_term_xchg_sent++;
|
||||
pkt->entry_count = 1;
|
||||
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;
|
||||
}
|
||||
|
||||
vha->tgt_counters.num_q_full_sent++;
|
||||
pkt->entry_count = 1;
|
||||
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);
|
||||
|
||||
cmd->vha->tgt_counters.qla_core_ret_sta_ctio++;
|
||||
cmd->cmd_flags |= BIT_16;
|
||||
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)
|
||||
{
|
||||
cmd->vha->tgt_counters.core_qla_free_cmd++;
|
||||
cmd->cmd_in_wq = 1;
|
||||
INIT_WORK(&cmd->work, tcm_qla2xxx_complete_free);
|
||||
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;
|
||||
}
|
||||
|
||||
cmd->vha->tgt_counters.qla_core_sbt_cmd++;
|
||||
return target_submit_cmd(se_cmd, se_sess, cdb, &cmd->sense_buffer[0],
|
||||
cmd->unpacked_lun, data_length, fcp_task_attr,
|
||||
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_flags |= BIT_11;
|
||||
cmd->vha->tgt_counters.qla_core_ret_ctio++;
|
||||
if (!cmd->write_data_transferred) {
|
||||
/*
|
||||
* Check if se_cmd has already been aborted via LUN_RESET, and
|
||||
|
|
Загрузка…
Ссылка в новой задаче