lkml.org 
[lkml]   [2022]   [Jul]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH mm v2 14/33] kasan: only define kasan_metadata_size for Generic mode
    Date
    From: Andrey Konovalov <andreyknvl@google.com>

    KASAN provides a helper for calculating the size of per-object metadata
    stored in the redzone.

    As now only the Generic mode uses per-object metadata, only define
    kasan_metadata_size() for this mode.

    Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
    ---
    include/linux/kasan.h | 17 ++++++++---------
    mm/kasan/common.c | 11 -----------
    mm/kasan/generic.c | 11 +++++++++++
    3 files changed, 19 insertions(+), 20 deletions(-)

    diff --git a/include/linux/kasan.h b/include/linux/kasan.h
    index b092277bf48d..027df7599573 100644
    --- a/include/linux/kasan.h
    +++ b/include/linux/kasan.h
    @@ -150,14 +150,6 @@ static __always_inline void kasan_cache_create_kmalloc(struct kmem_cache *cache)
    __kasan_cache_create_kmalloc(cache);
    }

    -size_t __kasan_metadata_size(struct kmem_cache *cache);
    -static __always_inline size_t kasan_metadata_size(struct kmem_cache *cache)
    -{
    - if (kasan_enabled())
    - return __kasan_metadata_size(cache);
    - return 0;
    -}
    -
    void __kasan_poison_slab(struct slab *slab);
    static __always_inline void kasan_poison_slab(struct slab *slab)
    {
    @@ -282,7 +274,6 @@ static inline void kasan_cache_create(struct kmem_cache *cache,
    unsigned int *size,
    slab_flags_t *flags) {}
    static inline void kasan_cache_create_kmalloc(struct kmem_cache *cache) {}
    -static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; }
    static inline void kasan_poison_slab(struct slab *slab) {}
    static inline void kasan_unpoison_object_data(struct kmem_cache *cache,
    void *object) {}
    @@ -333,6 +324,8 @@ static inline void kasan_unpoison_task_stack(struct task_struct *task) {}

    #ifdef CONFIG_KASAN_GENERIC

    +size_t kasan_metadata_size(struct kmem_cache *cache);
    +
    void kasan_cache_shrink(struct kmem_cache *cache);
    void kasan_cache_shutdown(struct kmem_cache *cache);
    void kasan_record_aux_stack(void *ptr);
    @@ -340,6 +333,12 @@ void kasan_record_aux_stack_noalloc(void *ptr);

    #else /* CONFIG_KASAN_GENERIC */

    +/* Tag-based KASAN modes do not use per-object metadata. */
    +static inline size_t kasan_metadata_size(struct kmem_cache *cache)
    +{
    + return 0;
    +}
    +
    static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
    static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
    static inline void kasan_record_aux_stack(void *ptr) {}
    diff --git a/mm/kasan/common.c b/mm/kasan/common.c
    index 83a04834746f..0cef41f8a60d 100644
    --- a/mm/kasan/common.c
    +++ b/mm/kasan/common.c
    @@ -138,17 +138,6 @@ void __kasan_cache_create_kmalloc(struct kmem_cache *cache)
    cache->kasan_info.is_kmalloc = true;
    }

    -size_t __kasan_metadata_size(struct kmem_cache *cache)
    -{
    - if (!kasan_requires_meta())
    - return 0;
    - return (cache->kasan_info.alloc_meta_offset ?
    - sizeof(struct kasan_alloc_meta) : 0) +
    - ((cache->kasan_info.free_meta_offset &&
    - cache->kasan_info.free_meta_offset != KASAN_NO_FREE_META) ?
    - sizeof(struct kasan_free_meta) : 0);
    -}
    -
    void __kasan_poison_slab(struct slab *slab)
    {
    struct page *page = slab_page(slab);
    diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c
    index 5125fad76f70..806ab92032c3 100644
    --- a/mm/kasan/generic.c
    +++ b/mm/kasan/generic.c
    @@ -427,6 +427,17 @@ void kasan_init_object_meta(struct kmem_cache *cache, const void *object)
    __memset(alloc_meta, 0, sizeof(*alloc_meta));
    }

    +size_t kasan_metadata_size(struct kmem_cache *cache)
    +{
    + if (!kasan_requires_meta())
    + return 0;
    + return (cache->kasan_info.alloc_meta_offset ?
    + sizeof(struct kasan_alloc_meta) : 0) +
    + ((cache->kasan_info.free_meta_offset &&
    + cache->kasan_info.free_meta_offset != KASAN_NO_FREE_META) ?
    + sizeof(struct kasan_free_meta) : 0);
    +}
    +
    static void __kasan_record_aux_stack(void *addr, bool can_alloc)
    {
    struct slab *slab = kasan_addr_to_slab(addr);
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-07-19 02:15    [W:4.521 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site