linux/arch/arm/include/asm
Mathieu Desnoyers 8690bbcf3b Introduce cpu_dcache_is_aliasing() across all architectures
Introduce a generic way to query whether the data cache is virtually
aliased on all architectures. Its purpose is to ensure that subsystems
which are incompatible with virtually aliased data caches (e.g. FS_DAX)
can reliably query this.

For data cache aliasing, there are three scenarios dependending on the
architecture. Here is a breakdown based on my understanding:

A) The data cache is always aliasing:

* arc
* csky
* m68k (note: shared memory mappings are incoherent ? SHMLBA is missing there.)
* sh
* parisc

B) The data cache aliasing is statically known or depends on querying CPU
   state at runtime:

* arm (cache_is_vivt() || cache_is_vipt_aliasing())
* mips (cpu_has_dc_aliases)
* nios2 (NIOS2_DCACHE_SIZE > PAGE_SIZE)
* sparc32 (vac_cache_size > PAGE_SIZE)
* sparc64 (L1DCACHE_SIZE > PAGE_SIZE)
* xtensa (DCACHE_WAY_SIZE > PAGE_SIZE)

C) The data cache is never aliasing:

* alpha
* arm64 (aarch64)
* hexagon
* loongarch (but with incoherent write buffers, which are disabled since
             commit d23b7795 ("LoongArch: Change SHMLBA from SZ_64K to PAGE_SIZE"))
* microblaze
* openrisc
* powerpc
* riscv
* s390
* um
* x86

Require architectures in A) and B) to select ARCH_HAS_CPU_CACHE_ALIASING and
implement "cpu_dcache_is_aliasing()".

Architectures in C) don't select ARCH_HAS_CPU_CACHE_ALIASING, and thus
cpu_dcache_is_aliasing() simply evaluates to "false".

Note that this leaves "cpu_icache_is_aliasing()" to be implemented as future
work. This would be useful to gate features like XIP on architectures
which have aliasing CPU dcache-icache but not CPU dcache-dcache.

Use "cpu_dcache" and "cpu_cache" rather than just "dcache" and "cache"
to clarify that we really mean "CPU data cache" and "CPU cache" to
eliminate any possible confusion with VFS "dentry cache" and "page
cache".

