lkml.org 
[lkml]   [2021]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 19/34] kasan: reorder vmalloc hooks
    Date
    From: Andrey Konovalov <andreyknvl@google.com>

    Group functions that [de]populate shadow memory for vmalloc.
    Group functions that [un]poison memory for vmalloc.

    This patch does no functional changes but prepares KASAN code for
    adding vmalloc support to HW_TAGS KASAN.

    Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
    ---
    include/linux/kasan.h | 20 +++++++++-----------
    mm/kasan/shadow.c | 43 ++++++++++++++++++++++---------------------
    2 files changed, 31 insertions(+), 32 deletions(-)

    diff --git a/include/linux/kasan.h b/include/linux/kasan.h
    index 4eec58e6ef82..af2dd67d2c0e 100644
    --- a/include/linux/kasan.h
    +++ b/include/linux/kasan.h
    @@ -417,34 +417,32 @@ static inline void kasan_init_hw_tags(void) { }

    #ifdef CONFIG_KASAN_VMALLOC

    +void kasan_populate_early_vm_area_shadow(void *start, unsigned long size);
    int kasan_populate_vmalloc(unsigned long addr, unsigned long size);
    -void kasan_poison_vmalloc(const void *start, unsigned long size);
    -void kasan_unpoison_vmalloc(const void *start, unsigned long size);
    void kasan_release_vmalloc(unsigned long start, unsigned long end,
    unsigned long free_region_start,
    unsigned long free_region_end);

    -void kasan_populate_early_vm_area_shadow(void *start, unsigned long size);
    +void kasan_unpoison_vmalloc(const void *start, unsigned long size);
    +void kasan_poison_vmalloc(const void *start, unsigned long size);

    #else /* CONFIG_KASAN_VMALLOC */

    +static inline void kasan_populate_early_vm_area_shadow(void *start,
    + unsigned long size) { }
    static inline int kasan_populate_vmalloc(unsigned long start,
    unsigned long size)
    {
    return 0;
    }
    -
    -static inline void kasan_poison_vmalloc(const void *start, unsigned long size)
    -{ }
    -static inline void kasan_unpoison_vmalloc(const void *start, unsigned long size)
    -{ }
    static inline void kasan_release_vmalloc(unsigned long start,
    unsigned long end,
    unsigned long free_region_start,
    - unsigned long free_region_end) {}
    + unsigned long free_region_end) { }

    -static inline void kasan_populate_early_vm_area_shadow(void *start,
    - unsigned long size)
    +static inline void kasan_unpoison_vmalloc(const void *start, unsigned long size)
    +{ }
    +static inline void kasan_poison_vmalloc(const void *start, unsigned long size)
    { }

    #endif /* CONFIG_KASAN_VMALLOC */
    diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c
    index 585c2bf1073b..49a3660e111a 100644
    --- a/mm/kasan/shadow.c
    +++ b/mm/kasan/shadow.c
    @@ -345,27 +345,6 @@ int kasan_populate_vmalloc(unsigned long addr, unsigned long size)
    return 0;
    }

    -/*
    - * Poison the shadow for a vmalloc region. Called as part of the
    - * freeing process at the time the region is freed.
    - */
    -void kasan_poison_vmalloc(const void *start, unsigned long size)
    -{
    - if (!is_vmalloc_or_module_addr(start))
    - return;
    -
    - size = round_up(size, KASAN_GRANULE_SIZE);
    - kasan_poison(start, size, KASAN_VMALLOC_INVALID, false);
    -}
    -
    -void kasan_unpoison_vmalloc(const void *start, unsigned long size)
    -{
    - if (!is_vmalloc_or_module_addr(start))
    - return;
    -
    - kasan_unpoison(start, size, false);
    -}
    -
    static int kasan_depopulate_vmalloc_pte(pte_t *ptep, unsigned long addr,
    void *unused)
    {
    @@ -496,6 +475,28 @@ void kasan_release_vmalloc(unsigned long start, unsigned long end,
    }
    }

    +
    +void kasan_unpoison_vmalloc(const void *start, unsigned long size)
    +{
    + if (!is_vmalloc_or_module_addr(start))
    + return;
    +
    + kasan_unpoison(start, size, false);
    +}
    +
    +/*
    + * Poison the shadow for a vmalloc region. Called as part of the
    + * freeing process at the time the region is freed.
    + */
    +void kasan_poison_vmalloc(const void *start, unsigned long size)
    +{
    + if (!is_vmalloc_or_module_addr(start))
    + return;
    +
    + size = round_up(size, KASAN_GRANULE_SIZE);
    + kasan_poison(start, size, KASAN_VMALLOC_INVALID, false);
    +}
    +
    #else /* CONFIG_KASAN_VMALLOC */

    int kasan_alloc_module_shadow(void *addr, size_t size)
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-12-06 22:46    [W:4.081 / U:0.644 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site