Linux PARISC architecture development
 help / color / mirror / Atom feed
From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Mikulas Patocka <mpatocka@redhat.com>,
	John David Anglin <dave@parisc-linux.org>
Cc: Helge Deller <deller@gmx.de>, linux-parisc@vger.kernel.org
Subject: Re: ARCH_DMA_MINALIGN on PA-RISC
Date: Wed, 24 Jul 2024 15:25:58 -0400	[thread overview]
Message-ID: <ef1f849ca7ace78c67b9a398440f012fd29db2c1.camel@HansenPartnership.com> (raw)
In-Reply-To: <93fcf9-f61b-7620-b5f1-d44449d280c9@redhat.com>

On Wed, 2024-07-24 at 20:17 +0200, Mikulas Patocka wrote:
> Hi
> 
> Thanks for fixing the cache aliasing issues on PA-RISC in the commit 
> 72d95924ee35c8cd16ef52f912483ee938a34d49.
> 
> I think there is still one problem left - and that is
> ARCH_DMA_MINALIGN. Currently, it is 16, which is obviously wrong.

I don't think that's obvious, why is it wrong?

> 
> Some comments n the kernel say that PA8900 has L2 cache with 128-byte
> line size, so I think that ARCH_DMA_MINALIGN should be 128 as well.

The L2+ caches on PA88 and 89 systems are PIPT and fully coherent with
the PCI bus, so the L2+ line size doesn't matter that much (well,
except we could possibly get better performance with more judicious DMA
alignment).

All the parisc coherency protocols rely on the CPU L1 cache, which is
still VIPT.  Additionally, the CPU architects kept the minimum line
size for the L1 at 16, so even in the later CPUs which have larger
actual VIPT cache line sizes there's a splitting mechanism which means
they can operate coherency protocols at a line size of 16.  This was
done so the only spinlock primitive parisc has (LDCW) can still operate
correctly with only 16 bytes of alignment.

> The question is - can the CPU speculatively mark a cache line as
> dirty and write it back?

No, the CPU may only mark a line as dirty if something actually wrote
to it; it may not do it speculatively.  The L1 cache can speculatively
move in clean lines if a TLB exists for them and once a line is marked
dirty it's within the gift of the CPU to decide when to write it back
absent a flush.

>  If yes, we have a big problem - Linux assumes that a part of the
> page may be used for DMA transfer and another part of that page may
> be used for normal cacheable structures. If the PA-RISC CPU
> speculatively  prefetched and wrote back a cache line, it could
> corrupt the DMA transfer.

The L2 PIPT PCI coherence protocol ensures that DMA can't corrupt
memory adjacent objects on PA88 and 89.  Earlier CPUs, which were fully
VIPT, do suffer from this problem because they have no PCI coherence,
but they all operate at a line size of 16 anyway and so
ARCH_DMA_MINALIGN works for them.

> If the CPU doesn't speculatively mark cache lines as dirty, then 
> increasing ARCH_DMA_MINALIGN would be sufficient solution.

Well, it's relatively safe to try without exploding all our hashed
spinlocks because the LDCW alignment isn't tied to this (it's a
separate #define in ldcw.h) if you want to benchmark it.

James


  parent reply	other threads:[~2024-07-24 19:26 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-24 18:17 ARCH_DMA_MINALIGN on PA-RISC Mikulas Patocka
2024-07-24 18:48 ` John David Anglin
2024-07-24 19:25 ` James Bottomley [this message]
2024-07-25 16:45   ` John David Anglin
2024-07-25 17:27     ` Mikulas Patocka
2024-07-25 17:43       ` James Bottomley
2024-07-25 17:46         ` Mikulas Patocka
2024-07-25 19:19           ` James Bottomley
2024-07-25 19:13       ` John David Anglin
2024-07-25 20:05         ` John David Anglin
2024-07-25 20:36           ` Mikulas Patocka
2024-07-25 21:29             ` John David Anglin
2024-07-27 10:24               ` Mikulas Patocka
2024-07-27 15:06                 ` John David Anglin
2024-07-25 17:37   ` Mikulas Patocka

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=ef1f849ca7ace78c67b9a398440f012fd29db2c1.camel@HansenPartnership.com \
    --to=james.bottomley@hansenpartnership.com \
    --cc=dave@parisc-linux.org \
    --cc=deller@gmx.de \
    --cc=linux-parisc@vger.kernel.org \
    --cc=mpatocka@redhat.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