linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: benh@kernel.crashing.org (Benjamin Herrenschmidt)
To: linux-arm-kernel@lists.infradead.org
Subject: USB mass storage and ARM cache coherency
Date: Sat, 27 Feb 2010 08:49:40 +1100	[thread overview]
Message-ID: <1267220980.23523.1820.camel@pasglop> (raw)
In-Reply-To: <1267202674.14703.70.camel@e102109-lin.cambridge.arm.com>


> On ARM, update_mmu_cache() invalidates the I-cache (if VM_EXEC)
> independent of whether the D-cache was dirty (since we can get
> speculative fetches into the I-cache before it was even mapped).

We can get those speculative fetches too on power.

However, we only do the invalidate when PG_arch_1 is clear to avoid
doing it multiple time for a page that was already "cleaned". But it
seems that might not be that a good idea if indeed flush_dcache_page()
is not called for DMA transfers in most cases.

(In addition there is the race I mentioned with update_mmu_cache on SMP)

> > > > Note that from experience, doing the check & flushes in
> > > > update_mmu_cache() is racy on SMP. At least for I$/D$, we have the case
> > > > where processor one does set_pte followed by update_mmu_cache(). The
> > > > later isn't done yet but processor 2 sees the PTE now and starts using
> > > > it, cache hasn't been fully flushed yet. You may avoid that race in some
> > > > ways, but on ppc, I've stopped using that.
> > >
> > > I think that's possible on ARM too. Having two threads on different
> > > CPUs, one thread triggers a prefetch abort (instruction page fault) on
> > > CPU0 but the second thread on CPU1 may branch into this page after
> > > set_pte() (hence not fault) but before update_mmu_cache() doing the
> > > flush.
> > >
> > > On ARM11MPCore we flush the caches in flush_dcache_page() because the
> > > cache maintenance operations weren't visible to the other CPUs.
> > 
> > I'm not even sure that's going to be 100% correct. Don't you also need
> > to flush the remote icaches when you are dealing with instructions (such
> > as swap) anyways ?
> 
> I don't think we tried swap but for pages that have been mapped for the
> first time, the I-cache would be clean. 
>
> At mm switching, if a thread
> migrates to a new CPU we invalidate the cache at that point.

That sounds fragile. What about a multithread app with one thread on
each core hitting the pages at the same time ? Sounds racy to me...

> > I've had some discussions in the past with Russell and others around the
> > problem of non-broadcast cache ops on ARM SMP since that's also hurting
> > you hard with dma mappings.
> > 
> > Can you issue IPIs as FIQs if needed (from my old ARM knowledge, FIQs
> > are still on even in local_irq_save() blocks right ? I haven't touched
> > low level ARM for years tho, I may have forgotten things).
> 
> I have a patch for using IPIs via IRQ from the DMA API functions but,
> while it works, it can deadlock with some drivers (complex situation).
> Note that the patch added a specific IPI implementation which can cope
> with interrupts being disabled (unlike the generic one).

It will deadlock if you use normal IRQs. I don't see a good way around
that other than using a higher-level type of IRQs. I though ARM has
something like that (FIQs ?). Can you use those guys for IPIs ?

> My latest solution - http://bit.ly/apJv3O - is to use dummy
> read-for-ownership or write-for-ownership accesses in the DMA cache
> flushing functions to force cache line migration from the other CPUs.

That might do, but won't help for the icache, will it ?

