lkml.org 
[lkml]   [2017]   [Jan]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/7] scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free()
    Date
    From: Xiang Chen <chenxiang66@hisilicon.com>

    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>
    ---
    drivers/scsi/hisi_sas/hisi_sas_main.c | 8 ++++----
    drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 --
    2 files changed, 4 insertions(+), 6 deletions(-)

    diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
    index 8601cec..53637a9 100644
    --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
    +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
    @@ -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 @@ static void hisi_sas_slot_abort(struct work_struct *work)
    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,
    diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
    index 62655c7..de240d2 100644
    --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
    +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
    @@ -1827,8 +1827,6 @@ static void slot_err_v2_hw(struct hisi_hba *hisi_hba,
    }

    out:
    - if (sas_dev)
    - atomic64_dec(&sas_dev->running_req);

    hisi_sas_slot_task_free(hisi_hba, task, slot);
    sts = ts->stat;
    --
    1.9.1
    \
     
     \ /
      Last update: 2017-01-18 17:08    [W:4.485 / U:0.648 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site