Re: [PATCH] mmc: sdhci: unmap the bounce buffer before device release

Ulf Hansson <[email protected]> Tue, 4 Aug 2026 15:42:53 +0200
Newsgroups org.kernel.vger.linux-mmc,org.kernel.vger.linux-kernel,org.kernel.vger.stable
Message-ID <CAPx+jO-uVPs0xXvX=qie_pP8+L6yaWSD+w=1Jh8tCEXNYmxugA@mail.gmail.com>
On Mon, Jul 27, 2026 at 4:11=E2=80=AFPM Myeonghun Pak <[email protected]> w=
rote:
>
> sdhci_allocate_bounce_buffer() allocates its buffer with devm_kmalloc()
> but maps it with dma_map_single(). The buffer is therefore released by
> devres without the streaming DMA mapping being unmapped.
>
> Register a managed action after dma_map_single() succeeds so the mapping
> is removed before devres releases the buffer. The action is registered
> only for buffers allocated and mapped by the SDHCI core, leaving buffers
> provided by host drivers under their existing ownership.
>
> Fixes: bd9b902798ab ("mmc: sdhci: Implement an SDHCI-specific bounce buff=
er")
> Cc: [email protected]
> Co-developed-by: Ijae Kim <[email protected]>
> Signed-off-by: Ijae Kim <[email protected]>
> Signed-off-by: Myeonghun Pak <[email protected]>

Applied for fixes, thanks!

Kind regards
Uffe


> ---
>  drivers/mmc/host/sdhci.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index e3bf901b10aa..efb4c7742fe2 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -4187,6 +4187,14 @@ void __sdhci_read_caps(struct sdhci_host *host, co=
nst u16 *ver,
>  }
>  EXPORT_SYMBOL_GPL(__sdhci_read_caps);
>
> +static void sdhci_unmap_bounce_buffer(void *data)
> +{
> +       struct sdhci_host *host =3D data;
> +
> +       dma_unmap_single(mmc_dev(host->mmc), host->bounce_addr,
> +                        host->bounce_buffer_size, DMA_BIDIRECTIONAL);
> +}
> +
>  static void sdhci_allocate_bounce_buffer(struct sdhci_host *host)
>  {
>         struct mmc_host *mmc =3D host->mmc;
> @@ -4247,6 +4255,14 @@ static void sdhci_allocate_bounce_buffer(struct sd=
hci_host *host)
>         }
>
>         host->bounce_buffer_size =3D bounce_size;
> +       ret =3D devm_add_action_or_reset(mmc_dev(mmc),
> +                                      sdhci_unmap_bounce_buffer, host);
> +       if (ret) {
> +               devm_kfree(mmc_dev(mmc), host->bounce_buffer);
> +               host->bounce_buffer =3D NULL;
> +               host->bounce_buffer_size =3D 0;
> +               return;
> +       }
>
>  out:
>         /* Lie about this since we're bouncing */
> --
> 2.47.1
>