All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Chenghai Huang" <huangchenghai2@huawei.com>,
	herbert@gondor.apana.org.au, davem@davemloft.net
Cc: linux-crypto@vger.kernel.org, liulongfang@huawei.com,
	qianweili@huawei.com, wangzhou1@hisilicon.com,
	linwenkai6@hisilicon.com
Subject: Re: [PATCH 4/4] crypto: hisilicon/zip - adapt to use crypto engine
Date: Mon, 09 Nov 2026 08:05:32 +0000	[thread overview]
Message-ID: <sashiko-outbox-204560@kernel.org> (raw)
In-Reply-To: <20261109073556.2517351-5-huangchenghai2@huawei.com>

Thank you for your contribution! Sashiko AI review found 2 potential
issues to consider:
- [High] crypto: hisilicon/zip - req_id exhaustion deadlock in
  hisi_zip_do_comp()
- [Medium] crypto: hisilicon/zip: hisi_zip_do_acomp() clobbers -EBUSY on
  backlog
--

commit e6135edb946689a8be0edb23655def633c6b3f9a
Author: Chenghai Huang <huangchenghai2@huawei.com>

crypto: hisilicon/zip - adapt to use crypto engine

This commit migrates the HiSilicon ZIP acomp driver to the crypto_engine
framework so requests that hit a full hardware queue are queued and retried
instead of failing immediately.

> diff --git a/drivers/crypto/hisilicon/zip/zip_crypto.c b/drivers/crypto/hisilicon/zip/zip_crypto.c
> index 70adde049b535..84951bc74a96e 100644
> --- a/drivers/crypto/hisilicon/zip/zip_crypto.c
> +++ b/drivers/crypto/hisilicon/zip/zip_crypto.c

[ ... ]

> @@ -333,68 +345,111 @@ static void hisi_zip_acomp_cb(struct hisi_qp *qp, void *data)

[ ... ]

