lkml.org 
[lkml]   [2020]   [Nov]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v2 09/20] kasan: inline kasan_poison_memory and check_invalid_free
    From
    Using kasan_poison_memory() or check_invalid_free() currently results in
    function calls. Move their definitions to mm/kasan/kasan.h and turn them
    into static inline functions for hardware tag-based mode to avoid
    unneeded function calls.

    Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
    Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
    Link: https://linux-review.googlesource.com/id/Ia9d8191024a12d1374675b3d27197f10193f50bb
    ---
    mm/kasan/hw_tags.c | 15 ---------------
    mm/kasan/kasan.h | 28 ++++++++++++++++++++++++----
    2 files changed, 24 insertions(+), 19 deletions(-)

    diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c
    index 1476ac07666e..0303e49904b4 100644
    --- a/mm/kasan/hw_tags.c
    +++ b/mm/kasan/hw_tags.c
    @@ -30,27 +30,12 @@ void kasan_init_hw_tags(void)
    pr_info("KernelAddressSanitizer initialized\n");
    }

    -void kasan_poison_memory(const void *address, size_t size, u8 value)
    -{
    - hw_set_mem_tag_range(kasan_reset_tag(address),
    - round_up(size, KASAN_GRANULE_SIZE), value);
    -}
    -
    void kasan_unpoison_memory(const void *address, size_t size)
    {
    hw_set_mem_tag_range(kasan_reset_tag(address),
    round_up(size, KASAN_GRANULE_SIZE), get_tag(address));
    }

    -bool check_invalid_free(void *addr)
    -{
    - u8 ptr_tag = get_tag(addr);
    - u8 mem_tag = hw_get_mem_tag(addr);
    -
    - return (mem_tag == KASAN_TAG_INVALID) ||
    - (ptr_tag != KASAN_TAG_KERNEL && ptr_tag != mem_tag);
    -}
    -
    void kasan_set_free_info(struct kmem_cache *cache,
    void *object, u8 tag)
    {
    diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
    index 7498839a15d3..ab7314418604 100644
    --- a/mm/kasan/kasan.h
    +++ b/mm/kasan/kasan.h
    @@ -153,8 +153,6 @@ struct kasan_alloc_meta *kasan_get_alloc_meta(struct kmem_cache *cache,
    struct kasan_free_meta *kasan_get_free_meta(struct kmem_cache *cache,
    const void *object);

    -void kasan_poison_memory(const void *address, size_t size, u8 value);
    -
    #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)

    static inline const void *kasan_shadow_to_mem(const void *shadow_addr)
    @@ -194,8 +192,6 @@ void print_tags(u8 addr_tag, const void *addr);
    static inline void print_tags(u8 addr_tag, const void *addr) { }
    #endif

    -bool check_invalid_free(void *addr);
    -
    void *find_first_bad_addr(void *addr, size_t size);
    const char *get_bug_type(struct kasan_access_info *info);
    void metadata_fetch_row(char *buffer, void *row);
    @@ -279,6 +275,30 @@ static inline u8 random_tag(void)
    }
    #endif

    +#ifdef CONFIG_KASAN_HW_TAGS
    +
    +static inline void kasan_poison_memory(const void *address, size_t size, u8 value)
    +{
    + hw_set_mem_tag_range(kasan_reset_tag(address),
    + round_up(size, KASAN_GRANULE_SIZE), value);
    +}
    +
    +static inline bool check_invalid_free(void *addr)
    +{
    + u8 ptr_tag = get_tag(addr);
    + u8 mem_tag = hw_get_mem_tag(addr);
    +
    + return (mem_tag == KASAN_TAG_INVALID) ||
    + (ptr_tag != KASAN_TAG_KERNEL && ptr_tag != mem_tag);
    +}
    +
    +#else /* CONFIG_KASAN_HW_TAGS */
    +
    +void kasan_poison_memory(const void *address, size_t size, u8 value);
    +bool check_invalid_free(void *addr);
    +
    +#endif /* CONFIG_KASAN_HW_TAGS */
    +
    /*
    * Exported functions for interfaces called from assembly or from generated
    * code. Declarations here to avoid warning about missing declarations.
    --
    2.29.2.222.g5d2a92d10f8-goog
    \
     
     \ /
      Last update: 2020-11-10 23:21    [W:4.811 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site