[SCSI] lpfc 8.3.33: Fixed debugfs queInfo to include queue stats
authorJames Smart <james.smart@emulex.com>
Fri, 3 Aug 2012 16:37:00 +0000 (12:37 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 14 Sep 2012 13:45:28 +0000 (14:45 +0100)
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_debugfs.c

index 6e5e565094f293d3925e7f50b55a6f7649c94db8..23f4c0f30bac471fc064b38ffb61ca9101fd965c 100644 (file)
@@ -2001,192 +2001,294 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes,
 {
        struct lpfc_debug *debug = file->private_data;
        struct lpfc_hba *phba = (struct lpfc_hba *)debug->i_private;
-       int len = 0, fcp_qidx;
+       int len = 0;
        char *pbuffer;
+       int x, cnt;
+       int max_cnt;
+       struct lpfc_queue *qp = NULL;
+
 
        if (!debug->buffer)
                debug->buffer = kmalloc(LPFC_QUE_INFO_GET_BUF_SIZE, GFP_KERNEL);
        if (!debug->buffer)
                return 0;
        pbuffer = debug->buffer;
+       max_cnt = LPFC_QUE_INFO_GET_BUF_SIZE - 128;
 
        if (*ppos)
                return 0;
 
-       /* Get fast-path event queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "HBA EQ information:\n");
-       if (phba->sli4_hba.hba_eq) {
-               for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_io_channel;
-                    fcp_qidx++) {
-                       if (phba->sli4_hba.hba_eq[fcp_qidx]) {
+       spin_lock_irq(&phba->hbalock);
+
+       /* Fast-path event queue */
+       if (phba->sli4_hba.hba_eq && phba->cfg_fcp_io_channel) {
+               cnt = phba->cfg_fcp_io_channel;
+
+               for (x = 0; x < cnt; x++) {
+
+                       /* Fast-path EQ */
+                       qp = phba->sli4_hba.hba_eq[x];
+                       if (!qp)
+                               goto proc_cq;
+
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "\nHBA EQ info: "
+                               "EQ-STAT[max:x%x noE:x%x "
+                               "bs:x%x proc:x%llx]\n",
+                               qp->q_cnt_1, qp->q_cnt_2,
+                               qp->q_cnt_3, qp->q_cnt_4);
+
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "EQID[%02d], "
+                               "QE-CNT[%04d], QE-SIZE[%04d], "
+                               "HOST-IDX[%04d], PORT-IDX[%04d]",
+                               qp->queue_id,
+                               qp->entry_count,
+                               qp->entry_size,
+                               qp->host_index,
+                               qp->hba_index);
+
+
+                       /* Reset max counter */
+                       qp->EQ_max_eqe = 0;
+
+                       len +=  snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                       if (len >= max_cnt)
+                               goto too_big;
+proc_cq:
+                       /* Fast-path FCP CQ */
+                       qp = phba->sli4_hba.fcp_cq[x];
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "\tFCP CQ info: ");
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "AssocEQID[%02d]: "
+                               "CQ STAT[max:x%x relw:x%x "
+                               "xabt:x%x wq:x%llx]\n",
+                               qp->assoc_qid,
+                               qp->q_cnt_1, qp->q_cnt_2,
+                               qp->q_cnt_3, qp->q_cnt_4);
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "\tCQID[%02d], "
+                               "QE-CNT[%04d], QE-SIZE[%04d], "
+                               "HOST-IDX[%04d], PORT-IDX[%04d]",
+                               qp->queue_id, qp->entry_count,
+                               qp->entry_size, qp->host_index,
+                               qp->hba_index);
+
+
+                       /* Reset max counter */
+                       qp->CQ_max_cqe = 0;
+
+                       len +=  snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                       if (len >= max_cnt)
+                               goto too_big;
+
+                       /* Fast-path FCP WQ */
+                       qp = phba->sli4_hba.fcp_wq[x];
+
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "\t\tFCP WQ info: ");
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "AssocCQID[%02d]: "
+                               "WQ-STAT[oflow:x%x posted:x%llx]\n",
+                               qp->assoc_qid,
+                               qp->q_cnt_1, qp->q_cnt_4);
+                       len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                               "\t\tWQID[%02d], "
+                               "QE-CNT[%04d], QE-SIZE[%04d], "
+                               "HOST-IDX[%04d], PORT-IDX[%04d]",
+                               qp->queue_id,
+                               qp->entry_count,
+                               qp->entry_size,
+                               qp->host_index,
+                               qp->hba_index);
+
+                       len +=  snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                       if (len >= max_cnt)
+                               goto too_big;
+
+                       if (x)
+                               continue;
+
+                       /* Only EQ 0 has slow path CQs configured */
+
+                       /* Slow-path mailbox CQ */
+                       qp = phba->sli4_hba.mbx_cq;
+                       if (qp) {
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\tMBX CQ info: ");
                                len += snprintf(pbuffer+len,
                                        LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                               "\tEQID[%02d], "
-                               "QE-COUNT[%04d], QE-SIZE[%04d], "
-                               "HOST-INDEX[%04d], PORT-INDEX[%04d]\n",
-                               phba->sli4_hba.hba_eq[fcp_qidx]->queue_id,
-                               phba->sli4_hba.hba_eq[fcp_qidx]->entry_count,
-                               phba->sli4_hba.hba_eq[fcp_qidx]->entry_size,
-                               phba->sli4_hba.hba_eq[fcp_qidx]->host_index,
-                               phba->sli4_hba.hba_eq[fcp_qidx]->hba_index);
+                                       "AssocEQID[%02d]: "
+                                       "CQ-STAT[mbox:x%x relw:x%x "
+                                       "xabt:x%x wq:x%llx]\n",
+                                       qp->assoc_qid,
+                                       qp->q_cnt_1, qp->q_cnt_2,
+                                       qp->q_cnt_3, qp->q_cnt_4);
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\tCQID[%02d], "
+                                       "QE-CNT[%04d], QE-SIZE[%04d], "
+                                       "HOST-IDX[%04d], PORT-IDX[%04d]",
+                                       qp->queue_id, qp->entry_count,
+                                       qp->entry_size, qp->host_index,
+                                       qp->hba_index);
+
+                               len +=  snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                               if (len >= max_cnt)
+                                       goto too_big;
                        }