Link: https://lore.kernel.org/lkml/20030910210416.GA24258@mail.jlokier.co.uk/
Link: https://lkml.kernel.org/r/20240215144633.96437-9-mathieu.desnoyers@efficios.com
Fixes: d92576f116 ("dax: does not work correctly with virtual aliasing caches")
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Alasdair Kergon <agk@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: kernel test robot <lkp@intel.com>
Cc: Michael Sclafani <dm-devel@lists.linux.dev>
Cc: Mike Snitzer <snitzer@kernel.org>
Cc: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2024-02-22 15:27:19 -08:00
..
hardware locomo: make locomo_bus_type constant and static 2024-01-04 14:38:57 +01:00
mach ARM: 9298/1: Drop custom mdesc->handle_irq() 2023-06-19 09:35:48 +01:00
vdso vdso/treewide: Add vdso_data pointer argument to __arch_get_hw_counter() 2020-08-06 10:57:30 +02:00
xen arm/xen: Introduce xen_setup_dma_ops() 2022-06-06 08:54:33 +02:00
arch_gicv3.h arm64: add ARM64_HAS_GIC_PRIO_RELAXED_SYNC cpucap 2023-01-31 16:06:17 +00:00
arch_timer.h clocksource/drivers/arm_arch_timer: Drop unnecessary ISB on CVAL programming 2021-10-17 21:47:44 +02:00
archrandom.h random: remove CONFIG_ARCH_RANDOM 2022-07-18 15:03:37 +02:00
arm_pmuv3.h arm64/arm: arm_pmuv3: perf: Don't truncate 64-bit registers 2023-11-07 11:00:57 +00:00
arm-cci.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 234 2019-06-19 17:09:07 +02:00
asm-offsets.h
assembler.h locking/atomic: arm: fix sync ops 2023-06-05 09:57:13 +02:00
atomic.h locking/atomic: arm: add preprocessor symbols 2023-06-05 09:57:15 +02:00
auxvec.h
barrier.h ARM: avoid Cortex-A9 livelock on tight dmb loops 2019-02-01 22:05:50 +00:00
bitops.h arm: align find_bit declarations with generic kernel 2022-07-14 15:21:43 -07:00
bitrev.h
bL_switcher.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
bug.h arm: print alloc free paths for address in registers 2021-05-07 00:26:34 -07:00
bugs.h ARM: cpu: Switch to arch_cpu_finalize_init() 2023-06-16 10:15:59 +02:00
cache.h treewide: Convert macro and uses of __section(foo) to __section("foo") 2020-10-25 14:51:49 -07:00
cacheflush.h mm: Introduce flush_cache_vmap_early() 2023-12-14 00:23:17 -08:00
cachetype.h Introduce cpu_dcache_is_aliasing() across all architectures 2024-02-22 15:27:19 -08:00
checksum.h net: checksum: drop the linux/uaccess.h include 2023-01-27 11:19:46 +00:00
clocksource.h arm: Introduce asm/vdso/clocksource.h 2020-03-21 15:23:54 +01:00
cmpxchg.h locking/arch: Rename all internal __xchg() names to __arch_xchg() 2023-04-29 09:08:44 +02:00
compiler.h
cp15.h arm: vdso: Enable arm to use common headers 2020-03-21 15:24:03 +01:00
cpu.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
cpufeature.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
cpuidle.h arm64 updates for 5.14 2021-06-28 14:04:24 -07:00
cputype.h ARM: 9267/1: Define Armv8 registers in AArch32 state 2022-11-28 11:57:31 +00:00
cti.h
current.h ARM: make get_current() and __my_cpu_offset() __always_inline 2022-01-31 16:06:35 +01:00
dcc.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284 2019-06-05 17:36:37 +02:00
delay.h ARM: mm: Make virt_to_pfn() a static inline 2023-05-29 11:27:08 +02:00
device.h ARM/dma-mapping: remove the dma_coherent member of struct dev_archdata 2022-10-06 14:31:08 +02:00
div64.h ARM: 9118/1: div64: Remove always-true __div64_const32_is_OK() duplicate 2021-08-20 11:39:28 +01:00
dma-iommu.h ARM/dma-mapping: const a pointer to bus_type in arm_iommu_create_mapping() 2023-03-23 13:21:51 +01:00
dma.h ARM: 9323/1: mm: Fix ARCH_LOW_ADDRESS_LIMIT when CONFIG_ZONE_DMA 2023-10-05 16:15:42 +01:00
dmi.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
domain.h ARM: 9326/1: make <linux/uaccess.h> self-contained for ARM 2023-10-05 16:17:05 +01:00
ecard.h
edac.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 201 2019-05-30 11:29:52 -07:00
efi.h efi: Discover BTI support in runtime services regions 2023-02-04 09:19:02 +01:00
elf.h ARM: module: implement support for PC-relative group relocations 2021-12-06 12:49:16 +01:00
exception.h ARM: 9320/1: fix stack depot IRQ stack filter 2023-10-05 16:15:40 +01:00
fb.h arch/arm: Implement <asm/fb.h> with generic helpers 2023-04-20 10:04:24 +02:00
fiq.h
firmware.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
fixmap.h ARM updates for 5.11: 2020-12-22 13:34:27 -08:00
floppy.h floppy: split the base port from the register in I/O accesses 2020-05-12 19:34:52 +03:00
fncpy.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 333 2019-06-05 17:37:06 +02:00
fpstate.h ARM: 9228/1: vfp: kill vfp_flush/release_thread() 2022-08-31 14:50:08 +01:00
ftrace.h ARM: 9304/1: add prototype for function called only from asm 2023-06-19 09:35:52 +01:00
futex.h ARM: futex: Address build warning 2020-05-07 00:41:47 +02:00
glue-cache.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
glue-df.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
glue-pf.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
glue-proc.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
glue.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
hardirq.h ARM: irqstat: Get rid of duplicated declaration 2020-11-23 10:31:05 +01:00
highmem.h ARM: highmem: Fix cache_is_vivt() reference 2020-12-04 23:35:34 +01:00
hugetlb-3level.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 333 2019-06-05 17:37:06 +02:00
hugetlb.h arm: include asm/cacheflush.h in asm/hugetlb.h 2023-08-21 13:38:00 -07:00
hw_breakpoint.h ARM: 8927/1: ARM/hw_breakpoint: add more ARMv8 debug architecture versions support 2019-11-15 22:21:08 +00:00
hw_irq.h
hwcap.h
hypervisor.h arm/arm64: Probe for the presence of KVM hypervisor 2021-03-31 09:16:55 +01:00
idmap.h treewide: Convert macro and uses of __section(foo) to __section("foo") 2020-10-25 14:51:49 -07:00
insn.h ARM: 9176/1: avoid literal references in inline assembly 2022-01-06 12:58:58 +00:00
io.h asm/io: remove unnecessary xlate_dev_mem_ptr() and unxlate_dev_mem_ptr() 2023-11-23 10:37:40 +01:00
irq_work.h arch: consolidate arch_irq_work_raise prototypes 2023-11-23 11:32:29 +01:00
irq.h nmi_backtrace: allow excluding an arbitrary CPU 2023-08-18 10:19:00 -07:00
irqflags.h
jump_label.h work around gcc bugs with 'asm goto' with outputs 2024-02-09 15:57:48 -08:00
kasan_def.h ARM: 9015/2: Define the virtual space of KASan's shadow region 2020-10-27 12:11:08 +00:00
kasan.h ARM: 9016/2: Initialize the mapping of KASan shadow memory 2020-10-27 12:11:10 +00:00
Kbuild local64.h: make <asm/local64.h> mandatory 2020-12-29 15:36:49 -08:00
kexec-internal.h ARM: kexec: fix oops after TLB are invalidated 2021-02-05 10:23:29 +00:00
kexec.h kernel/Kconfig.kexec: drop select of KEXEC for CRASH_DUMP 2023-12-06 16:12:48 -08:00
kfence.h ARM: 9166/1: Support KFENCE for ARM 2021-12-17 11:34:38 +00:00
kgdb.h
kprobes.h kprobes: unify kprobes_exceptions_nofify() prototypes 2023-11-10 19:59:05 +09:00
krait-l2-accessors.h
linkage.h
mc146818rtc.h
mcpm.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
mcs_spinlock.h
memblock.h
memory.h ARM: mm: Make virt_to_pfn() a static inline 2023-05-29 11:27:08 +02:00
mmu_context.h ARM: mm: make vmalloc_seq handling SMP safe 2022-01-25 09:53:52 +01:00
mmu.h ARM: mm: make vmalloc_seq handling SMP safe 2022-01-25 09:53:52 +01:00
module.h ARM: 9252/1: module: Teach unwinder about PLTs 2022-11-07 14:18:59 +00:00
module.lds.h kbuild: preprocess module linker script 2020-09-25 00:36:41 +09:00
mpu.h
mtd-xip.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
neon.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
nwflash.h misc: move FLASH_MINOR into miscdevice.h and fix conflicts 2020-03-18 12:27:04 +01:00
opcodes-sec.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
opcodes-virt.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 1 2019-05-21 11:28:39 +02:00
opcodes.h ARM: 9145/1: patch: fix BE32 compilation 2021-10-25 13:12:36 +01:00
outercache.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 333 2019-06-05 17:37:06 +02:00
page-nommu.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
page.h asm-generic updates for 6.5 2023-07-06 10:06:04 -07:00
paravirt_api_clock.h sched/headers: ARM needs asm/paravirt_api_clock.h too 2022-03-22 08:53:10 +01:00
paravirt.h x86/paravirt: Switch time pvops functions to use static_call() 2021-03-11 16:17:52 +01:00
patch.h
pci.h PCI: Remove pci_get_legacy_ide_irq() and asm-generic/pci.h 2022-07-22 17:23:45 -05:00
percpu.h ARM: make get_current() and __my_cpu_offset() __always_inline 2022-01-31 16:06:35 +01:00
perf_event.h ARM: 9251/1: perf: Fix stacktraces for tracepoint events in THUMB2 kernels 2022-11-07 14:16:43 +00:00
pgalloc.h mm/thp: define default pmd_pgtable() 2021-07-01 11:06:03 -07:00
pgtable-2level-hwdef.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
pgtable-2level-types.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 333 2019-06-05 17:37:06 +02:00
pgtable-2level.h arm/mm: support __HAVE_ARCH_PTE_SWP_EXCLUSIVE 2023-02-02 22:33:06 -08:00
pgtable-3level-hwdef.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 333 2019-06-05 17:37:06 +02:00
pgtable-3level-types.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 333 2019-06-05 17:37:06 +02:00
pgtable-3level.h mm: Rename arch pte_mkwrite()'s to pte_mkwrite_novma() 2023-07-11 14:10:56 -07:00
pgtable-hwdef.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
pgtable-nommu.h MM patches for 6.2-rc1. 2022-12-13 19:29:45 -08:00
pgtable.h arm/pgtable: define PFN_PTE_SHIFT 2024-02-22 10:24:50 -08:00
probes.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
proc-fns.h ARM: mm: Make virt_to_pfn() a static inline 2023-05-29 11:27:08 +02:00
processor.h kernel: exit: cleanup release_thread() 2022-09-11 21:55:07 -07:00
procinfo.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
prom.h ARM: 9011/1: centralize phys-to-virt conversion of DT/ATAGS address 2020-10-27 12:10:59 +00:00
psci.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
ptdump.h arm: ptdump: rename CONFIG_DEBUG_WX to CONFIG_ARM_DEBUG_WX 2024-02-22 10:24:47 -08:00
ptrace.h ARM: 9304/1: add prototype for function called only from asm 2023-06-19 09:35:52 +01:00
seccomp.h arm: Enable seccomp architecture tracking 2020-11-20 11:16:34 -08:00
sections.h arm: Remove HYP/Stage-2 page-table support 2020-03-24 10:56:05 +00:00
secure_cntvoff.h
semihost.h serial: earlycon-arm-semihost: Move smh_putc() variants in respective arch's semihost.h 2023-01-19 14:58:19 +01:00
set_memory.h ARM: 9164/1: mm: Provide set_memory_valid() 2021-12-17 11:34:36 +00:00
setup.h vgacon: clean up global screen_info instances 2023-10-17 10:17:02 +02:00
shmparam.h
signal.h ARM: 9304/1: add prototype for function called only from asm 2023-06-19 09:35:52 +01:00
simd.h ARM: 9283/1: permit non-nested kernel mode NEON in softirq context 2023-01-11 16:21:21 +00:00
smp_plat.h
smp_scu.h
smp_twd.h ARM: 8822/1: smp_twd: Remove legacy TWD registration 2019-02-01 21:44:10 +00:00
smp.h ARM: smp: Switch to hotplug core state synchronization 2023-05-15 13:44:57 +02:00
sparsemem.h ARM: mm: Make virt_to_pfn() a static inline 2023-05-29 11:27:08 +02:00
spectre.h ARM: 9304/1: add prototype for function called only from asm 2023-06-19 09:35:52 +01:00
spinlock_types.h locking: Allow to include asm/spinlock_types.h from linux/spinlock_types_raw.h 2021-12-07 15:14:12 +01:00
spinlock.h locking: Fix typos in comments 2021-03-22 02:45:52 +01:00
stackprotector.h stackprotector: actually use get_random_canary() 2022-11-18 02:18:10 +01:00
stacktrace.h ARM: 9258/1: stacktrace: Make stack walk callback consistent with generic code 2022-11-08 18:36:18 +00:00
string.h ARM: 9014/2: Replace string mem* functions for KASan 2020-10-27 12:11:06 +00:00
suspend.h ARM: 9304/1: add prototype for function called only from asm 2023-06-19 09:35:52 +01:00
swab.h
switch_to.h ARM development updates for 5.18: 2022-03-23 17:35:57 -07:00
sync_bitops.h locking/atomic: arm: fix sync ops 2023-06-05 09:57:13 +02:00
syscall.h ARM: ptrace: Restore syscall skipping for tracers 2023-08-16 13:58:49 -07:00
syscalls.h ARM: 9309/1: add missing syscall prototypes 2023-06-19 09:35:55 +01:00
system_info.h
system_misc.h ARM: 9096/1: Remove arm_pm_restart() 2021-06-13 18:16:48 +01:00
tcm.h ARM: 9314/1: tcm: move tcm_init() prototype to asm/tcm.h 2023-06-19 09:35:59 +01:00
therm.h
thread_info.h ARM: iwmmxt: Use undef hook to enable coprocessor for task 2023-05-17 15:08:22 +02:00
thread_notify.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
timex.h arm: use fallback for random_get_entropy() instead of zero 2022-05-13 23:59:23 +02:00
tlb.h arm: convert various functions to use ptdescs 2023-08-21 13:37:55 -07:00
tlbflush.h arm: implement the new page table range API 2023-08-24 16:20:20 -07:00
tls.h ARM: smp: elide HWCAP_TLS checks or __entry_task updates on SMP+v6 2022-01-25 09:53:52 +01:00
topology.h sched/topology: Add a new arch_scale_freq_ref() method 2023-12-23 15:52:34 +01:00
traps.h ARM: 9326/1: make <linux/uaccess.h> self-contained for ARM 2023-10-05 16:17:05 +01:00
uaccess-asm.h ARM: mm: Make virt_to_pfn() a static inline 2023-05-29 11:27:08 +02:00
uaccess.h ARM: 9326/1: make <linux/uaccess.h> self-contained for ARM 2023-10-05 16:17:05 +01:00
ucontext.h ARM: ep93xx: remove MaverickCrunch support 2021-08-04 13:30:04 +02:00
unified.h ARM: 9116/1: unified: Remove check for gcc < 4 2021-08-20 11:39:28 +01:00
unistd.h clone3-v5.3 2019-07-11 10:09:44 -07:00
unwind.h ARM: 9304/1: add prototype for function called only from asm 2023-06-19 09:35:52 +01:00
uprobes.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
user.h asm/user.h: killed unused macros 2022-01-30 21:17:00 -05:00
v7m.h irqchip: nvic: Use GENERIC_IRQ_MULTI_HANDLER 2021-12-06 12:49:16 +01:00
vdso_datapage.h ARM: 8930/1: Add support for generic vDSO 2019-11-15 22:21:12 +00:00
vdso.h arch: vdso: consolidate gettime prototypes 2023-11-23 11:32:32 +01:00
vermagic.h arch: split MODULE_ARCH_VERMAGIC definitions out to <asm/vermagic.h> 2020-04-23 10:50:26 +09:00
vfp.h Revert part of ae1f8d793a ("ARM: 9304/1: add prototype for function called only from asm") 2023-08-15 10:07:48 +01:00
vfpmacros.h ARM: 8991/1: use VFP assembler mnemonics if available 2020-07-21 16:33:39 +01:00
vga.h console: fix up ARM screen_info reference 2023-10-17 16:34:02 +02:00
virt.h arm: Remove the ability to set HYP vectors outside of the decompressor 2020-03-24 10:56:05 +00:00
vmalloc.h mm/vmalloc: Add empty <asm/vmalloc.h> headers and use them from <linux/vmalloc.h> 2019-12-10 10:12:55 +01:00
vmlinux.lds.h objtool/idle: Validate __cpuidle code as noinstr 2023-01-13 11:48:15 +01:00
word-at-a-time.h
xor.h ARM: 9260/1: lib/xor: use r10 rather than r7 in xor_arm4regs_{2|3} 2022-11-07 14:19:03 +00:00