forked from Minki/linux
crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in softirq
When kunpeng916 encryption driver is used to deencrypt and decrypt
packets during the softirq, it is not allowed to use mutex lock.
Fixes: 915e4e8413
("crypto: hisilicon - SEC security accelerator driver")
Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
02884a4f12
commit
68740ab505
@ -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:
|
||||
@ -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);
|
||||
@ -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:
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user