-               }
-       }
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
-
-       /* Get mailbox complete queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Slow-path MBX CQ information:\n");
-       if (phba->sli4_hba.mbx_cq) {
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Associated EQID[%02d]:\n",
-                       phba->sli4_hba.mbx_cq->assoc_qid);
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "\tCQID[%02d], "
-                       "QE-COUNT[%04d], QE-SIZE[%04d], "
-                       "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n",
-                       phba->sli4_hba.mbx_cq->queue_id,
-                       phba->sli4_hba.mbx_cq->entry_count,
-                       phba->sli4_hba.mbx_cq->entry_size,
-                       phba->sli4_hba.mbx_cq->host_index,
-                       phba->sli4_hba.mbx_cq->hba_index);
-       }
 
-       /* Get slow-path complete queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Slow-path ELS CQ information:\n");
-       if (phba->sli4_hba.els_cq) {
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Associated EQID[%02d]:\n",
-                       phba->sli4_hba.els_cq->assoc_qid);
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "\tCQID [%02d], "
-                       "QE-COUNT[%04d], QE-SIZE[%04d], "
-                       "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n",
-                       phba->sli4_hba.els_cq->queue_id,
-                       phba->sli4_hba.els_cq->entry_count,
-                       phba->sli4_hba.els_cq->entry_size,
-                       phba->sli4_hba.els_cq->host_index,
-                       phba->sli4_hba.els_cq->hba_index);
-       }
+                       /* Slow-path MBOX MQ */
+                       qp = phba->sli4_hba.mbx_wq;
+                       if (qp) {
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\t\tMBX MQ info: ");
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "AssocCQID[%02d]:\n",
+                                       phba->sli4_hba.mbx_wq->assoc_qid);
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\t\tWQID[%02d], "
+                                       "QE-CNT[%04d], QE-SIZE[%04d], "
+                                       "HOST-IDX[%04d], PORT-IDX[%04d]",
+                                       qp->queue_id, qp->entry_count,
+                                       qp->entry_size, qp->host_index,
+                                       qp->hba_index);
+
+                               len +=  snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                               if (len >= max_cnt)
+                                       goto too_big;
+                       }
 
