qla2xxx: Enable Target counters in DebugFS.
authorHimanshu Madhani <himanshu.madhani@qlogic.com>
Thu, 17 Dec 2015 19:56:58 +0000 (14:56 -0500)
committerNicholas Bellinger <nab@linux-iscsi.org>
Thu, 7 Jan 2016 21:57:42 +0000 (13:57 -0800)
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>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_dfs.c
drivers/scsi/qla2xxx/qla_iocb.c
drivers/scsi/qla2xxx/qla_target.c
drivers/scsi/qla2xxx/tcm_qla2xxx.c

index e8b38dbac7d4019ce9fa0ebb9fc32fb46660fc19..4d4d7840a8c80914272e35d0d3daa093289b1342 100644 (file)
@@ -60,7 +60,7 @@
  * |                              |                    | 0xb13c-0xb140  |
  * |                              |                    | 0xb149                |
  * | MultiQ                       |       0xc00c       |               |
- * | Misc                         |       0xd300       | 0xd031-0xd0ff |
+ * | Misc                         |       0xd301       | 0xd031-0xd0ff |
  * |                              |                    | 0xd101-0xd1fe |
  * |                              |                    | 0xd214-0xd2fe |
  * | Target Mode                 |       0xe080       |                |
index d31401c5a7eb11c7a1abcd16bb1555d90f27fdab..f63de357660941a9a49f732348ce46aac6d02dbe 100644 (file)
@@ -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
index 15cf074ffa3c717e0936d0be8428dccd97e96ec3..449541f007074e1e2d30a03202b7696fe354af70 100644 (file)
 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;
index c49df34e9b351c350f13bfa2e8e98c4a1bf2a695..c798234b8044d11095e3c34bb4c998616761733b 100644 (file)
@@ -1868,6 +1868,7 @@ skip_cmd_array:
        }
 
 queuing_error:
+       vha->tgt_counters.num_alloc_iocb_failed++;
        return pkt;
 }
 
index 75514a15bea03ebcf8929ff317f97aeb17b59ae5..f404e48329a958328a2ef3594d460919105869c9 100644 (file)
@@ -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;
 
index 3ba2e9564b9a78f000c234fa1be7bb05e24eaebd..e7951f3c1b5887d1bdc7627ad3c85b2b2b1e23d2 100644 (file)
@@ -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