]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in softirq
authorZhengchao Shao <shaozhengchao@huawei.com>
Fri, 1 Jul 2022 01:59:54 +0000 (09:59 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Aug 2022 09:15:07 +0000 (11:15 +0200)
[ Upstream commit 68740ab505431f268dc1ee26a54b871e75f0ddaa ]

When kunpeng916 encryption driver is used to deencrypt and decrypt
packets during the softirq, it is not allowed to use mutex lock.

Fixes: 915e4e8413da ("crypto: hisilicon - SEC security accelerator driver")
Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/crypto/hisilicon/sec/sec_algs.c
drivers/crypto/hisilicon/sec/sec_drv.h

index 3e3cc28d5cfe3552440000815108ea146ee00cb5..f672dc1ecfacbb5c3f70fc9e28a90cf1aa99e78e 100644 (file)
@@ -457,7 +457,7 @@ static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp,
                 */
        }
 
-       mutex_lock(&ctx->queue->queuelock);
+       spin_lock_bh(&ctx->queue->queuelock);
        /* Put the IV in place for chained cases */
        switch (ctx->cipher_alg) {
        case SEC_C_AES_CBC_128:
@@ -517,7 +517,7 @@ static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp,
                        list_del(&backlog_req->backlog_head);
                }
        }
-       mutex_unlock(&ctx->queue->queuelock);
+       spin_unlock_bh(&ctx->queue->queuelock);
 
        mutex_lock(&sec_req->lock);
        list_del(&sec_req_el->head);
@@ -806,7 +806,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
         */
 
        /* Grab a big lock for a long time to avoid concurrency issues */
-       mutex_lock(&queue->queuelock);
+       spin_lock_bh(&queue->queuelock);
 
        /*
         * Can go on to queue if we have space in either:
@@ -822,15 +822,15 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
                ret = -EBUSY;
                if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
                        list_add_tail(&sec_req->backlog_head, &ctx->backlog);
-                       mutex_unlock(&queue->queuelock);
+                       spin_unlock_bh(&queue->queuelock);
                        goto out;
                }
 
-               mutex_unlock(&queue->queuelock);
+               spin_unlock_bh(&queue->queuelock);
                goto err_free_elements;
        }
        ret = sec_send_request(sec_req, queue);
-       mutex_unlock(&queue->queuelock);
+       spin_unlock_bh(&queue->queuelock);
        if (ret)
                goto err_free_elements;
 
@@ -889,7 +889,7 @@ static int sec_alg_skcipher_init(struct crypto_skcipher *tfm)
        if (IS_ERR(ctx->queue))
                return PTR_ERR(ctx->queue);
 
-       mutex_init(&ctx->queue->queuelock);
+       spin_lock_init(&ctx->queue->queuelock);
        ctx->queue->havesoftqueue = false;
 
        return 0;
index 2d2f186674ba91f75cdb4f513496bf3b1fb69998..ddc5d6bd7574e6a8b1da99ec6eb64cff4dda53da 100644 (file)
@@ -347,7 +347,7 @@ struct sec_queue {
        DECLARE_BITMAP(unprocessed, SEC_QUEUE_LEN);
        DECLARE_KFIFO_PTR(softqueue, typeof(struct sec_request_el *));
        bool havesoftqueue;
-       struct mutex queuelock;
+       spinlock_t queuelock;
        void *shadow[SEC_QUEUE_LEN];
 };