lkml.org 
[lkml]   [2018]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 3.18 15/63] scsi: ipr: Fix missed EH wakeup
    Date
    From: Brian King <brking@linux.vnet.ibm.com>

    [ Upstream commit 66a0d59cdd12546ddf01d229de28b07ccf6d637f ]

    Following a command abort or device reset, ipr's EH handlers wait for
    the commands getting aborted to get sent back from the adapter prior to
    returning from the EH handler. This fixes up some cases where the
    completion handler was not getting called, which would have resulted in
    the EH thread waiting until it timed out, greatly extending EH time.

    Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
    Reviewed-by: Wendy Xiong <wenxiong@linux.vnet.ibm.com>
    Tested-by: Wendy Xiong <wenxiong@linux.vnet.ibm.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/scsi/ipr.c | 16 ++++++++++++----
    1 file changed, 12 insertions(+), 4 deletions(-)

    diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
    index 105adb4cf6a8..54dfae5c8ee3 100644
    --- a/drivers/scsi/ipr.c
    +++ b/drivers/scsi/ipr.c
    @@ -828,8 +828,10 @@ static void ipr_sata_eh_done(struct ipr_cmnd *ipr_cmd)

    qc->err_mask |= AC_ERR_OTHER;
    sata_port->ioasa.status |= ATA_BUSY;
    - list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    ata_qc_complete(qc);
    + if (ipr_cmd->eh_comp)
    + complete(ipr_cmd->eh_comp);
    + list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    }

    /**
    @@ -5830,8 +5832,10 @@ static void ipr_erp_done(struct ipr_cmnd *ipr_cmd)
    res->in_erp = 0;
    }
    scsi_dma_unmap(ipr_cmd->scsi_cmd);
    - list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    scsi_cmd->scsi_done(scsi_cmd);
    + if (ipr_cmd->eh_comp)
    + complete(ipr_cmd->eh_comp);
    + list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    }

    /**
    @@ -6214,8 +6218,10 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg,
    }

    scsi_dma_unmap(ipr_cmd->scsi_cmd);
    - list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    scsi_cmd->scsi_done(scsi_cmd);
    + if (ipr_cmd->eh_comp)
    + complete(ipr_cmd->eh_comp);
    + list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    }

    /**
    @@ -6241,8 +6247,10 @@ static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd)
    scsi_dma_unmap(scsi_cmd);

    spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags);
    - list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    scsi_cmd->scsi_done(scsi_cmd);
    + if (ipr_cmd->eh_comp)
    + complete(ipr_cmd->eh_comp);
    + list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
    spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags);
    } else {
    spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-03 23:55    [W:4.475 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site