Re: [PATCH] mmc: sdhci-esdhc-mcf: Flag if the sg_miter is atomic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 22, 2024 at 7:22 AM Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote:
> On 22/02/24 02:00, Linus Walleij wrote:
> > The sg_miter used to loop over the returned sglist from a
> > transfer in the esdhc subdriver for SDHCI needs to know if
> > it is being used in process or atomic context.
> >
> > This creates a problem because we cannot unconditionally
> > add SG_MITER_ATOMIC to the miter, as that can create
> > scheduling while atomic dmesg splats.
> >
> > Bit the bullet and make the .request_done() callback in
> > struct sdhci_ops aware of whether it is called from atomic
> > context or not, and only add the flag when actually called
> > from atomic context.
> >
> > sdhci_request_done() is always called from process context,
> > either as a work or as part of the threaded interrupt handler,
> > so this will pass false for is_atomic, and the one case when
> > we are actually calling .request_done() from an atomic context
> > is in sdhci_irq().
> >
> > Fixes: e8a167b84886 ("mmc: sdhci-esdhc-mcf: Use sg_miter for swapping")
>
> I notice, in fact, that the driver is already using a bounce
> buffer always:
>
> static int sdhci_esdhc_mcf_probe(struct platform_device *pdev)
> ...
>         if (!host->bounce_buffer) {
>                 dev_err(&pdev->dev, "bounce buffer not allocated");
>                 err = -ENOMEM;
>                 goto cleanup;
>         }
> ...
>
> Doesn't that mean the original patch is not needed?

TBH I just followed the pattern to handle sglists everywhere the same
way.

I looked closer at it: on the write path what you say is definately correct:
we copy the data to the bounce buffer and byte swap it in
esdhc_mcf_copy_to_bounce_buffer() and that buffer is a GFP_KERNEL
allocation so it will be in lowmem.

As we can see in sdhci_pre_dma_transfer() this is however as the name
suggests only copying *to* the bounce buffer on mem->device transfers
using DMA, i.e. when writing blocks. (Small writes is where we saw the
big win with this bounce buffer when we wrote the code.)

In the case of incoming data, reading blocks, DMA will read data into the
sglist locations, which are some physical memory. This could very well
be in highmem, especially for prefetching. Then at the end of a read
esdhc_mcf_request_done() is called to byteswap incoming data, and
if that is in highmem we need this sg miter walking code.

So I think this code is needed, at least theoretically.

Then whether ColdFire m5441x will use highmem is another
question. I don't know anything about the ColdFire memory configurations
so I converted it on a "better safe than sorry"-basis.
arch/m68k/include/asm/mcf_pgalloc.h makes an effort to avoid putting
page tables into highmem, and I suppose that is for a reason so this device
can actually have highmem?

Yours,
Linus Walleij





[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux