]> git.dujemihanovic.xyz Git - linux.git/commitdiff
parisc: fix a possible DMA corruption
authorMikulas Patocka <mpatocka@redhat.com>
Sat, 27 Jul 2024 18:22:52 +0000 (20:22 +0200)
committerHelge Deller <deller@gmx.de>
Mon, 29 Jul 2024 14:19:07 +0000 (16:19 +0200)
ARCH_DMA_MINALIGN was defined as 16 - this is too small - it may be
possible that two unrelated 16-byte allocations share a cache line. If
one of these allocations is written using DMA and the other is written
using cached write, the value that was written with DMA may be
corrupted.

This commit changes ARCH_DMA_MINALIGN to be 128 on PA20 and 32 on PA1.1 -
that's the largest possible cache line size.

As different parisc microarchitectures have different cache line size, we
define arch_slab_minalign(), cache_line_size() and
dma_get_cache_alignment() so that the kernel may tune slab cache
parameters dynamically, based on the detected cache line size.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/Kconfig
arch/parisc/include/asm/cache.h

index 5d650e02cbf4a33cc6bf5b4a1b1d9e106f399d40..b0a2ac3ba91610e4240c04f09f4e52a2600c6636 100644 (file)
@@ -20,6 +20,7 @@ config PARISC
        select ARCH_SUPPORTS_HUGETLBFS if PA20
        select ARCH_SUPPORTS_MEMORY_FAILURE
        select ARCH_STACKWALK
+       select ARCH_HAS_CACHE_LINE_SIZE
        select ARCH_HAS_DEBUG_VM_PGTABLE
        select HAVE_RELIABLE_STACKTRACE
        select DMA_OPS
index 2a60d7a72f1fa80b96b058eced6c33895693b9b2..a3f0f100f21949f453c18119e61aaead71e01435 100644 (file)
 
 #define SMP_CACHE_BYTES L1_CACHE_BYTES
 
-#define ARCH_DMA_MINALIGN      L1_CACHE_BYTES
+#ifdef CONFIG_PA20
+#define ARCH_DMA_MINALIGN      128
+#else
+#define ARCH_DMA_MINALIGN      32
+#endif
+#define ARCH_KMALLOC_MINALIGN  16      /* ldcw requires 16-byte alignment */
+
+#define arch_slab_minalign()   ((unsigned)dcache_stride)
+#define cache_line_size()      dcache_stride
+#define dma_get_cache_alignment cache_line_size
 
 #define __read_mostly __section(".data..read_mostly")