From 498e53b485788f431434307d8882d3d4239f705a Mon Sep 17 00:00:00 2001 From: gyro Date: Sat, 27 Jan 2024 21:05:27 -0800 Subject: [PATCH] [WIP] Fix infinite recursion during KMSAN initialization KSAN calls into rcu code which then triggers a write that reenters into KSAN getting the system stuck doing infinite recursion. #0 kmsan_get_context () at mm/kmsan/kmsan.h:106 #1 __msan_get_context_state () at mm/kmsan/instrumentation.c:331 #2 0xffffffff81495671 in get_current () at ./arch/x86/include/asm/current.h:42 #3 rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #4 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #5 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #6 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #7 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff8620d974 ) at ./arch/x86/include/asm/kmsan.h:82 #8 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff8620d974 ) at mm/kmsan/shadow.c:75 #9 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff8620d974 , is_origin=false) at mm/kmsan/shadow.c:143 #10 kmsan_get_shadow_origin_ptr (address=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/shadow.c:97 #11 0xffffffff81b1dbd2 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/instrumentation.c:36 #12 __msan_metadata_ptr_for_load_4 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:91 #13 0xffffffff8149568f in rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #14 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #15 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #16 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #17 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff8620d974 ) at ./arch/x86/include/asm/kmsan.h:82 #18 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff8620d974 ) at mm/kmsan/shadow.c:75 #19 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff8620d974 , is_origin=false) at mm/kmsan/shadow.c:143 #20 kmsan_get_shadow_origin_ptr (address=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/shadow.c:97 #21 0xffffffff81b1dbd2 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/instrumentation.c:36 #22 __msan_metadata_ptr_for_load_4 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:91 #23 0xffffffff8149568f in rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #24 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #25 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #26 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #27 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff8620d974 ) at ./arch/x86/include/asm/kmsan.h:82 #28 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff8620d974 ) at mm/kmsan/shadow.c:75 #29 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff8620d974 , is_origin=false) at mm/kmsan/shadow.c:143 #30 kmsan_get_shadow_origin_ptr (address=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/shadow.c:97 #31 0xffffffff81b1dbd2 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/instrumentation.c:36 #32 __msan_metadata_ptr_for_load_4 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:91 #33 0xffffffff8149568f in rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #34 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #35 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #36 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #37 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff8620d974 ) at ./arch/x86/include/asm/kmsan.h:82 #38 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff8620d974 ) at mm/kmsan/shadow.c:75 #39 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff8620d974 , is_origin=false) at mm/kmsan/shadow.c:143 #40 kmsan_get_shadow_origin_ptr (address=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/shadow.c:97 #41 0xffffffff81b1dbd2 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/instrumentation.c:36 #42 __msan_metadata_ptr_for_load_4 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:91 #43 0xffffffff8149568f in rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #44 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #45 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #46 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #47 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff8620d974 ) at ./arch/x86/include/asm/kmsan.h:82 #48 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff8620d974 ) at mm/kmsan/shadow.c:75 #49 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff8620d974 , is_origin=false) at mm/kmsan/shadow.c:143 #50 kmsan_get_shadow_origin_ptr (address=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/shadow.c:97 #51 0xffffffff81b1dbd2 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/instrumentation.c:36 #52 __msan_metadata_ptr_for_load_4 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:91 #53 0xffffffff8149568f in rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #54 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #55 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #56 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #57 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff8620d974 ) at ./arch/x86/include/asm/kmsan.h:82 #58 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff8620d974 ) at mm/kmsan/shadow.c:75 #59 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff8620d974 , is_origin=false) at mm/kmsan/shadow.c:143 #60 kmsan_get_shadow_origin_ptr (address=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/shadow.c:97 #61 0xffffffff81b1dbd2 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/instrumentation.c:36 #62 __msan_metadata_ptr_for_load_4 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:91 #63 0xffffffff8149568f in rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #64 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #65 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #66 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #67 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff8620d974 ) at ./arch/x86/include/asm/kmsan.h:82 #68 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff8620d974 ) at mm/kmsan/shadow.c:75 #69 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff8620d974 , is_origin=false) at mm/kmsan/shadow.c:143 #70 kmsan_get_shadow_origin_ptr (address=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/shadow.c:97 #71 0xffffffff81b1dbd2 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=4, store=false) at mm/kmsan/instrumentation.c:36 #72 __msan_metadata_ptr_for_load_4 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:91 #73 0xffffffff8149568f in rcu_preempt_read_enter () at kernel/rcu/tree_plugin.h:379 #74 __rcu_read_lock () at kernel/rcu/tree_plugin.h:402 #75 0xffffffff81b2054b in rcu_read_lock () at ./include/linux/rcupdate.h:748 #76 pfn_valid (pfn=) at ./include/linux/mmzone.h:2016 #77 kmsan_virt_addr_valid (addr=addr@entry=0xffffffff86203c90) at ./arch/x86/include/asm/kmsan.h:82 #78 virt_to_page_or_null (vaddr=vaddr@entry=0xffffffff86203c90) at mm/kmsan/shadow.c:75 #79 0xffffffff81b2023c in kmsan_get_metadata (address=0xffffffff86203c90, is_origin=false) at mm/kmsan/shadow.c:143 #80 kmsan_get_shadow_origin_ptr (address=0xffffffff86203c90, size=8, store=false) at mm/kmsan/shadow.c:97 #81 0xffffffff81b1dc72 in get_shadow_origin_ptr (addr=0xffffffff8620d974 , size=8, store=false) at mm/kmsan/instrumentation.c:36 #82 __msan_metadata_ptr_for_load_8 (addr=0xffffffff8620d974 ) at mm/kmsan/instrumentation.c:92 #83 0xffffffff814fdb9e in filter_irq_stacks (entries=, nr_entries=4) at kernel/stacktrace.c:397 #84 0xffffffff829520e8 in stack_depot_save_flags (entries=0xffffffff8620d974 , nr_entries=4, alloc_flags=0, depot_flags=0) at lib/stackdepot.c:500 #85 0xffffffff81b1e560 in __msan_poison_alloca (address=0xffffffff86203da0, size=24, descr=) at mm/kmsan/instrumentation.c:285 #86 0xffffffff8562821c in _printk (fmt=0xffffffff85f191a5 "\0016Attempting lock1") at kernel/printk/printk.c:2324 #87 0xffffffff81942aa2 in kmem_cache_create_usercopy (name=0xffffffff85f18903 "mm_struct", size=1296, align=0, flags=270336, useroffset=, usersize=, ctor=0x0 ) at mm/slab_common.c:296 #88 0xffffffff86f337a0 in mm_cache_init () at kernel/fork.c:3262 #89 0xffffffff86eacb8e in start_kernel () at init/main.c:932 #90 0xffffffff86ecdf94 in x86_64_start_reservations (real_mode_data=0x140e0 ) at arch/x86/kernel/head64.c:555 #91 0xffffffff86ecde9b in x86_64_start_kernel (real_mode_data=0x140e0 ) at arch/x86/kernel/head64.c:536 #92 0xffffffff810001d3 in secondary_startup_64 () at /pool/workspace/linux/arch/x86/kernel/head_64.S:461 #93 0x0000000000000000 in ?? --- kernel/rcu/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/rcu/Makefile b/kernel/rcu/Makefile index 0cfb009a99b9f7..eec33e3d80ba90 100644 --- a/kernel/rcu/Makefile +++ b/kernel/rcu/Makefile @@ -7,6 +7,9 @@ ifeq ($(CONFIG_KCSAN),y) KBUILD_CFLAGS += -g -fno-omit-frame-pointer endif +# Avoid recursion KMSAN -> tree -> KMSAN -> tree. +KMSAN_SANITIZE_tree.o := n + obj-y += update.o sync.o obj-$(CONFIG_TREE_SRCU) += srcutree.o obj-$(CONFIG_TINY_SRCU) += srcutiny.o