OSDN Git Service

scsi: lpfc: reduce locking when updating statistics
authorJames Smart <jsmart2021@gmail.com>
Mon, 10 Sep 2018 17:30:49 +0000 (10:30 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 12 Sep 2018 00:37:33 +0000 (20:37 -0400)
Currently, on each io completion, the stats update routine indiscriminately
holds a lock. While holding the adapter-wide lock, checks are made to check
whether status are being tracked. When disabled (the default), the locking
wasted a lot of cycles.

Check for stats enablement before taking the lock.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_scsi.c

index 549eb58..4fa6703 100644 (file)
@@ -202,8 +202,8 @@ lpfc_sli4_set_rsp_sgl_last(struct lpfc_hba *phba,
 static void
 lpfc_update_stats(struct lpfc_hba *phba, struct  lpfc_scsi_buf *lpfc_cmd)
 {
-       struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
-       struct lpfc_nodelist *pnode = rdata->pnode;
+       struct lpfc_rport_data *rdata;
+       struct lpfc_nodelist *pnode;
        struct scsi_cmnd *cmd = lpfc_cmd->pCmd;
        unsigned long flags;
        struct Scsi_Host  *shost = cmd->device->host;
@@ -211,17 +211,19 @@ lpfc_update_stats(struct lpfc_hba *phba, struct  lpfc_scsi_buf *lpfc_cmd)
        unsigned long latency;
        int i;
 
-       if (cmd->result)
+       if (!vport->stat_data_enabled ||
+           vport->stat_data_blocked ||
+           (cmd->result))
                return;
 
        latency = jiffies_to_msecs((long)jiffies - (long)lpfc_cmd->start_time);
+       rdata = lpfc_cmd->rdata;
+       pnode = rdata->pnode;
 
        spin_lock_irqsave(shost->host_lock, flags);
-       if (!vport->stat_data_enabled ||
-               vport->stat_data_blocked ||
-               !pnode ||
-               !pnode->lat_data ||
-               (phba->bucket_type == LPFC_NO_BUCKET)) {
+       if (!pnode ||
+           !pnode->lat_data ||
+           (phba->bucket_type == LPFC_NO_BUCKET)) {
                spin_unlock_irqrestore(shost->host_lock, flags);
                return;
        }