• Vlastimil Babka's avatar
    mm, page_alloc: do not rely on the order of page_poison and init_on_alloc/free parameters · 04013513
    Vlastimil Babka authored
    Patch series "cleanup page poisoning", v3.
    
    I have identified a number of issues and opportunities for cleanup with
    CONFIG_PAGE_POISON and friends:
    
     - interaction with init_on_alloc and init_on_free parameters depends on
       the order of parameters (Patch 1)
    
     - the boot time enabling uses static key, but inefficienty (Patch 2)
    
     - sanity checking is incompatible with hibernation (Patch 3)
    
     - CONFIG_PAGE_POISONING_NO_SANITY can be removed now that we have
       init_on_free (Patch 4)
    
     - CONFIG_PAGE_POISONING_ZERO can be most likely removed now that we
       have init_on_free (Patch 5)
    
    This patch (of 5):
    
    Enabling page_poison=1 together with init_on_alloc=1 or init_on_free=1
    produces a warning in dmesg that page_poison takes precedence.  However,
    as these warnings are printed in early_param handlers for
    init_on_alloc/free, they are not printed if page_poison is enabled later
    on the command line (handlers are called in the order of their
    parameters), or when init_on_alloc/free is always enabled by the
    respective config option - before the page_poison early param handler is
    called, it is not considered to be enabled.  This is inconsistent.
    
    We can remove the dependency on order by making the init_on_* parameters
    only set a boolean variable, and postponing the evaluation after all early
    params have been processed.  Introduce a new
    init_mem_debugging_and_hardening() function for that, and move the related
    debug_pagealloc processing there as well.
    
    As a result init_mem_debugging_and_hardening() knows always accurately if
    init_on_* and/or page_poison options were enabled.  Thus we can also
    optimize want_init_on_alloc() and want_init_on_free().  We don't need to
    check page_poisoning_enabled() there, we can instead not enable the
    init_on_* static keys at all, if page poisoning is enabled.  This results
    in a simpler and more effective code.
    
    Link: https://lkml.kernel.org/r/20201113104033.22907-1-vbabka@suse.cz
    Link: https://lkml.kernel.org/r/20201113104033.22907-2-vbabka@suse.czSigned-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
    Reviewed-by: default avatarMike Rapoport <rppt@linux.ibm.com>
    Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Mateusz Nosek <mateusznosek0@gmail.com>
    Cc: Laura Abbott <labbott@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    04013513
mm.h 98.9 KB