Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / scsi / lpfc / lpfc_nvme.c
index f6c8963..a45936e 100644 (file)
@@ -382,13 +382,15 @@ lpfc_nvme_remoteport_delete(struct nvme_fc_remote_port *remoteport)
        if (ndlp->upcall_flags & NLP_WAIT_FOR_UNREG) {
                ndlp->nrport = NULL;
                ndlp->upcall_flags &= ~NLP_WAIT_FOR_UNREG;
-       }
-       spin_unlock_irq(&vport->phba->hbalock);
+               spin_unlock_irq(&vport->phba->hbalock);
 
-       /* Remove original register reference. The host transport
-        * won't reference this rport/remoteport any further.
-        */
-       lpfc_nlp_put(ndlp);
+               /* Remove original register reference. The host transport
+                * won't reference this rport/remoteport any further.
+                */
+               lpfc_nlp_put(ndlp);
+       } else {
+               spin_unlock_irq(&vport->phba->hbalock);
+       }
 
  rport_err:
        return;
@@ -897,88 +899,6 @@ lpfc_nvme_adj_fcp_sgls(struct lpfc_vport *vport,
        sgl->sge_len = cpu_to_le32(nCmd->rsplen);
 }
 
-#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
-static void
-lpfc_nvme_ktime(struct lpfc_hba *phba,
-               struct lpfc_io_buf *lpfc_ncmd)
-{
-       uint64_t seg1, seg2, seg3, seg4;
-       uint64_t segsum;
-
-       if (!lpfc_ncmd->ts_last_cmd ||
-           !lpfc_ncmd->ts_cmd_start ||
-           !lpfc_ncmd->ts_cmd_wqput ||
-           !lpfc_ncmd->ts_isr_cmpl ||
-           !lpfc_ncmd->ts_data_nvme)
-               return;
-
-       if (lpfc_ncmd->ts_data_nvme < lpfc_ncmd->ts_cmd_start)
-               return;
-       if (lpfc_ncmd->ts_cmd_start < lpfc_ncmd->ts_last_cmd)
-               return;
-       if (lpfc_ncmd->ts_cmd_wqput < lpfc_ncmd->ts_cmd_start)
-               return;
-       if (lpfc_ncmd->ts_isr_cmpl < lpfc_ncmd->ts_cmd_wqput)
-               return;
-       if (lpfc_ncmd->ts_data_nvme < lpfc_ncmd->ts_isr_cmpl)
-               return;
-       /*
-        * Segment 1 - Time from Last FCP command cmpl is handed
-        * off to NVME Layer to start of next command.
-        * Segment 2 - Time from Driver receives a IO cmd start
-        * from NVME Layer to WQ put is done on IO cmd.
-        * Segment 3 - Time from Driver WQ put is done on IO cmd
-        * to MSI-X ISR for IO cmpl.
-        * Segment 4 - Time from MSI-X ISR for IO cmpl to when
-        * cmpl is handled off to the NVME Layer.
-        */
-       seg1 = lpfc_ncmd->ts_cmd_start - lpfc_ncmd->ts_last_cmd;
-       if (seg1 > 5000000)  /* 5 ms - for sequential IOs only */
-               seg1 = 0;
-
-       /* Calculate times relative to start of IO */
-       seg2 = (lpfc_ncmd->ts_cmd_wqput - lpfc_ncmd->ts_cmd_start);
-       segsum = seg2;
-       seg3 = lpfc_ncmd->ts_isr_cmpl - lpfc_ncmd->ts_cmd_start;
-       if (segsum > seg3)
-               return;
-       seg3 -= segsum;
-       segsum += seg3;
-
-       seg4 = lpfc_ncmd->ts_data_nvme - lpfc_ncmd->ts_cmd_start;
-       if (segsum > seg4)
-               return;
-       seg4 -= segsum;
-
-       phba->ktime_data_samples++;
-       phba->ktime_seg1_total += seg1;
-       if (seg1 < phba->ktime_seg1_min)
-               phba->ktime_seg1_min = seg1;
-       else if (seg1 > phba->ktime_seg1_max)
-               phba->ktime_seg1_max = seg1;
-       phba->ktime_seg2_total += seg2;
-       if (seg2 < phba->ktime_seg2_min)
-               phba->ktime_seg2_min = seg2;
-       else if (seg2 > phba->ktime_seg2_max)
-               phba->ktime_seg2_max = seg2;
-       phba->ktime_seg3_total += seg3;
-       if (seg3 < phba->ktime_seg3_min)
-               phba->ktime_seg3_min = seg3;
-       else if (seg3 > phba->ktime_seg3_max)
-               phba->ktime_seg3_max = seg3;
-       phba->ktime_seg4_total += seg4;
-       if (seg4 < phba->ktime_seg4_min)
-               phba->ktime_seg4_min = seg4;
-       else if (seg4 > phba->ktime_seg4_max)
-               phba->ktime_seg4_max = seg4;
-
-       lpfc_ncmd->ts_last_cmd = 0;
-       lpfc_ncmd->ts_cmd_start = 0;
-       lpfc_ncmd->ts_cmd_wqput  = 0;
-       lpfc_ncmd->ts_isr_cmpl = 0;
-       lpfc_ncmd->ts_data_nvme = 0;
-}
-#endif
 
 /**
  * lpfc_nvme_io_cmd_wqe_cmpl - Complete an NVME-over-FCP IO
@@ -1010,6 +930,9 @@ lpfc_nvme_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
        uint32_t code, status, idx;
        uint16_t cid, sqhd, data;
        uint32_t *ptr;
+#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
+       int cpu;
+#endif
 
        /* Sanity check on return of outstanding command */
        if (!lpfc_ncmd) {
@@ -1178,23 +1101,19 @@ out_err:
 #ifdef CONFIG_SCSI_LPFC_DEBUG_FS
        if (lpfc_ncmd->ts_cmd_start) {
                lpfc_ncmd->ts_isr_cmpl = pwqeIn->isr_timestamp;
-               lpfc_ncmd->ts_data_nvme = ktime_get_ns();
-               phba->ktime_last_cmd = lpfc_ncmd->ts_data_nvme;
-               lpfc_nvme_ktime(phba, lpfc_ncmd);
+               lpfc_ncmd->ts_data_io = ktime_get_ns();
+               phba->ktime_last_cmd = lpfc_ncmd->ts_data_io;
+               lpfc_io_ktime(phba, lpfc_ncmd);
        }
-       if (unlikely(phba->cpucheck_on & LPFC_CHECK_NVME_IO)) {
-               uint32_t cpu;
-               idx = lpfc_ncmd->cur_iocbq.hba_wqidx;
+       if (unlikely(phba->hdwqstat_on & LPFC_CHECK_NVME_IO)) {
                cpu = raw_smp_processor_id();
-               if (cpu < LPFC_CHECK_CPU_CNT) {
-                       if (lpfc_ncmd->cpu != cpu)
-                               lpfc_printf_vlog(vport,
-                                                KERN_INFO, LOG_NVME_IOERR,
-                                                "6701 CPU Check cmpl: "
-                                                "cpu %d expect %d\n",
-                                                cpu, lpfc_ncmd->cpu);
-                       phba->sli4_hba.hdwq[idx].cpucheck_cmpl_io[cpu]++;
-               }
+               this_cpu_inc(phba->sli4_hba.c_stat->cmpl_io);
+               if (lpfc_ncmd->cpu != cpu)
+                       lpfc_printf_vlog(vport,
+                                        KERN_INFO, LOG_NVME_IOERR,
+                                        "6701 CPU Check cmpl: "
+                                        "cpu %d expect %d\n",
+                                        cpu, lpfc_ncmd->cpu);
        }
 #endif
 
@@ -1743,19 +1662,17 @@ lpfc_nvme_fcp_io_submit(struct nvme_fc_local_port *pnvme_lport,
        if (lpfc_ncmd->ts_cmd_start)
                lpfc_ncmd->ts_cmd_wqput = ktime_get_ns();
 
-       if (phba->cpucheck_on & LPFC_CHECK_NVME_IO) {
+       if (phba->hdwqstat_on & LPFC_CHECK_NVME_IO) {
                cpu = raw_smp_processor_id();
-               if (cpu < LPFC_CHECK_CPU_CNT) {
-                       lpfc_ncmd->cpu = cpu;
-                       if (idx != cpu)
-                               lpfc_printf_vlog(vport,
-                                                KERN_INFO, LOG_NVME_IOERR,
-                                               "6702 CPU Check cmd: "
-                                               "cpu %d wq %d\n",
-                                               lpfc_ncmd->cpu,
-                                               lpfc_queue_info->index);
-                       phba->sli4_hba.hdwq[idx].cpucheck_xmt_io[cpu]++;
-               }
+               this_cpu_inc(phba->sli4_hba.c_stat->xmt_io);
+               lpfc_ncmd->cpu = cpu;
+               if (idx != cpu)
+                       lpfc_printf_vlog(vport,
+                                        KERN_INFO, LOG_NVME_IOERR,
+                                       "6702 CPU Check cmd: "
+                                       "cpu %d wq %d\n",
+                                       lpfc_ncmd->cpu,
+                                       lpfc_queue_info->index);
        }
 #endif
        return 0;
@@ -1985,8 +1902,6 @@ out_unlock:
 
 /* Declare and initialization an instance of the FC NVME template. */
 static struct nvme_fc_port_template lpfc_nvme_template = {
-       .module = THIS_MODULE,
-
        /* initiator-based functions */
        .localport_delete  = lpfc_nvme_localport_delete,
        .remoteport_delete = lpfc_nvme_remoteport_delete,