lkml.org 
[lkml]   [2019]   [Feb]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 298/313] scsi: cxlflash: Prevent deadlock when adapter probe fails
    Date
    4.19-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Vaibhav Jain <vaibhav@linux.ibm.com>

    commit bb61b843ffd46978d7ca5095453e572714934eeb upstream.

    Presently when an error is encountered during probe of the cxlflash
    adapter, a deadlock is seen with cpu thread stuck inside
    cxlflash_remove(). Below is the trace of the deadlock as logged by
    khungtaskd:

    cxlflash 0006:00:00.0: cxlflash_probe: init_afu failed rc=-16
    INFO: task kworker/80:1:890 blocked for more than 120 seconds.
    Not tainted 5.0.0-rc4-capi2-kexec+ #2
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    kworker/80:1 D 0 890 2 0x00000808
    Workqueue: events work_for_cpu_fn

    Call Trace:
    0x4d72136320 (unreliable)
    __switch_to+0x2cc/0x460
    __schedule+0x2bc/0xac0
    schedule+0x40/0xb0
    cxlflash_remove+0xec/0x640 [cxlflash]
    cxlflash_probe+0x370/0x8f0 [cxlflash]
    local_pci_probe+0x6c/0x140
    work_for_cpu_fn+0x38/0x60
    process_one_work+0x260/0x530
    worker_thread+0x280/0x5d0
    kthread+0x1a8/0x1b0
    ret_from_kernel_thread+0x5c/0x80
    INFO: task systemd-udevd:5160 blocked for more than 120 seconds.

    The deadlock occurs as cxlflash_remove() is called from cxlflash_probe()
    without setting 'cxlflash_cfg->state' to STATE_PROBED and the probe thread
    starts to wait on 'cxlflash_cfg->reset_waitq'. Since the device was never
    successfully probed the 'cxlflash_cfg->state' never changes from
    STATE_PROBING hence the deadlock occurs.

    We fix this deadlock by setting the variable 'cxlflash_cfg->state' to
    STATE_PROBED in case an error occurs during cxlflash_probe() and just
    before calling cxlflash_remove().

    Cc: stable@vger.kernel.org
    Fixes: c21e0bbfc485("cxlflash: Base support for IBM CXL Flash Adapter")
    Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/scsi/cxlflash/main.c | 2 ++
    1 file changed, 2 insertions(+)

    --- a/drivers/scsi/cxlflash/main.c
    +++ b/drivers/scsi/cxlflash/main.c
    @@ -3694,6 +3694,7 @@ static int cxlflash_probe(struct pci_dev
    host->max_cmd_len = CXLFLASH_MAX_CDB_LEN;

    cfg = shost_priv(host);
    + cfg->state = STATE_PROBING;
    cfg->host = host;
    rc = alloc_mem(cfg);
    if (rc) {
    @@ -3782,6 +3783,7 @@ out:
    return rc;

    out_remove:
    + cfg->state = STATE_PROBED;
    cxlflash_remove(pdev);
    goto out;
    }

    \
     
     \ /
      Last update: 2019-02-11 16:35    [W:2.243 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site