提交 f3d257b5 编写于 作者: Z Zhengchao Shao 提交者: Zheng Zengkai

crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in softirq

mainline inclusion
from mainline-master
commit 68740ab5
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5MK7S
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=68740ab50543

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

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

Fixes: 915e4e84 ("crypto: hisilicon - SEC security accelerator driver")
Signed-off-by: NZhengchao Shao <shaozhengchao@huawei.com>
Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: NJiangshui Yang <yangjiangshui@h-partners.com>
Reviewed-by: NXiu Jianfeng <xiujianfeng@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 0f7f6985
...@@ -449,7 +449,7 @@ static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp, ...@@ -449,7 +449,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 */ /* Put the IV in place for chained cases */
switch (ctx->cipher_alg) { switch (ctx->cipher_alg) {
case SEC_C_AES_CBC_128: case SEC_C_AES_CBC_128:
...@@ -509,7 +509,7 @@ static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp, ...@@ -509,7 +509,7 @@ static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp,
list_del(&backlog_req->backlog_head); list_del(&backlog_req->backlog_head);
} }
} }
mutex_unlock(&ctx->queue->queuelock); spin_unlock_bh(&ctx->queue->queuelock);
mutex_lock(&sec_req->lock); mutex_lock(&sec_req->lock);
list_del(&sec_req_el->head); list_del(&sec_req_el->head);
...@@ -798,7 +798,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq, ...@@ -798,7 +798,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
*/ */
/* Grab a big lock for a long time to avoid concurrency issues */ /* 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: * Can go on to queue if we have space in either:
...@@ -814,15 +814,15 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq, ...@@ -814,15 +814,15 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
ret = -EBUSY; ret = -EBUSY;
if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
list_add_tail(&sec_req->backlog_head, &ctx->backlog); list_add_tail(&sec_req->backlog_head, &ctx->backlog);
mutex_unlock(&queue->queuelock); spin_unlock_bh(&queue->queuelock);
goto out; goto out;
} }
mutex_unlock(&queue->queuelock); spin_unlock_bh(&queue->queuelock);
goto err_free_elements; goto err_free_elements;
} }
ret = sec_send_request(sec_req, queue); ret = sec_send_request(sec_req, queue);
mutex_unlock(&queue->queuelock); spin_unlock_bh(&queue->queuelock);
if (ret) if (ret)
goto err_free_elements; goto err_free_elements;
...@@ -881,7 +881,7 @@ static int sec_alg_skcipher_init(struct crypto_skcipher *tfm) ...@@ -881,7 +881,7 @@ static int sec_alg_skcipher_init(struct crypto_skcipher *tfm)
if (IS_ERR(ctx->queue)) if (IS_ERR(ctx->queue))
return PTR_ERR(ctx->queue); return PTR_ERR(ctx->queue);
mutex_init(&ctx->queue->queuelock); spin_lock_init(&ctx->queue->queuelock);
ctx->queue->havesoftqueue = false; ctx->queue->havesoftqueue = false;
return 0; return 0;
......
...@@ -347,7 +347,7 @@ struct sec_queue { ...@@ -347,7 +347,7 @@ struct sec_queue {
DECLARE_BITMAP(unprocessed, SEC_QUEUE_LEN); DECLARE_BITMAP(unprocessed, SEC_QUEUE_LEN);
DECLARE_KFIFO_PTR(softqueue, typeof(struct sec_request_el *)); DECLARE_KFIFO_PTR(softqueue, typeof(struct sec_request_el *));
bool havesoftqueue; bool havesoftqueue;
struct mutex queuelock; spinlock_t queuelock;
void *shadow[SEC_QUEUE_LEN]; void *shadow[SEC_QUEUE_LEN];
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册