Messages in this thread | | | Date | Fri, 2 Jul 2021 09:02:03 +0800 | Subject | Re: [PATCH] mmc: warn for invalid SDIO data buffe rs【请注意,邮件由 ernel.org代发】 | From | Shawn Lin <> |
| |
Hi Arnd
On 2021/6/30 20:20, Arnd Bergmann wrote: > From: Arnd Bergmann <arnd@arndb.de> > > Jernej Skrabec reported a problem with the cw1200 driver failing on > arm64 systems with CONFIG_VMAP_STACK=y. > > The driver in this case passes a pointer to a stack variable (in vmalloc > space) into the sdio layer, which gets translated into an invalid DMA > address. > > Even without CONFIG_VMAP_STACK, the driver is still unreliable, as > cache invalidations on the DMA buffer may cause random data corruption > in adjacent stack slots. > > This could be worked around in the SDIO core, but in the discussion we > decided that passing a stack variable into SDIO should always be considered > a bug, as it is for USB drivers. > > Change the sdio core to produce a one-time warning for any on-stack > (both with and without CONFIG_VMAP_STACK) as well as any vmalloc > or module-local address that would have the same translation problem.
This was the previous comment about the same topic. Should we check for mmc_io_rw_direct?
https://www.spinics.net/lists/linux-mmc/msg41794.html
> > Cc: Jernej Skrabec <jernej.skrabec@gmail.com> > Link: https://lore.kernel.org/lkml/20210622202345.795578-1-jernej.skrabec@gmail.com/ > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > drivers/mmc/core/sdio_ops.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/mmc/core/sdio_ops.c b/drivers/mmc/core/sdio_ops.c > index 4c229dd2b6e5..14e983faf223 100644 > --- a/drivers/mmc/core/sdio_ops.c > +++ b/drivers/mmc/core/sdio_ops.c > @@ -6,6 +6,7 @@ > */ > > #include <linux/scatterlist.h> > +#include <linux/sched/task_stack.h> > > #include <linux/mmc/host.h> > #include <linux/mmc/card.h> > @@ -124,6 +125,7 @@ int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn, > int err; > > WARN_ON(blksz == 0); > + WARN_ON_ONCE(is_vmalloc_or_module_addr(buf) || object_is_on_stack(buf)); > > /* sanity check */ > if (addr & ~0x1FFFF) >
| |