> +static int hisi_zip_do_comp(struct hisi_zip_req *req)
> +{
> +	struct hisi_qp *qp = req->qp_ctx->qp;
> +	struct device *dev = &qp->qm->pdev->dev;
> +	int ret;
> +
> +	if (!req->buf_ready) {
> +		ret = hisi_zip_create_req(req);
> +		if (unlikely(ret))
> +			return -ENOSPC;
> +
> +		ret = hisi_zip_map_req_buffers(req);
> +		if (unlikely(ret))
> +			goto remove_req;
> +	}
> +
> +	ret = hisi_zip_do_work(req);
> +	if (ret == -EINPROGRESS)
> +		return -EINPROGRESS;
> +
> +	if (ret == -EBUSY)
> +		return -ENOSPC;

[Severity: High]
Can hisi_zip_do_comp() deadlock qp_ctx->engine when a request with
req->buf_ready == false sits at the head of engine->queue while all
req_q->size bits in req_q->req_bitmap are held by req->buf_ready == true
requests queued behind it?

req_q->req_bitmap has sq_depth bits, while qm_get_avail_sqe() caps the
hardware SQ at sq_depth - 1 in-flight requests.  When hisi_qp_send() returns
-EBUSY, hisi_zip_do_comp() returns -ENOSPC with req->buf_ready == true and
keeps req->req_id allocated while the request is parked in engine->queue.
Because hisi_zip_do_acomp() runs hisi_zip_do_comp() before
crypto_transfer_acomp_request_to_engine(), and qm_poll_req_cb() runs
hisi_zip_acomp_cb() (freeing req_id) before atomic_dec(&qp->qp_status.used),
new submissions can claim freed req_bitmap bits and queue behind an unmapped
request:

CPU0                              CPU1 (QM completion / new submitters)
hisi_zip_do_acomp(req_b)
  /* sq_depth - 1 in flight,
   * 1 parked with req_id held:
   * req_bitmap is full
   */
  hisi_zip_do_comp(req_b)
    hisi_zip_create_req(req_b)
      -> -EBUSY (-ENOSPC,
         buf_ready == false)
  crypto_transfer_acomp_request_to_engine(req_b)
    /* req_b at head of engine->queue */
                                  qm_poll_req_cb()
                                    hisi_zip_acomp_cb()
                                      hisi_zip_remove_req()
                                    /* before atomic_dec(&qp_status.used),
                                     * new hisi_zip_do_acomp() calls
                                     * allocate the freed req_ids, get
                                     * -EBUSY from hisi_qp_send(), and
                                     * queue behind req_b with
                                     * buf_ready == true
                                     */
kworker:
crypto_pump_requests()
  hisi_zip_do_one_request(req_b)
    hisi_zip_create_req(req_b)
      -> -ENOSPC
  crypto_enqueue_request_head(req_b)
  kthread_queue_work(pump_requests)  <-- spins forever

Once all sq_depth bits in req_bitmap are held by requests queued behind
req_b and the hardware SQ drains, req_b can never allocate a req_id and the
requests behind it can never be dequeued to release theirs, wedging the
queue and spinning engine->kworker at 100% CPU.

[ ... ]

> +static int hisi_zip_do_acomp(struct acomp_req *acomp_req, u8 alg_type)
> +{
> +	struct hisi_zip_ctx *ctx = crypto_tfm_ctx(acomp_req->base.tfm);
> +	struct hisi_zip_qp_ctx *qp_ctx = &ctx->qp_ctx[alg_type];
> +	struct hisi_zip_req *req = acomp_request_ctx(acomp_req);
> +	int ret;
> +
> +	if (unlikely(!acomp_req->src || !acomp_req->slen ||
> +		     !acomp_req->dst || !acomp_req->dlen))
> +		return -EINVAL;
> +
> +	req->req = acomp_req;
> +	req->alg_type = alg_type;
> +	req->qp_ctx = qp_ctx;
> +	req->buf_ready = false;
> +
> +	if (ctx->fallback)
> +		return hisi_zip_fallback_do_work(acomp_req,
> +						 req->alg_type == HZIP_ALG_TYPE_DECOMP);
> +
> +	ret = hisi_zip_do_comp(req);
> +	if (ret != -ENOSPC)
> +		return ret;
> +
> +	ret = crypto_transfer_acomp_request_to_engine(qp_ctx->engine, acomp_req);
> +	if (ret != -EINPROGRESS && ret != -EBUSY) {
> +		hisi_zip_release_req_resource(req);
> +		return ret;
> +	}
> +
> +	return -EINPROGRESS;
> +}

[Severity: Medium]
Should hisi_zip_do_acomp() return ret instead of -EINPROGRESS at the end of
the function?

When engine->queue is full and CRYPTO_TFM_REQ_MAY_BACKLOG is set,
crypto_transfer_acomp_request_to_engine() records the request on
engine->queue.backlog and returns -EBUSY.  Returning -EINPROGRESS hides the
backlog signal from callers and still triggers the extra
crypto_request_complete(backlog, -EINPROGRESS) notification from
crypto_pump_requests() that callers only expect after receiving -EBUSY.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261109073556.2517351-1-huangchenghai2@huawei.com?part=4

      reply	other threads:[~2026-11-09  8:05 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-09  7:35 [PATCH 0/4] crypto: engine - add acomp support and adapt Hisilicon HPRE and ZIP drivers Chenghai Huang
2026-11-09  7:35 ` [PATCH 1/4] crypto: engine - clear busy and recheck running in the retry pump loop Chenghai Huang
2026-11-12  9:06   ` Jean-Michel Hautbois
2026-11-09  7:35 ` [PATCH 2/4] crypto: engine - add acomp support Chenghai Huang
2026-11-09  7:46   ` sashiko-bot
2026-11-09 22:17   ` kernel test robot
2026-11-10  2:05   ` kernel test robot
2026-11-09  7:35 ` [PATCH 3/4] crypto: hisilicon/hpre - use crypto engine framework Chenghai Huang
2026-11-09  8:00   ` sashiko-bot
2026-11-09  7:35 ` [PATCH 4/4] crypto: hisilicon/zip - adapt to use crypto engine Chenghai Huang
2026-11-09  8:05   ` sashiko-bot [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sashiko-outbox-204560@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=huangchenghai2@huawei.com \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linwenkai6@hisilicon.com \
    --cc=liulongfang@huawei.com \
    --cc=qianweili@huawei.com \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=wangzhou1@hisilicon.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.