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 >