Skip to content
  • Andrey Konovalov's avatar
    kasan, mm: optimize kmalloc poisoning · e2db1a9a
    Andrey Konovalov authored
    For allocations from kmalloc caches, kasan_kmalloc() always follows
    kasan_slab_alloc().  Currenly, both of them unpoison the whole object,
    which is unnecessary.
    
    This patch provides separate implementations for both annotations:
    kasan_slab_alloc() unpoisons the whole object, and kasan_kmalloc() only
    poisons the redzone.
    
    For generic KASAN, the redzone start might not be aligned to
    KASAN_GRANULE_SIZE.  Therefore, the poisoning is split in two parts:
    kasan_poison_last_granule() poisons the unaligned part, and then
    kasan_poison() poisons the rest.
    
    This patch also clarifies alignment guarantees of each of the poisoning
    functions and drops the unnecessary round_up() call for redzone_end.
    
    With this change, the early SLUB cache annotation needs to be changed to
    kasan_slab_alloc(), as kasan_kmalloc() doesn't unpoison objects now.  The
    number of poisoned bytes for objects in this cache stays the same, as
    kmem_cache_node->object_size is equal to sizeof(struct kmem_cache_node).
    
    Link: https://lkml.kernel.org/r/7e3961cb52be380bc412860332063f5f7ce10d13.1612546384.git.andreyknvl@google.com
    
    
    Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
    Reviewed-by: default avatarMarco Elver <elver@google.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Branislav Rankov <Branislav.Rankov@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Evgenii Stepanov <eugenis@google.com>
    Cc: Kevin Brodsky <kevin.brodsky@arm.com>
    Cc: Peter Collingbourne <pcc@google.com>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e2db1a9a