-       /* Get fast-path complete queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Fast-path FCP CQ information:\n");
-       fcp_qidx = 0;
-       if (phba->sli4_hba.fcp_cq) {
-               do {
-                       if (phba->sli4_hba.fcp_cq[fcp_qidx]) {
+                       /* Slow-path ELS response CQ */
+                       qp = phba->sli4_hba.els_cq;
+                       if (qp) {
                                len += snprintf(pbuffer+len,
                                        LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                               "Associated EQID[%02d]:\n",
-                               phba->sli4_hba.fcp_cq[fcp_qidx]->assoc_qid);
+                                       "\tELS CQ info: ");
                                len += snprintf(pbuffer+len,
                                        LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                               "\tCQID[%02d], "
-                               "QE-COUNT[%04d], QE-SIZE[%04d], "
-                               "HOST-INDEX[%04d], PORT-INDEX[%04d]\n",
-                               phba->sli4_hba.fcp_cq[fcp_qidx]->queue_id,
-                               phba->sli4_hba.fcp_cq[fcp_qidx]->entry_count,
-                               phba->sli4_hba.fcp_cq[fcp_qidx]->entry_size,
-                               phba->sli4_hba.fcp_cq[fcp_qidx]->host_index,
-                               phba->sli4_hba.fcp_cq[fcp_qidx]->hba_index);
+                                       "AssocEQID[%02d]: "
+                                       "CQ-STAT[max:x%x relw:x%x "
+                                       "xabt:x%x wq:x%llx]\n",
+                                       qp->assoc_qid,
+                                       qp->q_cnt_1, qp->q_cnt_2,
+                                       qp->q_cnt_3, qp->q_cnt_4);
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\tCQID [%02d], "
+                                       "QE-CNT[%04d], QE-SIZE[%04d], "
+                                       "HOST-IDX[%04d], PORT-IDX[%04d]",
+                                       qp->queue_id, qp->entry_count,
+                                       qp->entry_size, qp->host_index,
+                                       qp->hba_index);
+
+                               /* Reset max counter */
+                               qp->CQ_max_cqe = 0;
+
+                               len +=  snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                               if (len >= max_cnt)
+                                       goto too_big;
                        }
-               } while (++fcp_qidx < phba->cfg_fcp_io_channel);
-               len += snprintf(pbuffer+len,
-                               LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
-       }
 
-       /* Get mailbox queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Slow-path MBX MQ information:\n");
-       if (phba->sli4_hba.mbx_wq) {
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Associated CQID[%02d]:\n",
-                       phba->sli4_hba.mbx_wq->assoc_qid);
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "\tWQID[%02d], "
-                       "QE-COUNT[%04d], QE-SIZE[%04d], "
-                       "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n",
-                       phba->sli4_hba.mbx_wq->queue_id,
-                       phba->sli4_hba.mbx_wq->entry_count,
-                       phba->sli4_hba.mbx_wq->entry_size,
-                       phba->sli4_hba.mbx_wq->host_index,
-                       phba->sli4_hba.mbx_wq->hba_index);
-       }
+                       /* Slow-path ELS WQ */
+                       qp = phba->sli4_hba.els_wq;
+                       if (qp) {
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\t\tELS WQ info: ");
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "AssocCQID[%02d]: "
+                                       " WQ-STAT[oflow:x%x "
+                                       "posted:x%llx]\n",
+                                       qp->assoc_qid,
+                                       qp->q_cnt_1, qp->q_cnt_4);
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\t\tWQID[%02d], "
+                                       "QE-CNT[%04d], QE-SIZE[%04d], "
+                                       "HOST-IDX[%04d], PORT-IDX[%04d]",
+                                       qp->queue_id, qp->entry_count,
+                                       qp->entry_size, qp->host_index,
+                                       qp->hba_index);
+
+                               len +=  snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                               if (len >= max_cnt)
+                                       goto too_big;
+                       }
 
-       /* Get slow-path work queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Slow-path ELS WQ information:\n");
-       if (phba->sli4_hba.els_wq) {
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Associated CQID[%02d]:\n",
-                       phba->sli4_hba.els_wq->assoc_qid);
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "\tWQID[%02d], "
-                       "QE-COUNT[%04d], QE-SIZE[%04d], "
-                       "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n",
-                       phba->sli4_hba.els_wq->queue_id,
-                       phba->sli4_hba.els_wq->entry_count,
-                       phba->sli4_hba.els_wq->entry_size,
-                       phba->sli4_hba.els_wq->host_index,
-                       phba->sli4_hba.els_wq->hba_index);
-       }
+                       if (phba->sli4_hba.hdr_rq && phba->sli4_hba.dat_rq) {
+                               /* Slow-path RQ header */
+                               qp = phba->sli4_hba.hdr_rq;
 
