]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/Kconfig: Define non-zero ILLEGAL_POINTER_VALUE
authorGerd Bayer <gbayer@linux.ibm.com>
Fri, 16 Jan 2026 15:02:42 +0000 (16:02 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Tue, 27 Jan 2026 11:21:20 +0000 (12:21 +0100)
Define CONFIG_ILLEGAL_POINTER_VALUE to the eye-catching non-zero value
of 0xdead000000000000, consistent with other architectures. Assert at
compile-time that the poison pointers that include/linux/poison.h
defines based on this illegal pointer are beyond the largest useful
virtual addresses. Also, assert at compile-time that the range of poison
pointers per include/linux/poison.h (currently a range of less than
0x10000 addresses) does not overlap with the range used for address
handles for s390's non-MIO PCI instructions.

This enables s390 to track the DMA mappings by the network stack's
page_pool that was introduced with [0]. Other functional changes are not
intended.

Other archictectures have introduced this for various other reasons with
commit 5c178472af24 ("riscv: define ILLEGAL_POINTER_VALUE for 64bit")
commit f6853eb561fb ("powerpc/64: Define ILLEGAL_POINTER_VALUE for 64-bit")
commit bf0c4e047324 ("arm64: kconfig: Move LIST_POISON to a safe value")
commit a29815a333c6 ("core, x86: make LIST_POISON less deadly")

[0] https://lore.kernel.org/all/20250409-page-pool-track-dma-v9-0-6a9ef2e0cba8@redhat.com/

Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Gerd Bayer <gbayer@linux.ibm.com>
Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Documentation/arch/s390/mm.rst
arch/s390/Kconfig
arch/s390/boot/startup.c
arch/s390/include/asm/pci_io.h
arch/s390/pci/pci.c

index 084adad5eef9ecb31eec2c723bb028f8f37e9a63..19681157c6f2ce16199da85aa7a6a0e1b66e7436 100644 (file)
@@ -109,3 +109,7 @@ Virtual memory layout
                     |   KASAN shadow   | KASAN untracked
                     |                  |
                     +------------------+ ASCE limit
+                    |                  |
+                    | CONFIG_ILLEGAL_POINTER_VALUE causes memory access fault
+                    |                  |
+                    +------------------+
index fcce8c5db703d30f407dd52c5e49045c79f7abe6..cda697a03abf7be4a2a7a58ef833445cf46dfa2b 100644 (file)
@@ -719,6 +719,10 @@ config ARCH_SPARSEMEM_ENABLE
 config ARCH_SPARSEMEM_DEFAULT
        def_bool y
 
+config ILLEGAL_POINTER_VALUE
+       hex
+       default 0xdead000000000000
+
 config MAX_PHYSMEM_BITS
        int "Maximum size of supported physical memory in bits (42-53)"
        range 42 53
index f77067dfc2a847e6853e614dbac842ff28e29d77..7f3343493ab98c2a131a59f0c73b066132267810 100644 (file)
@@ -336,6 +336,7 @@ static unsigned long setup_kernel_memory_layout(unsigned long kernel_size)
        BUILD_BUG_ON(!IS_ALIGNED(TEXT_OFFSET, THREAD_SIZE));
        BUILD_BUG_ON(!IS_ALIGNED(__NO_KASLR_START_KERNEL, THREAD_SIZE));
        BUILD_BUG_ON(__NO_KASLR_END_KERNEL > _REGION1_SIZE);
+       BUILD_BUG_ON(CONFIG_ILLEGAL_POINTER_VALUE < _REGION1_SIZE);
        vsize = get_vmem_size(ident_map_size, vmemmap_size, vmalloc_size, _REGION3_SIZE);
        boot_debug("vmem size estimated: 0x%016lx\n", vsize);
        if (IS_ENABLED(CONFIG_KASAN) || __NO_KASLR_END_KERNEL > _REGION2_SIZE ||
index 43a5ea4ee20f446028f7b9c7a9595c22919df278..f3bef5bc7223bae56b7367652ed99c0c10f4ab33 100644 (file)
@@ -18,6 +18,7 @@
 #define ZPCI_IOMAP_SHIFT               48
 #define ZPCI_IOMAP_ADDR_SHIFT          62
 #define ZPCI_IOMAP_ADDR_BASE           (1UL << ZPCI_IOMAP_ADDR_SHIFT)
+#define ZPCI_IOMAP_ADDR_MAX            ((1UL << (ZPCI_IOMAP_ADDR_SHIFT + 1)) - 1)
 #define ZPCI_IOMAP_ADDR_OFF_MASK       ((1UL << ZPCI_IOMAP_SHIFT) - 1)
 #define ZPCI_IOMAP_MAX_ENTRIES                                                 \
        (1UL << (ZPCI_IOMAP_ADDR_SHIFT - ZPCI_IOMAP_SHIFT))
index 0d952e8fdc8af4869a7deeda7de8c9be19d40c2d..97bab20bc163b90277d83117f49e2fac082b30f8 100644 (file)
@@ -1065,6 +1065,8 @@ static int zpci_mem_init(void)
 {
        BUILD_BUG_ON(!is_power_of_2(__alignof__(struct zpci_fmb)) ||
                     __alignof__(struct zpci_fmb) < sizeof(struct zpci_fmb));
+       BUILD_BUG_ON((CONFIG_ILLEGAL_POINTER_VALUE + 0x10000 > ZPCI_IOMAP_ADDR_BASE) &&
+                    (CONFIG_ILLEGAL_POINTER_VALUE <= ZPCI_IOMAP_ADDR_MAX));
 
        zdev_fmb_cache = kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_fmb),
                                           __alignof__(struct zpci_fmb), 0, NULL);