From: "Rosen Penev" <rosenp@gmail.com>
To: "Frank Li" <Frank.li@oss.nxp.com>, "Rosen Penev" <rosenp@gmail.com>
Cc: <dmaengine@vger.kernel.org>, "Vinod Koul" <vkoul@kernel.org>,
"Frank Li" <Frank.Li@kernel.org>,
"Anatolij Gustschin" <agust@denx.de>,
"Yuri Tikhonov" <yur@emcraft.com>,
"Dan Williams" <djbw@kernel.org>,
"open list" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] dmaengine: ppc4xx: check dma_map_page() errors in probe
Date: Fri, 11 Sep 2026 11:10:12 -0700 [thread overview]
Message-ID: <DLCOTGSJIKI9.2U1ISL32HW8C7@gmail.com> (raw)
In-Reply-To: <aqQmw0j8-s5DEv9v@SMW015318>
On Fri Sep 11, 2026 at 9:05 AM PDT, Frank Li wrote:
> On Thu, Sep 10, 2026 at 02:43:34PM -0700, Rosen Penev wrote:
>> In ppc440spe_adma_probe() the helper pages are mapped with
>> dma_map_page() but the returned DMA address is never validated with
>> dma_mapping_error(). On 440SPe the mapping goes through the
>> SWIOTLB/direct map, which can fail under memory pressure or with an
>> IOMMU, returning DMA_MAPPING_ERROR. The bogus address would then be
>> programmed into the CDBs used by the async validation and
>> mult/sum_product operations, causing the engine to DMA to or from
>> arbitrary memory and corrupt data.
>>
>> Fail the probe when either mapping fails, freeing the pages and
>> unmapping the first page if the second mapping fails.
>>
>> Fixes: 12458ea06efd7 ("ppc440spe-adma: adds updated ppc440spe adma driver")
>> Assisted-by: opencode:big-pickle
>> Signed-off-by: Rosen Penev <rosenp@gmail.com>
>> ---
>> drivers/dma/ppc4xx/adma.c | 14 ++++++++++++++
>> 1 file changed, 14 insertions(+)
>>
>> diff --git a/drivers/dma/ppc4xx/adma.c b/drivers/dma/ppc4xx/adma.c
>> index 279a431ccae3..89e778896d7a 100644
>> --- a/drivers/dma/ppc4xx/adma.c
>> +++ b/drivers/dma/ppc4xx/adma.c
>> @@ -4156,8 +4156,22 @@ static int ppc440spe_adma_probe(struct platform_device *ofdev)
>> }
>> chan->pdest = dma_map_page(&ofdev->dev, chan->pdest_page, 0,
>> PAGE_SIZE, DMA_BIDIRECTIONAL);
>> + if (dma_mapping_error(&ofdev->dev, chan->pdest)) {
>> + __free_page(chan->pdest_page);
>> + __free_page(chan->qdest_page);
>
> put these to lable out
Problem there is this is in an if statement. It's not as clean to handle
here directly.
>
> Frank
>
>> + ret = -ENOMEM;
>> + goto out;
>> + }
>> chan->qdest = dma_map_page(&ofdev->dev, chan->qdest_page, 0,
>> PAGE_SIZE, DMA_BIDIRECTIONAL);
>> + if (dma_mapping_error(&ofdev->dev, chan->qdest)) {
>> + dma_unmap_page(&ofdev->dev, chan->pdest,
>> + PAGE_SIZE, DMA_BIDIRECTIONAL);
>> + __free_page(chan->pdest_page);
>> + __free_page(chan->qdest_page);
>> + ret = -ENOMEM;
>> + goto out;
>> + }
>> }
>>
>> ref = kmalloc_obj(*ref);
>> --
>> 2.55.0
>>
prev parent reply other threads:[~2026-09-11 18:10 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 21:43 [PATCH] dmaengine: ppc4xx: check dma_map_page() errors in probe Rosen Penev
2026-09-10 21:48 ` sashiko-bot
2026-09-11 16:05 ` Frank Li
2026-09-11 18:10 ` Rosen Penev [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=DLCOTGSJIKI9.2U1ISL32HW8C7@gmail.com \
--to=rosenp@gmail.com \
--cc=Frank.Li@kernel.org \
--cc=Frank.li@oss.nxp.com \
--cc=agust@denx.de \
--cc=djbw@kernel.org \
--cc=dmaengine@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=vkoul@kernel.org \
--cc=yur@emcraft.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.