-       /* Get fast-path work queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Fast-path FCP WQ information:\n");
-       if (phba->sli4_hba.fcp_wq) {
-               for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_io_channel;
-                    fcp_qidx++) {
-                       if (!phba->sli4_hba.fcp_wq[fcp_qidx])
-                               continue;
-                       len += snprintf(pbuffer+len,
+                               len += snprintf(pbuffer+len,
+                               LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\t\tRQ info: ");
+                               len += snprintf(pbuffer+len,
                                        LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                               "Associated CQID[%02d]:\n",
-                               phba->sli4_hba.fcp_wq[fcp_qidx]->assoc_qid);
-                       len += snprintf(pbuffer+len,
+                                       "AssocCQID[%02d]: "
+                                       "RQ-STAT[nopost:x%x nobuf:x%x "
+                                       "trunc:x%x rcv:x%llx]\n",
+                                       qp->assoc_qid,
+                                       qp->q_cnt_1, qp->q_cnt_2,
+                                       qp->q_cnt_3, qp->q_cnt_4);
+                               len += snprintf(pbuffer+len,
                                        LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                               "\tWQID[%02d], "
-                               "QE-COUNT[%04d], WQE-SIZE[%04d], "
-                               "HOST-INDEX[%04d], PORT-INDEX[%04d]\n",
-                               phba->sli4_hba.fcp_wq[fcp_qidx]->queue_id,
-                               phba->sli4_hba.fcp_wq[fcp_qidx]->entry_count,
-                               phba->sli4_hba.fcp_wq[fcp_qidx]->entry_size,
-                               phba->sli4_hba.fcp_wq[fcp_qidx]->host_index,
-                               phba->sli4_hba.fcp_wq[fcp_qidx]->hba_index);
+                                       "\t\tHQID[%02d], "
+                                       "QE-CNT[%04d], QE-SIZE[%04d], "
+                                       "HOST-IDX[%04d], PORT-IDX[%04d]\n",
+                                       qp->queue_id,
+                                       qp->entry_count,
+                                       qp->entry_size,
+                                       qp->host_index,
+                                       qp->hba_index);
+
+                               /* Slow-path RQ data */
+                               qp = phba->sli4_hba.dat_rq;
+                               len += snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len,
+                                       "\t\tDQID[%02d], "
+                                       "QE-CNT[%04d], QE-SIZE[%04d], "
+                                       "HOST-IDX[%04d], PORT-IDX[%04d]\n",
+                                       qp->queue_id,
+                                       qp->entry_count,
+                                       qp->entry_size,
+                                       qp->host_index,
+                                       qp->hba_index);
+
+                               len +=  snprintf(pbuffer+len,
+                                       LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
+                       }
                }
-               len += snprintf(pbuffer+len,
-                               LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n");
        }
 
-       /* Get receive queue information */
-       len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Slow-path RQ information:\n");
-       if (phba->sli4_hba.hdr_rq && phba->sli4_hba.dat_rq) {
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "Associated CQID[%02d]:\n",
-                       phba->sli4_hba.hdr_rq->assoc_qid);
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "\tHQID[%02d], "
-                       "QE-COUNT[%04d], QE-SIZE[%04d], "
-                       "HOST-INDEX[%04d], PORT-INDEX[%04d]\n",
-                       phba->sli4_hba.hdr_rq->queue_id,
-                       phba->sli4_hba.hdr_rq->entry_count,
-                       phba->sli4_hba.hdr_rq->entry_size,
-                       phba->sli4_hba.hdr_rq->host_index,
-                       phba->sli4_hba.hdr_rq->hba_index);
-               len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len,
-                       "\tDQID[%02d], "
-                       "QE-COUNT[%04d], QE-SIZE[%04d], "
-                       "HOST-INDEX[%04d], PORT-INDEX[%04d]\n",
-                       phba->sli4_hba.dat_rq->queue_id,
-                       phba->sli4_hba.dat_rq->entry_count,
-                       phba->sli4_hba.dat_rq->entry_size,
-                       phba->sli4_hba.dat_rq->host_index,
-                       phba->sli4_hba.dat_rq->hba_index);
-       }
+       spin_unlock_irq(&phba->hbalock);
+       return simple_read_from_buffer(buf, nbytes, ppos, pbuffer, len);
+
+too_big:
+       len +=  snprintf(pbuffer+len,
+               LPFC_QUE_INFO_GET_BUF_SIZE-len, "Truncated ...\n");
+       spin_unlock_irq(&phba->hbalock);
        return simple_read_from_buffer(buf, nbytes, ppos, pbuffer, len);
 }