From: Herbert Xu Date: Tue, 8 Apr 2025 05:17:20 +0000 (+0800) Subject: crypto: caam/qi - Fix drv_ctx refcount bug X-Git-Tag: v5.10.237~159 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=90eee325b6ed7db8254786fbf0d1afc65876df4f;p=thirdparty%2Fkernel%2Fstable.git crypto: caam/qi - Fix drv_ctx refcount bug commit b7b39df7e710b0068356e4c696af07aa10e2cd3d upstream. Ensure refcount is raised before request is enqueued since it could be dequeued before the call returns. Reported-by: Sean Anderson Cc: Fixes: 11144416a755 ("crypto: caam/qi - optimize frame queue cleanup") Signed-off-by: Herbert Xu Reviewed-by: Horia Geantă Tested-by: Sean Anderson Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/crypto/caam/qi.c b/drivers/crypto/caam/qi.c index 8e9f6097114e3..82afae9ca9079 100644 --- a/drivers/crypto/caam/qi.c +++ b/drivers/crypto/caam/qi.c @@ -115,12 +115,12 @@ int caam_qi_enqueue(struct device *qidev, struct caam_drv_req *req) qm_fd_addr_set64(&fd, addr); do { + refcount_inc(&req->drv_ctx->refcnt); ret = qman_enqueue(req->drv_ctx->req_fq, &fd); - if (likely(!ret)) { - refcount_inc(&req->drv_ctx->refcnt); + if (likely(!ret)) return 0; - } + refcount_dec(&req->drv_ctx->refcnt); if (ret != -EBUSY) break; num_retries++;