From: Vinicius Costa Gomes <vinicius.gomes@intel.com>
To: sashiko-reviews@lists.linux.dev
Cc: Frank.Li@kernel.org, dmaengine@vger.kernel.org, vkoul@kernel.org
Subject: Re: [PATCH 2/4] crypto: iaa - fall back to software for multi-entry scatterlists
Date: Tue, 14 Jul 2026 18:31:16 -0700 [thread overview]
Message-ID: <87a4rtqbrv.fsf@intel.com> (raw)
In-Reply-To: <20260714043606.BBD8B1F000E9@smtp.kernel.org>
sashiko-bot@kernel.org writes:
> Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
>
> New issues:
> - [High] Hardcoding the `nents` parameter to 1 in `dma_map_sg` causes
> a kernel panic if `req->dst` is NULL.
Upper layers tries to not give us req->dst being NULL, but will be a bit
more defensive.
> - [Medium] The implementation tracks fallback calls rather than processed bytes, contradicting the commit message.
>
Will fix the commit message.
> Pre-existing issues:
> - [High] Software fallback writes to CPU memory while DMA bounce buffers are mapped, risking data corruption during unmap.
> - [High] A timeout during hardware polling causes the CPU to free DMA structures while the hardware device may still be performing DMA, leading to Use-After-Free memory corruption.
> --
>
> --- Patch [2]: [PATCH 2/4] crypto: iaa - fall back to software for multi-entry scatterlists ---
> commit 6f1532575ac946d82236e0ac6dffd05320f89063
> Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
> Subject: crypto: iaa - fall back to software for multi-entry scatterlists
>
> This commit adds a software fallback for the IAA driver when dealing with
> scatterlists containing multiple entries, as the hardware cannot process
> them directly. It simplifies the DMA mapping path to expect a single entry
> and adds counters for the fallback path.
>
>> Add counters to track the number of bytes processed by the software
>> implementation on the compression direction.
>
> [Severity: Medium]
> The commit message states that counters are added to track the number of
> bytes processed. However, looking at the updates in iaa_crypto_stats.c:
>
> void update_total_sw_comp_calls(void)
> {
> atomic64_inc(&total_sw_comp_calls);
> }
>
> Could it be that the implementation only tracks fallback calls rather than
> the processed bytes?
>
>> diff --git a/drivers/crypto/intel/iaa/iaa_crypto_main.c b/drivers/crypto/intel/iaa/iaa_crypto_main.c
>> index f62b994e18e58..fb154959c2aa8 100644
>> --- a/drivers/crypto/intel/iaa/iaa_crypto_main.c
>> +++ b/drivers/crypto/intel/iaa/iaa_crypto_main.c
> [ ... ]
>> @@ -983,17 +984,43 @@ static inline int check_completion(struct device *dev,
>> return ret;
>> }
>
> [Severity: High]
> This is a pre-existing issue, but how does the driver handle hardware
> DMA after a timeout?
>
> In check_completion(), if the polling loop exceeds IAA_COMPLETION_TIMEOUT,
> it returns -ETIMEDOUT:
>
> check_completion() {
> while (!comp->status) {
> if (status_checks++ >= IAA_COMPLETION_TIMEOUT) {
> ret = -ETIMEDOUT;
> goto out;
> }
> ...
> }
> }
>
> When this timeout happens, the caller immediately frees the IDXD descriptor
> and unmaps the DMA buffers. However, the hardware might still be actively
> processing the request. If the delayed hardware eventually performs a DMA
> write to the destination address after the CPU has reallocated that memory
> for something else, could this cause silent memory corruption?
>
>> -static int deflate_generic_decompress(struct acomp_req *req)
>> +static int deflate_fallback(struct acomp_req *req, bool compress)
> [ ... ]
>> +static int deflate_generic_decompress(struct acomp_req *req)
>> +{
>> + int ret;
>> +
>> + ret = deflate_fallback(req, false);
>> + if (ret)
>> + return ret;
>> +
>> update_total_sw_decomp_calls();
>>
>> - return ret;
>> + return 0;
>> }
>
> [Severity: High]
> This is a pre-existing issue, but I noticed a potential problem when
> deflate_generic_decompress() is called as a fallback from iaa_decompress().
>
> If a hardware error like IAA_ANALYTICS_ERROR occurs in iaa_decompress(),
> the software fallback writes to the CPU virtual mapping of req->dst:
>
> iaa_decompress() {
> ...
> if (idxd_desc->iax_completion->status == IAA_ANALYTICS_ERROR) {
> ret = deflate_generic_decompress(req);
> ...
> }
> }
>
> Since req->dst is still mapped for DMA_FROM_DEVICE at this point,
> when dma_unmap_sg() is eventually called, might it synchronize memory
> from a bounce buffer over the original CPU buffer, overwriting the
> software fallback's output? Should the scatterlist be unmapped before
> invoking the software fallback?
>
> [ ... ]
>> @@ -1507,30 +1538,25 @@ static int iaa_comp_acompress(struct acomp_req *req)
> [ ... ]
>> - nr_sgs = dma_map_sg(dev, req->dst, sg_nents(req->dst), DMA_FROM_DEVICE);
>> - if (nr_sgs <= 0 || nr_sgs > 1) {
> [ ... ]
>> + if (!dma_map_sg(dev, req->dst, 1, DMA_FROM_DEVICE)) {
>
> [Severity: High]
> If req->dst is NULL, sg_nents() will return 0, bypassing the fallback check
> earlier in this function. Calling dma_map_sg() unconditionally with nents=1
> will then attempt to dereference the NULL scatterlist pointer.
>
> Would it be safer to verify req->dst is not NULL before attempting to map
> it, preserving the old behavior where sg_nents(req->dst) returning 0 was
> handled safely?
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260713-iaa-crypto-fixes-zswap-v1-0-65cac23c684d@intel.com?part=2
--
Vinicius
next prev parent reply other threads:[~2026-07-15 1:31 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-14 4:10 [PATCH 0/4] crypto: iaa - Fixes for multi entry SG lists Vinicius Costa Gomes
2026-07-14 4:10 ` [PATCH 1/4] dmaengine: idxd: assign all engines to group 0 in IAA defaults Vinicius Costa Gomes
2026-07-14 4:21 ` sashiko-bot
2026-07-14 21:53 ` Dave Jiang
2026-07-14 21:55 ` Dave Jiang
2026-07-15 1:38 ` Vinicius Costa Gomes
2026-07-14 4:10 ` [PATCH 2/4] crypto: iaa - fall back to software for multi-entry scatterlists Vinicius Costa Gomes
2026-07-14 4:36 ` sashiko-bot
2026-07-15 1:31 ` Vinicius Costa Gomes [this message]
2026-07-14 21:54 ` Dave Jiang
2026-07-14 4:10 ` [PATCH 3/4] crypto: iaa - avoid counting fallback decompression bytes Vinicius Costa Gomes
2026-07-14 4:21 ` sashiko-bot
2026-07-15 1:33 ` Vinicius Costa Gomes
2026-07-14 21:56 ` Dave Jiang
2026-07-14 4:10 ` [PATCH 4/4] crypto: iaa - use bounce buffer for multi-sg decompress input Vinicius Costa Gomes
2026-07-14 4:21 ` sashiko-bot
2026-07-14 22:01 ` Dave Jiang
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=87a4rtqbrv.fsf@intel.com \
--to=vinicius.gomes@intel.com \
--cc=Frank.Li@kernel.org \
--cc=dmaengine@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=vkoul@kernel.org \
/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.