From: Samuel Holland <samuel.holland@sifive.com>
To: Palmer Dabbelt <palmer@dabbelt.com>,
Paul Walmsley <pjw@kernel.org>,
linux-riscv@lists.infradead.org,
Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@redhat.com>,
linux-mm@kvack.org
Cc: devicetree@vger.kernel.org,
Suren Baghdasaryan <surenb@google.com>,
linux-kernel@vger.kernel.org, Mike Rapoport <rppt@kernel.org>,
Michal Hocko <mhocko@suse.com>, Conor Dooley <conor@kernel.org>,
Lorenzo Stoakes <lorenzo.stoakes@oracle.com>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Alexandre Ghiti <alex@ghiti.fr>,
Emil Renner Berthing <kernel@esmil.dk>,
Rob Herring <robh+dt@kernel.org>,
Vlastimil Babka <vbabka@suse.cz>,
"Liam R . Howlett" <Liam.Howlett@oracle.com>,
Samuel Holland <samuel.holland@sifive.com>,
Andy Whitcroft <apw@canonical.com>,
Dwaipayan Ray <dwaipayanray1@gmail.com>,
Joe Perches <joe@perches.com>,
Julia Lawall <Julia.Lawall@inria.fr>,
Lukas Bulwahn <lukas.bulwahn@gmail.com>,
Nicolas Palix <nicolas.palix@imag.fr>
Subject: [PATCH v3 00/22] riscv: Memory type control for platforms with physical memory aliases
Date: Wed, 12 Nov 2025 17:45:13 -0800 [thread overview]
Message-ID: <20251113014656.2605447-1-samuel.holland@sifive.com> (raw)
On some RISC-V platforms, including StarFive JH7100 and ESWIN EIC7700,
DRAM is mapped to multiple physical address ranges, with each alias
having a different set of statically-determined Physical Memory
Attributes (PMAs), such as cacheability. Software can alter the PMAs for
a page by selecting a PFN from the corresponding physical address range.
On these platforms, this is the only way to allocate noncached memory
for use with noncoherent DMA.
These physical memory aliases are only visible to architecture code.
Generic MM code only ever sees the primary (cacheable) alias. The major
change from v1 of this series is that I was asked to move the hooks from
pfn_pXX()/pXX_pfn() to set_pXX()/pXXp_get().
- Patches 1-10 ensure that architecture-specific code that hooks page
table reads and writes is always called, and the calls are balanced.
- Patches 11-14 refactor existing platform-specific memory type support
to be modeled as variants on top of the standard Svpbmt extension,
and apply the memory type transformation during PTE reads/writes.
- Patches 15-20 add a new DT binding to describe physical memory
regions, and implement a new memory type variant that transforms the
PFN to use the desired alias when reading/writing page tables.
- Patches 21-22 enable this new memory type variant on StarFive JH7100
and ESWIN EIC7700.
I have boot-tested this series and tested DMA on SoCs with each of the
four ways to select a memory type: SiFive FU740 (none), SiFive
P470-based SoC (Svpbmt), Allwinner D1 (XTheadMae), StarFive JH7100
(aliases), and ESWIN EIC7700 (aliases).
Here is some basic `perf benchmark` data comparing relative performance
between v6.17 and either the generic MM changes or the whole series:
Test | Scenario | FU740 | P470 | D1 | EIC7700
=============================================================
syscall | patch 1-10 | +3.17% | +0.89% | +2.60% | +0.68%
basic | series | -2.52% | -1.41% | +1.37% | -0.64%
-------------------------------------------------------------
syscall | patch 1-10 | +0.17% | -0.57% | +2.79% | -1.12%
fork | series | -1.31% | -5.91% | -1.50% | -2.73%
-------------------------------------------------------------
syscall | patch 1-10 | -0.24% | -0.30% | +2.76% | +1.32%
execve | series | -1.65% | -4.82% | -1.38% | -0.66%
-------------------------------------------------------------
sched | patch 1-10 | +1.54% | -5.76% | -5.09% | -1.04%
messaging | series | +0.66% | +2.00% | +1.40% | +1.97%
-------------------------------------------------------------
The benchmark results are stable within each machine, and the same
binary was used on all machines. I would have expected the preparatory
changes (patch 1-10) to hurt performance somewhat, due to READ_ONCE/
WRITE_ONCE generating additional loads/stores, but surprisingly
performance was improved in some cases. The variation across machines
in response to the entire series is expected, as each of these machines
gets a different version of the alternative block.
Changes in v3:
- Use upstream commit/patch for Anshuman Khandual's changes
- Rebased on top of torvalds/master (v6.18-rc5+)
- Add a checkpatch rule to warn on page table pointer dereference
- Select DMA_DIRECT_REMAP when any memory type extension is enabled
- Split PMR_IS_ALIAS flag from PMR_ALIAS_MASK number
- Add "model" property to DT binding example to fix validation
- Fix the logic to allow an alias to be paired with region entry 0
- Fix the entry number of the paired region in the DT
- Keep the ERRATA_STARFIVE_JH7100 option but update its description
- CC all core MM reviewers
Changes in v2:
- Keep Kconfig options for each PBMT variant separate/non-overlapping
- Move fixup code sequences to set_pXX() and pXXp_get()
- Only define ALT_UNFIX_MT in configurations that need it
- Improve inline documentation of ALT_FIXUP_MT/ALT_UNFIX_MT
- Fix erroneously-escaped newline in assembly ALTERNATIVE_CFG_3 macro
- Remove references to Physical Address Width (no longer part of Smmpt)
- Remove special first entry from the list of physical memory regions
- Fix compatible string in DT binding example
- Put new code behind a new Kconfig option RISCV_ISA_XLINUXMEMALIAS
- Document the calling convention of riscv_fixup/unfix_memory_alias()
- Do not transform !pte_present() (e.g. swap) PTEs
- Export riscv_fixup/unfix_memory_alias() to fix module compilation
- Move the JH7100 DT changes from jh7100-common.dtsi to jh7100.dtsi
- Keep RISCV_DMA_NONCOHERENT and RISCV_NONSTANDARD_CACHE_OPS selected
Anshuman Khandual (4):
mm/ptdump: replace READ_ONCE() with standard page table accessors
mm: replace READ_ONCE() with standard page table accessors
mm/dirty: replace READ_ONCE() with pudp_get()
perf/events: replace READ_ONCE() with standard page table accessors
Samuel Holland (18):
mm: Move the fallback definitions of pXXp_get()
mm: Always use page table accessor functions
checkpatch: Warn on page table access without accessors
mm: Allow page table accessors to be non-idempotent
riscv: hibernate: Replace open-coded pXXp_get()
riscv: mm: Always use page table accessor functions
riscv: mm: Simplify set_p4d() and set_pgd()
riscv: mm: Deduplicate _PAGE_CHG_MASK definition
riscv: ptdump: Only show N and MT bits when enabled in the kernel
riscv: mm: Fix up memory types when writing page tables
riscv: mm: Expose all page table bits to assembly code
riscv: alternative: Add an ALTERNATIVE_3 macro
riscv: alternative: Allow calls with alternate link registers
riscv: Fix logic for selecting DMA_DIRECT_REMAP
dt-bindings: riscv: Describe physical memory regions
riscv: mm: Use physical memory aliases to apply PMAs
riscv: dts: starfive: jh7100: Use physical memory ranges for DMA
riscv: dts: eswin: eic7700: Use physical memory ranges for DMA
.../bindings/riscv/physical-memory.yaml | 92 +++++++
arch/riscv/Kconfig | 19 +-
arch/riscv/Kconfig.errata | 11 +-
arch/riscv/Kconfig.socs | 4 +
arch/riscv/boot/dts/eswin/eic7700.dtsi | 5 +
.../boot/dts/starfive/jh7100-common.dtsi | 24 --
arch/riscv/boot/dts/starfive/jh7100.dtsi | 4 +
arch/riscv/include/asm/alternative-macros.h | 45 +++-
arch/riscv/include/asm/errata_list.h | 45 ----
arch/riscv/include/asm/hwcap.h | 1 +
arch/riscv/include/asm/pgtable-32.h | 17 +-
arch/riscv/include/asm/pgtable-64.h | 228 +++++++++++++-----
arch/riscv/include/asm/pgtable-bits.h | 43 +++-
arch/riscv/include/asm/pgtable.h | 67 ++---
arch/riscv/kernel/alternative.c | 4 +-
arch/riscv/kernel/cpufeature.c | 6 +
arch/riscv/kernel/hibernate.c | 18 +-
arch/riscv/kernel/setup.c | 1 +
arch/riscv/kvm/gstage.c | 6 +-
arch/riscv/mm/Makefile | 1 +
arch/riscv/mm/init.c | 68 +++---
arch/riscv/mm/memory-alias.S | 123 ++++++++++
arch/riscv/mm/pgtable.c | 114 +++++++--
arch/riscv/mm/ptdump.c | 16 +-
fs/dax.c | 4 +-
fs/proc/task_mmu.c | 27 ++-
fs/userfaultfd.c | 6 +-
include/dt-bindings/riscv/physical-memory.h | 45 ++++
include/linux/huge_mm.h | 8 +-
include/linux/mm.h | 14 +-
include/linux/pgtable.h | 112 ++++-----
kernel/events/core.c | 8 +-
mm/damon/vaddr.c | 2 +-
mm/debug_vm_pgtable.c | 4 +-
mm/filemap.c | 6 +-
mm/gup.c | 37 +--
mm/hmm.c | 2 +-
mm/huge_memory.c | 90 +++----
mm/hugetlb.c | 10 +-
mm/hugetlb_vmemmap.c | 4 +-
mm/kasan/init.c | 39 +--
mm/kasan/shadow.c | 12 +-
mm/khugepaged.c | 10 +-
mm/ksm.c | 2 +-
mm/madvise.c | 8 +-
mm/mapping_dirty_helpers.c | 2 +-
mm/memory-failure.c | 14 +-
mm/memory.c | 80 +++---
mm/mempolicy.c | 4 +-
mm/migrate.c | 4 +-
mm/migrate_device.c | 10 +-
mm/mlock.c | 6 +-
mm/mprotect.c | 4 +-
mm/mremap.c | 30 +--
mm/page_table_check.c | 7 +-
mm/page_vma_mapped.c | 6 +-
mm/pagewalk.c | 14 +-
mm/percpu.c | 8 +-
mm/pgalloc-track.h | 8 +-
mm/pgtable-generic.c | 25 +-
mm/ptdump.c | 10 +-
mm/rmap.c | 8 +-
mm/sparse-vmemmap.c | 10 +-
mm/userfaultfd.c | 10 +-
mm/vmalloc.c | 49 ++--
mm/vmscan.c | 16 +-
scripts/checkpatch.pl | 7 +
67 files changed, 1129 insertions(+), 615 deletions(-)
create mode 100644 Documentation/devicetree/bindings/riscv/physical-memory.yaml
create mode 100644 arch/riscv/mm/memory-alias.S
create mode 100644 include/dt-bindings/riscv/physical-memory.h
--
2.47.2
base-commit: 24172e0d79900908cf5ebf366600616d29c9b417
branch: up/dma-alias
next reply other threads:[~2025-11-13 1:47 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-13 1:45 Samuel Holland [this message]
2025-11-13 1:45 ` [PATCH v3 01/22] mm/ptdump: replace READ_ONCE() with standard page table accessors Samuel Holland
2025-11-13 1:45 ` [PATCH v3 02/22] mm: " Samuel Holland
2025-11-13 4:05 ` Dev Jain
2025-11-13 1:45 ` [PATCH v3 03/22] mm/dirty: replace READ_ONCE() with pudp_get() Samuel Holland
2025-11-13 1:45 ` [PATCH v3 04/22] perf/events: replace READ_ONCE() with standard page table accessors Samuel Holland
2025-11-13 19:10 ` David Hildenbrand (Red Hat)
2025-11-13 1:45 ` [PATCH v3 05/22] mm: Move the fallback definitions of pXXp_get() Samuel Holland
2025-11-13 19:11 ` David Hildenbrand (Red Hat)
2025-11-13 1:45 ` [PATCH v3 06/22] mm: Always use page table accessor functions Samuel Holland
2025-11-13 4:53 ` kernel test robot
2025-11-13 5:46 ` kernel test robot
2025-11-26 11:08 ` Christophe Leroy (CS GROUP)
2025-11-26 11:09 ` Ryan Roberts
2025-11-26 12:16 ` David Hildenbrand (Red Hat)
2025-11-26 12:19 ` David Hildenbrand (Red Hat)
2025-11-26 12:27 ` Lorenzo Stoakes
2025-11-26 12:35 ` David Hildenbrand (Red Hat)
2025-11-26 13:03 ` Ryan Roberts
2025-11-26 13:47 ` Wei Yang
2025-11-26 14:22 ` Ryan Roberts
2025-11-26 14:37 ` Lorenzo Stoakes
2025-11-26 14:53 ` David Hildenbrand (Red Hat)
2025-11-26 14:46 ` David Hildenbrand (Red Hat)
2025-11-26 14:52 ` Lorenzo Stoakes
2025-11-26 14:56 ` David Hildenbrand (Red Hat)
2025-11-26 15:08 ` Lorenzo Stoakes
2025-11-26 15:12 ` David Hildenbrand (Red Hat)
2025-11-26 16:07 ` Ryan Roberts
2025-11-26 16:34 ` Ryan Roberts
2025-11-26 20:31 ` David Hildenbrand (Red Hat)
2025-11-27 7:14 ` David Hildenbrand (Red Hat)
2025-11-27 7:31 ` David Hildenbrand (Red Hat)
2025-11-27 15:32 ` Ryan Roberts
2025-11-27 19:39 ` Christophe Leroy (CS GROUP)
2025-11-27 19:44 ` Christophe Leroy (CS GROUP)
2025-11-27 8:26 ` Christophe Leroy (CS GROUP)
2025-11-27 8:35 ` David Hildenbrand (Red Hat)
2025-11-13 1:45 ` [PATCH v3 07/22] checkpatch: Warn on page table access without accessors Samuel Holland
2025-11-13 2:21 ` Joe Perches
2025-11-13 2:36 ` Samuel Holland
2025-11-13 19:17 ` David Hildenbrand (Red Hat)
2025-11-13 1:45 ` [PATCH v3 08/22] mm: Allow page table accessors to be non-idempotent Samuel Holland
2025-11-13 7:19 ` kernel test robot
2025-11-27 16:57 ` Ryan Roberts
2025-11-27 17:47 ` David Hildenbrand (Red Hat)
2025-11-13 1:45 ` [PATCH v3 09/22] riscv: hibernate: Replace open-coded pXXp_get() Samuel Holland
2025-11-13 1:45 ` [PATCH v3 10/22] riscv: mm: Always use page table accessor functions Samuel Holland
2025-11-13 1:45 ` [PATCH v3 11/22] riscv: mm: Simplify set_p4d() and set_pgd() Samuel Holland
2025-11-13 1:45 ` [PATCH v3 12/22] riscv: mm: Deduplicate _PAGE_CHG_MASK definition Samuel Holland
2025-11-13 1:45 ` [PATCH v3 13/22] riscv: ptdump: Only show N and MT bits when enabled in the kernel Samuel Holland
2025-11-13 1:45 ` [PATCH v3 14/22] riscv: mm: Fix up memory types when writing page tables Samuel Holland
2025-11-13 1:45 ` [PATCH v3 15/22] riscv: mm: Expose all page table bits to assembly code Samuel Holland
2025-11-13 1:45 ` [PATCH v3 16/22] riscv: alternative: Add an ALTERNATIVE_3 macro Samuel Holland
2025-11-13 1:45 ` [PATCH v3 17/22] riscv: alternative: Allow calls with alternate link registers Samuel Holland
2025-11-13 1:45 ` [PATCH v3 18/22] riscv: Fix logic for selecting DMA_DIRECT_REMAP Samuel Holland
2025-11-13 1:45 ` [PATCH v3 19/22] dt-bindings: riscv: Describe physical memory regions Samuel Holland
2025-12-04 15:12 ` Rob Herring
2025-11-13 1:45 ` [PATCH v3 20/22] riscv: mm: Use physical memory aliases to apply PMAs Samuel Holland
2025-11-13 1:45 ` [PATCH v3 21/22] riscv: dts: starfive: jh7100: Use physical memory ranges for DMA Samuel Holland
2025-11-13 1:45 ` [PATCH v3 22/22] riscv: dts: eswin: eic7700: " Samuel Holland
2025-11-13 19:13 ` [PATCH v3 00/22] riscv: Memory type control for platforms with physical memory aliases David Hildenbrand (Red Hat)
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=20251113014656.2605447-1-samuel.holland@sifive.com \
--to=samuel.holland@sifive.com \
--cc=Julia.Lawall@inria.fr \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=alex@ghiti.fr \
--cc=apw@canonical.com \
--cc=conor@kernel.org \
--cc=david@redhat.com \
--cc=devicetree@vger.kernel.org \
--cc=dwaipayanray1@gmail.com \
--cc=joe@perches.com \
--cc=kernel@esmil.dk \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-riscv@lists.infradead.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=lukas.bulwahn@gmail.com \
--cc=mhocko@suse.com \
--cc=nicolas.palix@imag.fr \
--cc=palmer@dabbelt.com \
--cc=pjw@kernel.org \
--cc=robh+dt@kernel.org \
--cc=rppt@kernel.org \
--cc=surenb@google.com \
--cc=vbabka@suse.cz \
/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