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: v6.15-rc3~45^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b7b39df7e710b0068356e4c696af07aa10e2cd3d;p=thirdparty%2Flinux.git crypto: caam/qi - Fix drv_ctx refcount bug 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 --- diff --git a/drivers/crypto/caam/qi.c b/drivers/crypto/caam/qi.c index 7701d00bcb3ac..b6e7c0b29d4e6 100644 --- a/drivers/crypto/caam/qi.c +++ b/drivers/crypto/caam/qi.c @@ -122,12 +122,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++;