From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Vignesh R <vigneshr@ti.com>
Cc: Frode Isaksen <fisaksen@baylibre.com>,
linux-omap@vger.kernel.org, Richard Weinberger <richard@nod.at>,
linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org,
Marek Vasut <marek.vasut@gmail.com>,
Mark Brown <broonie@kernel.org>,
linux-mtd@lists.infradead.org,
Cyrille Pitchen <cyrille.pitchen@atmel.com>,
Brian Norris <computersforpeace@gmail.com>,
David Woodhouse <dwmw2@infradead.org>
Subject: Re: [RFC PATCH 2/2] mtd: devices: m25p80: Enable spi-nor bounce buffer support
Date: Thu, 2 Mar 2017 15:29:21 +0100 [thread overview]
Message-ID: <20170302152921.1c031b57@bbrezillon> (raw)
In-Reply-To: <4cd22ddd-b108-f697-0bde-ad844a386e62@ti.com>
On Thu, 2 Mar 2017 19:24:43 +0530
Vignesh R <vigneshr@ti.com> wrote:
> >>>>
> >>> Not really, I am debugging another issue with UBIFS on DRA74 EVM (ARM
> >>> cortex-a15) wherein pages allocated by vmalloc are in highmem region
> >>> that are not addressable using 32 bit addresses and is backed by LPAE.
> >>> So, a 32 bit DMA cannot access these buffers at all.
> >>> When dma_map_sg() is called to map these pages by spi_map_buf() the
> >>> physical address is just truncated to 32 bit in pfn_to_dma() (as part of
> >>> dma_map_sg() call). This results in random crashes as DMA starts
> >>> accessing random memory during SPI read.
> >>>
> >>> IMO, there may be more undiscovered caveat with using dma_map_sg() for
> >>> non kmalloc'd buffers and its better that spi-nor starts handling these
> >>> buffers instead of relying on spi_map_msg() and working around every
> >>> time something pops up.
> >>>
> >> Ok, I had a closer look at the SPI framework, and it seems there's a
> >> way to tell to the core that a specific transfer cannot use DMA
> >> (->can_dam()). The first thing you should do is fix the spi-davinci
> >> driver:
> >>
> >> 1/ implement ->can_dma()
> >> 2/ patch davinci_spi_bufs() to take the decision to do DMA or not on a
> >> per-xfer basis and not on a per-device basis
> >>
>
> This would lead to poor perf defeating entire purpose of using DMA.
Hm, that's not really true. For all cases where you have a DMA-able
buffer it would still use DMA. For other cases (like the UBI+SPI-NOR
case we're talking about here), yes, it will be slower, but slower is
still better than buggy.
So, in any case, I think the fixes pointed by Frode are needed.
>
> >> Then we can start thinking about how to improve perfs by using a bounce
> >> buffer for large transfers, but I'm still not sure this should be done
> >> at the MTD level...
>
> If its at SPI level, then I guess each individual drivers which cannot
> handle vmalloc'd buffers will have to implement bounce buffer logic.
Well, that's my opinion. The only one that can decide when to do
PIO, when to use DMA or when to use a bounce buffer+DMA is the SPI
controller.
If you move this logic to the SPI NOR layer, you'll have to guess what
is the best approach, and I fear the decision will be wrong on some
platforms (leading to perf degradation).
You're mentioning code duplication in each SPI controller, I agree,
this is far from ideal, but what you're suggesting is not necessarily
better. What if another SPI user starts passing vmalloc-ed buffers to
the SPI controller? You'll have to duplicate the bounce-buffer logic in
this user as well.
>
> Or SPI core can be extended in a way similar to this RFC. That is, SPI
> master driver will set a flag to request SPI core to use of bounce
> buffer for vmalloc'd buffers. And spi_map_buf() just uses bounce buffer
> in case buf does not belong to kmalloc region based on the flag.
That's a better approach IMHO. Note that the decision should not only
be based on the buffer type, but also on the transfer length and/or
whether the controller supports transferring non physically contiguous
buffers.
Maybe we should just extend ->can_dma() to let the core know if it
should use a bounce buffer.
Regarding the bounce buffer allocation logic, I'm not sure how it
should be done. The SPI user should be able to determine a max transfer
len (at least this is the case for SPI NORs) and inform the SPI layer
about this boundary so that the SPI core can allocate a bounce buffer
of this size. But we also have limitations at the SPI master level
(->max_transfer_size(), ->max_message_size()).
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2017-03-02 14:29 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-27 12:08 [RFC PATCH 0/2] mtd: spi-nor: Handle vmalloc'd buffers Vignesh R
2017-02-27 12:08 ` [RFC PATCH 1/2] mtd: spi-nor: Introduce bounce buffer to handle " Vignesh R
2017-02-28 21:39 ` Richard Weinberger
2017-03-01 5:13 ` Vignesh R
2017-03-01 10:09 ` Cyrille Pitchen
2017-03-01 10:18 ` Boris Brezillon
2017-03-01 11:18 ` Frode Isaksen
2017-03-01 12:12 ` Boris Brezillon
2017-03-01 11:50 ` Vignesh R
2017-02-27 12:08 ` [RFC PATCH 2/2] mtd: devices: m25p80: Enable spi-nor bounce buffer support Vignesh R
2017-02-28 21:41 ` Richard Weinberger
2017-03-01 4:54 ` Vignesh R
2017-03-01 10:43 ` Cyrille Pitchen
2017-03-01 11:14 ` Frode Isaksen
2017-03-01 11:46 ` Vignesh R
2017-03-01 12:23 ` Boris Brezillon
2017-03-01 14:21 ` Cyrille Pitchen
[not found] ` <8a2c9b3b-dd5f-fca7-fa5c-690e5bed949f-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org>
2017-03-01 14:28 ` Boris Brezillon
2017-03-01 14:30 ` Cyrille Pitchen
2017-03-01 15:52 ` Mark Brown
2017-03-01 16:04 ` Boris Brezillon
2017-03-01 16:55 ` Boris Brezillon
2017-03-02 9:06 ` Frode Isaksen
2017-03-02 13:54 ` Vignesh R
2017-03-02 14:29 ` Boris Brezillon [this message]
2017-03-02 15:03 ` Frode Isaksen
2017-03-02 15:25 ` Boris Brezillon
2017-03-03 9:02 ` Frode Isaksen
2017-03-02 16:45 ` Cyrille Pitchen
2017-03-02 17:00 ` Mark Brown
2017-03-02 19:49 ` Boris Brezillon
2017-03-03 12:50 ` Mark Brown
2017-03-06 11:47 ` Vignesh R
2017-03-14 13:21 ` Vignesh R
2017-02-27 14:03 ` [RFC PATCH 0/2] mtd: spi-nor: Handle vmalloc'd buffers Frode Isaksen
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=20170302152921.1c031b57@bbrezillon \
--to=boris.brezillon@free-electrons.com \
--cc=broonie@kernel.org \
--cc=computersforpeace@gmail.com \
--cc=cyrille.pitchen@atmel.com \
--cc=dwmw2@infradead.org \
--cc=fisaksen@baylibre.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-spi@vger.kernel.org \
--cc=marek.vasut@gmail.com \
--cc=richard@nod.at \
--cc=vigneshr@ti.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).