From: Arnd Bergmann <arnd@arndb.de>
To: Ley Foon Tan <lftan@altera.com>
Cc: Linux-Arch <linux-arch@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
Chung-Lin Tang <cltang@codesourcery.com>,
Richard Kuo <rkuo@codeaurora.org>,
linux-hexagon@vger.kernel.org, Mark Salter <msalter@redhat.com>,
Aurelien Jacquiot <a-jacquiot@ti.com>,
linux-c6x-dev@linux-c6x.org
Subject: Re: [PATCH v2 13/29] nios2: DMA mapping API
Date: Thu, 24 Jul 2014 14:05:16 +0200 [thread overview]
Message-ID: <5059148.8xZUvoce2l@wuerfel> (raw)
In-Reply-To: <CAFiDJ582FiLAS=B13O3PV_d-FkR31j=5bN_LcXBSWkrGsHK_Gw@mail.gmail.com>
On Thursday 24 July 2014 19:37:11 Ley Foon Tan wrote:
> On Tue, Jul 15, 2014 at 5:38 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> > On Tuesday 15 July 2014 16:45:40 Ley Foon Tan wrote:
> >> +#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
> >> +#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
> >> +
> > ...
> >> +static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
> >> + enum dma_data_direction direction)
> >> +{
> >> + __dma_sync(vaddr, size, direction);
> >> +}
> >
> > IIRC dma_cache_sync should be empty if you define dma_alloc_noncoherent
> > to be the same as dma_alloc_coherent: It's already coherent, so no sync
> > should be needed. What does the CPU do if you try to invalidate the cache
> > on a coherent mapping?
> Okay, I got what you mean here. I will leave this dma_cache_sync()
> function empty.
> The CPU just do nothing if we try to invalidate cache on a coherent region.
> BTW, I found many other architectures still provide dma_cache_sync()
> even they define dma_alloc_noncoherent
> same as dma_alloc_coherent. Eg: blackfin, x86 or xtense.
They are probably all wrong ;-)
It's not a big issue though, since the x86 operation is cheap and the
other ones don't support any of the drivers that use dma_cache_sync.
> >> +void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
> >> + size_t size, enum dma_data_direction direction)
> >> +{
> >> + BUG_ON(!valid_dma_direction(direction));
> >> +
> >> + __dma_sync(phys_to_virt(dma_handle), size, direction);
> >> +}
> >> +EXPORT_SYMBOL(dma_sync_single_for_cpu);
> >> +
> >> +void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
> >> + size_t size, enum dma_data_direction direction)
> >> +{
> >> + BUG_ON(!valid_dma_direction(direction));
> >> +
> >> + __dma_sync(phys_to_virt(dma_handle), size, direction);
> >> +}
> >> +EXPORT_SYMBOL(dma_sync_single_for_device);
> >
> > More importantly: you do the same operation for both _for_cpu and _for_device.
> > I assume your CPU can never do speculative cache prefetches, so it's not
> > incorrect, but you do twice the number of invalidations and flushes that
> > you need.
> >
> > Why would you do anything for _for_cpu here?
> I am a bit confused for _for_cpu and _for_device here. I found some
> architectures like c6x and hexagon have same operation for both
> _for_cpu and _for_device as well.
(adding their maintainers to cc)
Yes, you are right, they seem to have the same bug and could see a noticeable
DMA performance improvement if they change it as well.
> I have spent some times look at other architectures and below is what
> I found. Please correct me if I am wrong, especially
> for_device():DMA_FROM_DEVICE.
>
> _for_cpu():
> case DMA_BIDIRECTIONAL:
> case DMA_FROM_DEVICE:
> /* invalidate cache */
> break;
> case DMA_TO_DEVICE:
> /* do nothing */
> break;
This seems fine: for a FROM_DEVICE mapping, we have flushed all
dirty entries during the _for_device or the map operation,
so if any clean entries are around, they need to be invalidated
in order to read the data from the device.
for TO_DEVICE, we don't care about the cache, because we are
going to overwrite the data, and we don't need to do anything.
> -------------------------
> _for_device():
> case DMA_BIDIRECTIONAL:
> case DMA_TO_DEVICE:
> /* flush and invalidate cache */
> break;
> case DMA_FROM_DEVICE:
> /* should we invalidate cache or do nothing? */
> break;
You actually don't need to invalidate the TO_DEVICE mappings
in both _for_device and _for_cpu. You have to flush them
in for_device, and you have to invalidate them at least once,
but don't need to invalidate them again in for_cpu if you have
done that already in for_device and your CPU does not do any
speculative prefetches that might populate the dcache.
In case of for_device FROM_DEVICE, you have to invalidate or
flush the caches to ensure that no dirty cache lines are
written to memory, but only if your CPU has a write-back
cache rather than write-through.
For bidirectional mappings, you may have to flush and invalidate.
Arnd
next prev parent reply other threads:[~2014-07-24 12:05 UTC|newest]
Thread overview: 182+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-15 8:45 [PATCH v2 00/29] nios2 Linux kernel port Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 01/29] nios2: Assembly macros and definitions Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 02/29] nios2: Kernel booting and initialization Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-30 9:12 ` Tobias Klauser
2014-07-30 9:12 ` Tobias Klauser
2014-07-30 10:58 ` Ley Foon Tan
2014-07-30 10:58 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 03/29] nios2: Exception handling Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 04/29] nios2: Traps exception handling Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 05/29] nios2: Memory management Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-28 14:59 ` Geert Uytterhoeven
2014-07-28 14:59 ` Geert Uytterhoeven
2014-07-30 6:42 ` Ley Foon Tan
2014-07-30 8:18 ` Geert Uytterhoeven
2014-07-30 8:18 ` Geert Uytterhoeven
2014-07-30 8:57 ` Tobias Klauser
2014-07-30 8:57 ` Tobias Klauser
2014-07-30 10:52 ` Ley Foon Tan
2014-07-30 10:52 ` Ley Foon Tan
2014-07-30 9:01 ` Tobias Klauser
2014-07-30 9:01 ` Tobias Klauser
2014-07-30 10:50 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 06/29] nios2: I/O Mapping Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 9:22 ` Arnd Bergmann
2014-07-15 9:22 ` Arnd Bergmann
2014-07-15 10:51 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 07/29] nios2: MMU Fault handling Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 08/29] nios2: Page table management Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 09/29] nios2: Process management Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 10/29] nios2: Cache handling Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 11/29] nios2: TLB handling Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 12/29] nios2: Interrupt handling Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 9:27 ` Arnd Bergmann
2014-07-15 9:27 ` Arnd Bergmann
2014-07-17 6:15 ` Ley Foon Tan
2014-07-17 6:15 ` Ley Foon Tan
2014-07-17 9:24 ` Arnd Bergmann
2014-07-17 9:24 ` Arnd Bergmann
2014-07-17 10:48 ` Ley Foon Tan
2014-07-17 10:48 ` Ley Foon Tan
2014-07-15 9:51 ` Thomas Gleixner
2014-07-17 6:33 ` Ley Foon Tan
2014-07-17 6:33 ` Ley Foon Tan
2014-07-17 13:58 ` Thomas Gleixner
2014-07-17 13:58 ` Thomas Gleixner
2014-07-18 6:55 ` Ley Foon Tan
2014-07-18 6:55 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 13/29] nios2: DMA mapping API Ley Foon Tan
2014-07-15 9:38 ` Arnd Bergmann
2014-07-24 11:37 ` Ley Foon Tan
2014-07-24 11:37 ` Ley Foon Tan
2014-07-24 12:05 ` Arnd Bergmann [this message]
2014-07-24 12:05 ` Arnd Bergmann
2014-07-28 15:48 ` rkuo
2014-07-30 3:42 ` Ley Foon Tan
2014-07-30 3:42 ` Ley Foon Tan
2014-07-30 12:56 ` James Bottomley
2014-07-30 12:56 ` James Bottomley
2014-07-15 8:45 ` [PATCH v2 14/29] nios2: ELF definitions Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 15/29] nios2: System calls handling Ley Foon Tan
2014-07-18 12:56 ` James Hogan
2014-07-21 11:17 ` Ley Foon Tan
2014-07-21 11:17 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 16/29] nios2: Signal handling support Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-18 8:04 ` Richard Weinberger
2014-07-18 8:04 ` Richard Weinberger
2014-08-08 7:21 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 17/29] nios2: Library functions Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 18/29] nios2: Device tree support Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 9:41 ` Arnd Bergmann
2014-07-15 10:02 ` Ley Foon Tan
2014-07-15 10:02 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 19/29] nios2: Time keeping Ley Foon Tan
2014-07-15 9:45 ` Arnd Bergmann
2014-07-15 9:45 ` Arnd Bergmann
2014-07-21 10:07 ` Ley Foon Tan
2014-07-21 10:07 ` Ley Foon Tan
2014-07-21 10:51 ` Arnd Bergmann
2014-07-21 11:10 ` Ley Foon Tan
2014-07-21 11:10 ` Ley Foon Tan
2014-07-15 10:00 ` Thomas Gleixner
2014-07-21 11:09 ` Ley Foon Tan
2014-07-21 11:09 ` Ley Foon Tan
2014-07-21 12:35 ` Thomas Gleixner
2014-07-15 8:45 ` [PATCH v2 20/29] nios2: Cpuinfo handling Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 9:47 ` Arnd Bergmann
2014-07-15 9:47 ` Arnd Bergmann
2014-07-18 2:43 ` Ley Foon Tan
2014-08-07 5:06 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 21/29] nios2: Futex operations Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 10:03 ` Thomas Gleixner
2014-07-15 10:03 ` Thomas Gleixner
2014-07-17 10:55 ` Ley Foon Tan
2014-07-17 11:07 ` Arnd Bergmann
2014-07-17 11:07 ` Arnd Bergmann
2014-07-18 6:07 ` Ley Foon Tan
2014-07-18 9:09 ` Arnd Bergmann
2014-07-18 9:42 ` Thomas Gleixner
2014-07-18 9:42 ` Thomas Gleixner
2014-07-18 9:55 ` Arnd Bergmann
2014-07-21 3:20 ` Ley Foon Tan
2014-07-21 3:20 ` Ley Foon Tan
2014-07-21 8:01 ` Arnd Bergmann
2014-07-21 10:24 ` Ley Foon Tan
2014-08-05 8:49 ` Geert Uytterhoeven
2014-07-15 8:45 ` [PATCH v2 22/29] nios2: Miscellaneous header files Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 10:22 ` Arnd Bergmann
2014-07-15 10:22 ` Arnd Bergmann
2014-07-15 11:03 ` Chung-Lin Tang
2014-07-15 12:27 ` Arnd Bergmann
2014-07-18 6:15 ` Chung-Lin Tang
2014-07-18 6:15 ` Chung-Lin Tang
2014-07-18 9:18 ` Arnd Bergmann
2014-07-18 9:18 ` Arnd Bergmann
2014-07-16 7:03 ` Ley Foon Tan
2014-07-16 7:03 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 23/29] nios2: Nios2 registers Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 24/29] nios2: Module support Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 10:24 ` Arnd Bergmann
2014-07-15 10:24 ` Arnd Bergmann
2014-07-15 11:12 ` Tobias Klauser
2014-07-15 11:12 ` Tobias Klauser
2014-07-15 12:21 ` Arnd Bergmann
2014-07-15 12:21 ` Arnd Bergmann
2014-07-16 1:36 ` LF.Tan
2014-07-16 1:36 ` LF.Tan
2014-07-16 1:32 ` Ley Foon Tan
2014-07-16 1:32 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 25/29] nios2: ptrace support Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 26/29] Add ELF machine define for Nios2 Ley Foon Tan
2014-07-15 9:04 ` Tobias Klauser
2014-07-15 9:04 ` Tobias Klauser
2014-07-15 9:40 ` Ley Foon Tan
2014-07-15 9:40 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 27/29] MAINTAINERS: Add nios2 maintainer Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 11:10 ` Joe Perches
2014-07-16 1:08 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 28/29] Documentation: Add documentation for Nios2 architecture Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-15 8:45 ` [PATCH v2 29/29] nios2: Build infrastructure Ley Foon Tan
2014-07-15 8:45 ` Ley Foon Tan
2014-07-16 19:50 ` Paul Bolle
2014-07-16 19:50 ` Paul Bolle
2014-07-17 9:35 ` Sam Ravnborg
2014-07-17 9:35 ` Sam Ravnborg
2014-07-15 9:08 ` [PATCH v2 00/29] nios2 Linux kernel port Tobias Klauser
2014-07-15 9:08 ` Tobias Klauser
2014-07-15 9:38 ` Ley Foon Tan
2014-07-15 9:38 ` Ley Foon Tan
2014-07-15 11:15 ` Tobias Klauser
2014-07-16 1:21 ` Ley Foon Tan
2014-07-16 1:21 ` Ley Foon Tan
2014-07-15 13:16 ` David Howells
2014-07-15 13:16 ` David Howells
2014-07-15 13:19 ` Richard Weinberger
2014-07-15 14:20 ` David Howells
2014-07-15 20:27 ` Richard Weinberger
2014-07-15 22:36 ` David Howells
2014-07-15 22:36 ` David Howells
2014-07-15 22:45 ` Greg KH
2014-07-15 22:45 ` Greg KH
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=5059148.8xZUvoce2l@wuerfel \
--to=arnd@arndb.de \
--cc=a-jacquiot@ti.com \
--cc=cltang@codesourcery.com \
--cc=lftan@altera.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-c6x-dev@linux-c6x.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hexagon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=msalter@redhat.com \
--cc=rkuo@codeaurora.org \
/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).