• Linus Torvalds's avatar
    memblock: introduce saner 'memblock_free_ptr()' interface · 77e02cf5
    Linus Torvalds authored
    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: default avatarkernel 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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    77e02cf5
printk.c 93.8 KB