• A
    mm, kasan: don't poison boot memory with tag-based modes · 2c335680
    Andrey Konovalov 提交于
    During boot, all non-reserved memblock memory is exposed to page_alloc via
    memblock_free_pages->__free_pages_core().  This results in
    kasan_free_pages() being called, which poisons that memory.
    
    Poisoning all that memory lengthens boot time.  The most noticeable effect
    is observed with the HW_TAGS mode.  A boot-time impact may potentially
    also affect systems with large amount of RAM.
    
    This patch changes the tag-based modes to not poison the memory during the
    memblock->page_alloc transition.
    
    An exception is made for KASAN_GENERIC.  Since it marks all new memory as
    accessible, not poisoning the memory released from memblock will lead to
    KASAN missing invalid boot-time accesses to that memory.
    
    With KASAN_SW_TAGS, as it uses the invalid 0xFE tag as the default tag for
    all memory, it won't miss bad boot-time accesses even if the poisoning of
    memblock memory is removed.
    
    With KASAN_HW_TAGS, the default memory tags values are unspecified.
    Therefore, if memblock poisoning is removed, this KASAN mode will miss the
    mentioned type of boot-time bugs with a 1/16 probability.  This is taken
    as an acceptable trafe-off.
    
    Internally, the poisoning is removed as follows.  __free_pages_core() is
    used when exposing fresh memory during system boot and when onlining
    memory during hotplug.  This patch adds a new FPI_SKIP_KASAN_POISON flag
    and passes it to __free_pages_ok() through free_pages_prepare() from
    __free_pages_core().  If FPI_SKIP_KASAN_POISON is set, kasan_free_pages()
    is not called.
    
    All memory allocated normally when the boot is over keeps getting poisoned
    as usual.
    
    Link: https://lkml.kernel.org/r/a0570dc1e3a8f39a55aa343a1fc08cd5c2d4cad6.1613692950.git.andreyknvl@google.comSigned-off-by: NAndrey Konovalov <andreyknvl@google.com>
    Reviewed-by: NCatalin Marinas <catalin.marinas@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Marco Elver <elver@google.com>
    Cc: Peter Collingbourne <pcc@google.com>
    Cc: Evgenii Stepanov <eugenis@google.com>
    Cc: Branislav Rankov <Branislav.Rankov@arm.com>
    Cc: Kevin Brodsky <kevin.brodsky@arm.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    2c335680
page_alloc.c 249.7 KB