]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: hisilicon - add a lock for the qp send operation
authorChenghai Huang <huangchenghai2@huawei.com>
Sat, 31 Aug 2024 09:50:08 +0000 (17:50 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 6 Sep 2024 06:50:46 +0000 (14:50 +0800)
Apply for a lock before the qp send operation to ensure no
resource race in multi-concurrency situations.

This modification has almost no impact on performance.

Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/hpre/hpre_crypto.c
drivers/crypto/hisilicon/zip/zip_crypto.c

index 764532a6ca828df884a2420862a3e16c8694136e..c167dbd6c7d6234cc35baf63cb33faaa2ce109bf 100644 (file)
@@ -575,7 +575,9 @@ static int hpre_send(struct hpre_ctx *ctx, struct hpre_sqe *msg)
 
        do {
                atomic64_inc(&dfx[HPRE_SEND_CNT].value);
+               spin_lock_bh(&ctx->req_lock);
                ret = hisi_qp_send(ctx->qp, msg);
+               spin_unlock_bh(&ctx->req_lock);
                if (ret != -EBUSY)
                        break;
                atomic64_inc(&dfx[HPRE_SEND_BUSY_CNT].value);
index 92d3bd0dfe1ba6b113cc6724aad92e723c05d0bf..7327f8f29b013811c702ecab7baf9e5670eab88a 100644 (file)
@@ -213,6 +213,7 @@ static int hisi_zip_do_work(struct hisi_zip_qp_ctx *qp_ctx,
 {
        struct hisi_acc_sgl_pool *pool = qp_ctx->sgl_pool;
        struct hisi_zip_dfx *dfx = &qp_ctx->zip_dev->dfx;
+       struct hisi_zip_req_q *req_q = &qp_ctx->req_q;
        struct acomp_req *a_req = req->req;
        struct hisi_qp *qp = qp_ctx->qp;
        struct device *dev = &qp->qm->pdev->dev;
@@ -244,7 +245,9 @@ static int hisi_zip_do_work(struct hisi_zip_qp_ctx *qp_ctx,
 
        /* send command to start a task */
        atomic64_inc(&dfx->send_cnt);
+       spin_lock_bh(&req_q->req_lock);
        ret = hisi_qp_send(qp, &zip_sqe);
+       spin_unlock_bh(&req_q->req_lock);
        if (unlikely(ret < 0)) {
                atomic64_inc(&dfx->send_busy_cnt);
                ret = -EAGAIN;