scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free()
authorXiang Chen <chenxiang66@hisilicon.com>
Fri, 20 Jan 2017 12:45:24 +0000 (20:45 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 21 Jan 2017 00:10:42 +0000 (19:10 -0500)
There is an issue that hisi_sas_dev.running_req is not
decremented properly for internal abort and TMF.

To resolve, only decrease running_req in hisi_sas_slot_task_free()

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c

index 8601cec..53637a9 100644 (file)
@@ -71,6 +71,8 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
                             struct hisi_sas_slot *slot)
 {
        struct device *dev = &hisi_hba->pdev->dev;
+       struct domain_device *device = task->dev;
+       struct hisi_sas_device *sas_dev = device->lldd_dev;
 
        if (!slot->task)
                return;
@@ -97,6 +99,8 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
        slot->task = NULL;
        slot->port = NULL;
        hisi_sas_slot_index_free(hisi_hba, slot->idx);
+       if (sas_dev)
+               atomic64_dec(&sas_dev->running_req);
        /* slot memory is fully zeroed when it is reused */
 }
 EXPORT_SYMBOL_GPL(hisi_sas_slot_task_free);
@@ -141,8 +145,6 @@ static void hisi_sas_slot_abort(struct work_struct *work)
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(task->dev);
        struct scsi_cmnd *cmnd = task->uldd_task;
        struct hisi_sas_tmf_task tmf_task;
-       struct domain_device *device = task->dev;
-       struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct scsi_lun lun;
        struct device *dev = &hisi_hba->pdev->dev;
        int tag = abort_slot->idx;
@@ -165,8 +167,6 @@ out:
        spin_unlock_irqrestore(&hisi_hba->lock, flags);
        if (task->task_done)
                task->task_done(task);
-       if (sas_dev)
-               atomic64_dec(&sas_dev->running_req);
 }
 
 static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
index 9e16f42..1b21445 100644 (file)
@@ -1830,8 +1830,6 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot,
        }
 
 out:
-       if (sas_dev)
-               atomic64_dec(&sas_dev->running_req);
 
        hisi_sas_slot_task_free(hisi_hba, task, slot);
        sts = ts->stat;