lkml.org 
[lkml]   [2022]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.16 148/217] crypto: hisilicon/qm - fix deadlock for remove driver
    Date
    From: Yang Shen <shenyang39@huawei.com>

    [ Upstream commit fc6c01f0cd10b89c4b01dd2940e0b0cda1bd82fb ]

    When remove the driver and executing the task occur at the same time,
    the following deadlock will be triggered:

    Chain exists of:
    sva_lock --> uacce_mutex --> &qm->qps_lock
    Possible unsafe locking scenario:
    CPU0 CPU1
    ---- ----
    lock(&qm->qps_lock);
    lock(uacce_mutex);
    lock(&qm->qps_lock);
    lock(sva_lock);

    And the lock 'qps_lock' is used to protect qp. Therefore, it's reasonable
    cycle is to continue until the qp memory is released. So move the release
    lock infront of 'uacce_remove'.

    Signed-off-by: Yang Shen <shenyang39@huawei.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/crypto/hisilicon/qm.c | 3 +--
    1 file changed, 1 insertion(+), 2 deletions(-)

    diff --git a/drivers/crypto/hisilicon/qm.c b/drivers/crypto/hisilicon/qm.c
    index 52d6cca6262e2..39517aa9630bb 100644
    --- a/drivers/crypto/hisilicon/qm.c
    +++ b/drivers/crypto/hisilicon/qm.c
    @@ -3399,6 +3399,7 @@ void hisi_qm_uninit(struct hisi_qm *qm)
    dma_free_coherent(dev, qm->qdma.size,
    qm->qdma.va, qm->qdma.dma);
    }
    + up_write(&qm->qps_lock);

    qm_irq_unregister(qm);
    hisi_qm_pci_uninit(qm);
    @@ -3406,8 +3407,6 @@ void hisi_qm_uninit(struct hisi_qm *qm)
    uacce_remove(qm->uacce);
    qm->uacce = NULL;
    }
    -
    - up_write(&qm->qps_lock);
    }
    EXPORT_SYMBOL_GPL(hisi_qm_uninit);

    --
    2.34.1
    \
     
     \ /
      Last update: 2022-01-18 03:36    [W:4.019 / U:0.448 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site