Commit 68740ab5 authored by Zhengchao Shao's avatar Zhengchao Shao Committed by Herbert Xu
Browse files

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: 915e4e84 ("crypto: hisilicon - SEC security accelerator driver")
Signed-off-by: default avatarZhengchao Shao <shaozhengchao@huawei.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 02884a4f
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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];
};