scsi: hisi_sas: use atomic64_t for hisi_sas_device.running_req
authorJohn Garry <john.garry@huawei.com>
Mon, 7 Nov 2016 12:48:39 +0000 (20:48 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Nov 2016 14:54:40 +0000 (09:54 -0500)
Sometimes the value of hisi_sas_device.running_req
would go negative unless we have the check for
running_req >= 0 before trying to decrement.

This is because using running_req is not thread-safe.

As such, the value for running_req may be actually incorrect,
so use atomic64_t instead.

Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Xiang Chen <chenxiang66@hisilicon.com>
Reviewed-by: Zhangfei Gao <zhangfei.gao@linaro.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas.h
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c

index bf59fab77765d23a32ea0c24d332e5cee0c5b092..8b5ecc697fee0bff2ed973c8199f5c563c0332fd 100644 (file)
@@ -111,7 +111,7 @@ struct hisi_sas_device {
        struct domain_device    *sas_device;
        u64 attached_phy;
        u64 device_id;
-       u64 running_req;
+       atomic64_t running_req;
        u8 dev_status;
 };
 
index 504cbcff45a694afba7bcf3b785ee6dbdd909e5c..18e219408b7687c7086cfbf9be11e3e839678acd 100644 (file)
@@ -162,8 +162,8 @@ out:
        hisi_sas_slot_task_free(hisi_hba, task, abort_slot);
        if (task->task_done)
                task->task_done(task);
-       if (sas_dev && sas_dev->running_req)
-               sas_dev->running_req--;
+       if (sas_dev)
+               atomic64_dec(&sas_dev->running_req);
 }
 
 static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
@@ -303,7 +303,7 @@ static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
 
        hisi_hba->slot_prep = slot;
 
-       sas_dev->running_req++;
+       atomic64_inc(&sas_dev->running_req);
        ++(*pass);
 
        return 0;
@@ -1027,7 +1027,8 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, u64 device_id,
 
        hisi_hba->slot_prep = slot;
 
-       sas_dev->running_req++;
+       atomic64_inc(&sas_dev->running_req);
+
        /* send abort command to our chip */
        hisi_hba->hw->start_delivery(hisi_hba);
 
index bbc5760dfaf4d1c924dd54b5101acae062faca67..05177fcb5179ee3cf1eccae6a07e0f349ad4e891 100644 (file)
@@ -1366,8 +1366,8 @@ static int slot_complete_v1_hw(struct hisi_hba *hisi_hba,
        }
 
 out:
-       if (sas_dev && sas_dev->running_req)
-               sas_dev->running_req--;
+       if (sas_dev)
+               atomic64_dec(&sas_dev->running_req);
 
        hisi_sas_slot_task_free(hisi_hba, task, slot);
        sts = ts->stat;
index cda3baf9423dd1b1fcf7d2f564ed11edc6ef4fef..e88113aff396548174cb2913b5a60dae011c6ef6 100644 (file)
@@ -1728,8 +1728,8 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot,
        }
 
 out:
-       if (sas_dev && sas_dev->running_req)
-               sas_dev->running_req--;
+       if (sas_dev)
+               atomic64_dec(&sas_dev->running_req);
 
        hisi_sas_slot_task_free(hisi_hba, task, slot);
        sts = ts->stat;