Skip to content

Commit

Permalink
crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in softirq
Browse files Browse the repository at this point in the history
[ Upstream commit 68740ab ]

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

Fixes: 915e4e8 ("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>
  • Loading branch information
zhengchaoshao authored and gregkh committed Aug 17, 2022
1 parent aa495df commit d6aee36
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
14 changes: 7 additions & 7 deletions drivers/crypto/hisilicon/sec/sec_algs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
switch (ctx->cipher_alg) {
case SEC_C_AES_CBC_128:
Expand Down Expand Up @@ -509,7 +509,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);
Expand Down Expand Up @@ -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 */
mutex_lock(&queue->queuelock);
spin_lock_bh(&queue->queuelock);

/*
* Can go on to queue if we have space in either:
Expand All @@ -814,15 +814,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;

Expand Down Expand Up @@ -881,7 +881,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;
Expand Down
2 changes: 1 addition & 1 deletion drivers/crypto/hisilicon/sec/sec_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
};

Expand Down

0 comments on commit d6aee36

Please sign in to comment.