소스 검색

crypto: inside-secure - stop requeueing failed requests

This update the dequeue function of the inside-secure safexcel driver so
that failed requests aren't requeued when they fail (for whatever
reason, which can be because the hw ring is full).

Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Antoine Ténart 8 년 전
부모
커밋
c5acabd33c
1개의 변경된 파일10개의 추가작업 그리고 8개의 파일을 삭제
  1. 10 8
      drivers/crypto/inside-secure/safexcel.c

+ 10 - 8
drivers/crypto/inside-secure/safexcel.c

@@ -439,20 +439,22 @@ void safexcel_dequeue(struct safexcel_crypto_priv *priv, int ring)
 			goto finalize;
 			goto finalize;
 
 
 		request = kzalloc(sizeof(*request), EIP197_GFP_FLAGS(*req));
 		request = kzalloc(sizeof(*request), EIP197_GFP_FLAGS(*req));
-		if (!request)
-			goto requeue;
+		if (!request) {
+			spin_lock_bh(&priv->ring[ring].queue_lock);
+			crypto_enqueue_request(&priv->ring[ring].queue, req);
+			spin_unlock_bh(&priv->ring[ring].queue_lock);
+
+			priv->ring[ring].need_dequeue = true;
+			goto finalize;
+		}
 
 
 		ctx = crypto_tfm_ctx(req->tfm);
 		ctx = crypto_tfm_ctx(req->tfm);
 		ret = ctx->send(req, ring, request, &commands, &results);
 		ret = ctx->send(req, ring, request, &commands, &results);
 		if (ret) {
 		if (ret) {
 			kfree(request);
 			kfree(request);
-requeue:
-			spin_lock_bh(&priv->ring[ring].queue_lock);
-			crypto_enqueue_request(&priv->ring[ring].queue, req);
-			spin_unlock_bh(&priv->ring[ring].queue_lock);
-
+			req->complete(req, ret);
 			priv->ring[ring].need_dequeue = true;
 			priv->ring[ring].need_dequeue = true;
-			continue;
+			goto finalize;
 		}
 		}
 
 
 		if (backlog)
 		if (backlog)