Browse Source

qcedev: hold spinlock while managing crypto errors.

Currently, there is no lock held when doing crypto
housekeeping when a timeout occurs. Use a lock in this
scenario to avoid concurrent scenario timing errors.

Change-Id: I60c243e0dfde5a716df772177ab4cd75d9b5b7cc
Signed-off-by: Gaurav Kashyap <[email protected]>
Gaurav Kashyap 2 years ago
parent
commit
bbca708384
1 changed files with 4 additions and 0 deletions
  1. 4 0
      crypto-qti/qcedev.c

+ 4 - 0
crypto-qti/qcedev.c

@@ -786,6 +786,7 @@ static int submit_req(struct qcedev_async_req *qcedev_areq,
 				podev->lock,
 				msecs_to_jiffies(MAX_REQUEST_TIME)) == 0) {
 				pr_err("%s: request timed out\n", __func__);
+				spin_unlock_irqrestore(&podev->lock, flags);
 				return qcedev_areq->err;
 			}
 		}
@@ -823,14 +824,17 @@ static int submit_req(struct qcedev_async_req *qcedev_areq,
 		pr_err("%s: wait timed out, req info = %d\n", __func__,
 					current_req_info);
 		print_sts = true;
+		spin_lock_irqsave(&podev->lock, flags);
 		qcedev_check_crypto_status(qcedev_areq, podev->qce, print_sts);
 		qcedev_areq->timed_out = true;
 		ret = qce_manage_timeout(podev->qce, current_req_info);
 		if (ret) {
 			pr_err("%s: error during manage timeout", __func__);
 			qcedev_areq->err = -EIO;
+			spin_unlock_irqrestore(&podev->lock, flags);
 			return qcedev_areq->err;
 		}
+		spin_unlock_irqrestore(&podev->lock, flags);
 		tasklet_schedule(&podev->done_tasklet);
 		if (qcedev_areq->offload_cipher_op_req.err !=
 						QCEDEV_OFFLOAD_NO_ERROR)