Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf411bcc authored by Zhengchao Shao's avatar Zhengchao Shao Committed by Greg Kroah-Hartman
Browse files

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



[ 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: 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>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 2e34d6c8
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];
};