memblock: introduce saner 'memblock_free_ptr()' interface
The boot-time allocation interface for memblock is a mess, with 'memblock_alloc()' returning a virtual pointer, but then you are supposed to free it with 'memblock_free()' that takes a _physical_ address. Not only is that all kinds of strange and illogical, but it actually causes bugs, when people then use it like a normal allocation function, and it fails spectacularly on a NULL pointer: https://lore.kernel.org/all/20210912140820.GD25450@xsang-OptiPlex-9020/ or just random memory corruption if the debug checks don't catch it: https://lore.kernel.org/all/61ab2d0c-3313-aaab-514c-e15b7aa054a0@suse.cz/ I really don't want to apply patches that treat the symptoms, when the fundamental cause is this horribly confusing interface. I started out looking at just automating a sane replacement sequence, but because of this mix or virtual and physical addresses, and because people have used the "__pa()" macro that can take either a regular kernel pointer, or just the raw "unsigned long" address, it's all quite messy. So this just introduces a new saner interface for freeing a virtual address that was allocated using 'memblock_alloc()', and that was kept as a regular kernel pointer. And then it converts a couple of users that are obvious and easy to test, including the 'xbc_nodes' case in lib/bootconfig.c that caused problems. Reported-by:kernel test robot <oliver.sang@intel.com> Fixes: 40caa127 ("init: bootconfig: Remove all bootconfig data when the init memory is removed") Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Mike Rapoport <rppt@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by:
Linus Torvalds <torvalds@linux-foundation.org>
Showing
- arch/x86/kernel/setup_percpu.c 1 addition, 1 deletionarch/x86/kernel/setup_percpu.c
- arch/x86/mm/kasan_init_64.c 2 additions, 4 deletionsarch/x86/mm/kasan_init_64.c
- arch/x86/mm/numa.c 1 addition, 1 deletionarch/x86/mm/numa.c
- arch/x86/mm/numa_emulation.c 1 addition, 2 deletionsarch/x86/mm/numa_emulation.c
- drivers/base/arch_numa.c 1 addition, 1 deletiondrivers/base/arch_numa.c
- drivers/macintosh/smu.c 1 addition, 1 deletiondrivers/macintosh/smu.c
- include/linux/memblock.h 1 addition, 0 deletionsinclude/linux/memblock.h
- init/main.c 1 addition, 1 deletioninit/main.c
- kernel/printk/printk.c 2 additions, 2 deletionskernel/printk/printk.c
- lib/bootconfig.c 1 addition, 1 deletionlib/bootconfig.c
- mm/memblock.c 15 additions, 1 deletionmm/memblock.c
Loading
Please register or sign in to comment