> Our current benchmarks only show around 10% disc throughput penalty
> compared to the normal SMP case (compared to the UP case the penalty is
> bigger but that's due to other things).

Cheers,
Ben.

  reply	other threads:[~2010-02-26 21:49 UTC|newest]

Thread overview: 155+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20100129185434.GH19501@one-eyed-alien.net>
     [not found] ` <1265045354.25750.52.camel@pc1117.cambridge.arm.com>
2010-02-08  6:55   ` USB mass storage and ARM cache coherency Pavel Machek
2010-02-08  7:33     ` Andreas Mohr
2010-02-08 10:19       ` Catalin Marinas
2010-02-08  9:51     ` Catalin Marinas
2010-02-08 10:03       ` Andy Green
2010-02-17  9:50         ` Sascha Hauer
2010-02-17  9:57           ` Andy Green
2010-02-08 10:52       ` Pavel Machek
2010-02-08 11:28         ` Catalin Marinas
2010-02-16  7:57           ` Shilimkar, Santosh
2010-02-16  8:22             ` Oliver Neukum
2010-02-16  8:55               ` Shilimkar, Santosh
2010-02-16  9:07                 ` Oliver Neukum
2010-02-16  9:39                   ` Russell King - ARM Linux
2010-02-16 13:32                     ` Oliver Neukum
2010-02-16 13:40                       ` Shilimkar, Santosh
2010-02-16 13:46                         ` Oliver Neukum
2010-02-16 14:12                           ` Shilimkar, Santosh
2010-02-16 14:22                             ` Oliver Neukum
2010-02-16 14:45                               ` Shilimkar, Santosh
2010-02-16 15:44                                 ` Alan Stern
2010-02-17  8:55                               ` Shilimkar, Santosh
2010-02-17  9:10                                 ` Oliver Neukum
2010-02-17  9:17                                   ` Shilimkar, Santosh
2010-02-17 17:02                                 ` Alan Stern
2010-02-17 20:26                                   ` Russell King - ARM Linux
2010-02-17 20:30                                   ` Gadiyar, Anand
2010-02-18  6:56                                     ` Oliver Neukum
2010-02-18  7:14                                       ` Gadiyar, Anand
2010-02-17 12:29                     ` Jamie Lokier
2010-02-17  3:21                 ` Ming Lei
2010-02-17  9:05               ` Benjamin Herrenschmidt
2010-02-17  9:15                 ` Oliver Neukum
2010-02-17  9:40                   ` Benjamin Herrenschmidt
2010-02-17 10:09                     ` Oliver Neukum
2010-02-17 10:18                       ` Benjamin Herrenschmidt
2010-02-17 10:23                         ` Oliver Neukum
2010-02-17 12:15                           ` Benjamin Herrenschmidt
2010-02-17  9:55                 ` Russell King - ARM Linux
2010-02-17 10:05                   ` Benjamin Herrenschmidt
2010-02-17 15:27                 ` Catalin Marinas
2010-02-17 20:37                   ` Benjamin Herrenschmidt
2010-02-17 20:44                     ` Russell King - ARM Linux
2010-02-17 22:31                       ` Benjamin Herrenschmidt
2010-02-19 17:15                         ` Catalin Marinas
2010-02-19 17:36                           ` Catalin Marinas
2010-02-19 20:53                             ` Oliver Neukum
2010-02-24  2:48                               ` Benjamin Herrenschmidt
2010-02-24  7:16                                 ` Oliver Neukum
2010-02-24 21:12                                   ` Benjamin Herrenschmidt
2010-02-25  3:48                                     ` Oliver Neukum
2010-02-26  0:22                                       ` Benjamin Herrenschmidt
2010-02-25 12:36                                     ` James Bottomley
2010-02-24  2:47                             ` Benjamin Herrenschmidt
2010-02-24 16:19                               ` Alan Stern
2010-02-24 21:13                                 ` Benjamin Herrenschmidt
2010-02-24 21:50                                   ` Alan Stern
2010-02-25 20:52                                     ` Benjamin Herrenschmidt
2010-02-26 16:00                                   ` Catalin Marinas
2010-02-26 21:36                                     ` Benjamin Herrenschmidt
2010-02-26 16:25                               ` Catalin Marinas
2010-02-26 16:52                                 ` Alan Stern
2010-02-26 21:51                                   ` Benjamin Herrenschmidt
2010-02-26 21:00                                 ` Russell King - ARM Linux
2010-02-28  0:14                                   ` Benjamin Herrenschmidt
2010-02-28  5:01                                     ` James Bottomley
2010-03-01 10:39                                       ` Catalin Marinas
2010-03-01 11:06                                         ` Russell King - ARM Linux
2010-03-02 12:11                                       ` FUJITA Tomonori
2010-03-02 17:05                                         ` Catalin Marinas
2010-03-02 17:47                                           ` Catalin Marinas
2010-03-02 23:33                                             ` Benjamin Herrenschmidt
2010-03-03 10:21                                               ` Catalin Marinas
2010-03-02 23:29                                           ` Benjamin Herrenschmidt
2010-03-03  3:47                                             ` FUJITA Tomonori
2010-03-03  5:10                                               ` Benjamin Herrenschmidt
2010-03-03  5:40                                                 ` James Bottomley
2010-03-03  9:36                                                   ` Russell King - ARM Linux
2010-03-03 10:24                                                     ` James Bottomley
2010-03-03 19:41                                                       ` Russell King - ARM Linux
2010-03-04  2:00                                                   ` Benjamin Herrenschmidt
2010-03-04  8:26                                                     ` James Bottomley
2010-03-04 21:25                                                       ` Benjamin Herrenschmidt
2010-03-03  6:35                                                 ` FUJITA Tomonori
2010-03-03 10:43                                               ` Catalin Marinas
2010-03-03 10:40                                             ` Catalin Marinas
2010-03-03 21:54                                           ` Pavel Machek
2010-03-04  6:54                                             ` Wolfgang Mües
2010-03-04  9:31                                               ` Russell King - ARM Linux
2010-03-06 10:56                                                 ` Wolfgang Mües
2010-03-06 11:05                                                   ` Oliver Neukum
2010-03-06 19:44                                                   ` Russell King - ARM Linux
2010-03-04 13:47                                               ` Catalin Marinas
2010-03-04 13:35                                             ` Catalin Marinas
2010-03-04 13:51                                               ` Pavel Machek
2010-03-04 14:21                                                 ` James Bottomley
2010-03-04 14:27                                                   ` Russell King - ARM Linux
2010-03-04 15:25                                                     ` Catalin Marinas
2010-03-04 15:34                                                       ` Russell King - ARM Linux
2010-03-04 21:31                                                       ` Benjamin Herrenschmidt
2010-03-06 10:47                                                     ` James Bottomley
2010-03-06 19:36                                                       ` Russell King - ARM Linux
2010-03-06 21:07                                                         ` Benjamin Herrenschmidt
2010-03-07  5:54                                                         ` James Bottomley
2010-03-08 11:17                                                         ` Catalin Marinas
2010-03-06 21:03                                                       ` Benjamin Herrenschmidt
2010-03-07  3:37                                                         ` James Bottomley
2010-03-08  8:46                                                           ` FUJITA Tomonori
2010-03-09  2:25                                                           ` Benjamin Herrenschmidt
2010-03-04 15:29                                                   ` Catalin Marinas
2010-03-04 15:41                                                     ` Paul Mundt
2010-03-04 16:30                                                       ` Russell King - ARM Linux
2010-03-04 17:34                                                         ` Catalin Marinas
2010-03-04 17:54                                                           ` Russell King - ARM Linux
2010-03-04 18:07                                                       ` Catalin Marinas
2010-03-04 21:37                                                         ` Benjamin Herrenschmidt
2010-03-04 22:11                                                           ` Catalin Marinas
2010-03-05  4:34                                                             ` Benjamin Herrenschmidt
2010-03-05  9:27                                                               ` Catalin Marinas
2010-03-05  1:17                                                           ` Paul Mundt
2010-03-05  4:44                                                             ` Benjamin Herrenschmidt
2010-03-10  3:52                                                               ` Paul Mundt
2010-03-11 21:44                                                                 ` Benjamin Herrenschmidt
2010-03-04 21:34                                                       ` Benjamin Herrenschmidt
2010-03-04 21:28                                                   ` Benjamin Herrenschmidt
2010-03-04 21:40                                                     ` Russell King - ARM Linux
2010-03-05  4:31                                                       ` Benjamin Herrenschmidt
2010-03-04 15:35                                                 ` Catalin Marinas
2010-03-07  8:23                                                   ` Pavel Machek
2010-03-08 10:57                                                     ` Catalin Marinas
2010-03-02 23:26                                         ` Benjamin Herrenschmidt
2010-03-01 10:42                                     ` Catalin Marinas
2010-03-03 20:24                                       ` Jamie Lokier
2010-02-26 21:40                                 ` Benjamin Herrenschmidt
2010-02-26 21:49                                   ` Russell King - ARM Linux
2010-02-28  0:24                                     ` Benjamin Herrenschmidt
2010-02-28 19:17                                       ` Pavel Machek
2010-03-01 11:10                                       ` Catalin Marinas
2010-03-02  4:11                                         ` Benjamin Herrenschmidt
2010-02-24  2:39                           ` Benjamin Herrenschmidt
2010-02-26 16:44                             ` Catalin Marinas
2010-02-26 21:49                               ` Benjamin Herrenschmidt [this message]
2010-02-26 22:03                                 ` Russell King - ARM Linux
2010-02-28  0:29                                   ` Benjamin Herrenschmidt
2010-02-28 23:20                                   ` Catalin Marinas
2010-02-28 23:17                                 ` Catalin Marinas
2010-02-17 15:27                 ` Catalin Marinas
2010-02-17 15:39                 ` Catalin Marinas
2010-02-17 15:40                 ` Catalin Marinas
2010-02-17 15:40                 ` Catalin Marinas
2010-02-17 16:19                   ` Catalin Marinas
2010-02-17 16:19                   ` Catalin Marinas
2010-02-16  8:44             ` Russell King - ARM Linux
2010-02-16  8:51               ` Gadiyar, Anand
2010-02-20  7:21                 ` Pete Zaitcev

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=1267220980.23523.1820.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=linux-arm-kernel@lists.infradead.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).