In order to reuse them outside of mm/kasan/init.c, move the following helpers outside of init.c: kasan_p4d_table() kasan_pud_table() kasan_pmd_table() kasan_pte_table() kasan_early_shadow_page_entry() And make them available when KASAN is not selected. Inclusion of kasan.h in mm.h needs to be moved down a bit in order to get lm_alias() definition. Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxxxxxx> --- include/linux/kasan.h | 57 +++++++++++++++++++++++++++++++++++++++++++ include/linux/mm.h | 3 ++- mm/kasan/init.c | 37 ---------------------------- 3 files changed, 59 insertions(+), 38 deletions(-) diff --git a/include/linux/kasan.h b/include/linux/kasan.h index c29778b25d8a..1629797198ec 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -28,6 +28,7 @@ struct kunit_kasan_expectation { #ifdef CONFIG_KASAN_SOFTWARE #include <linux/pgtable.h> +#include <linux/mm.h> /* Software KASAN implementations use shadow memory. */ @@ -81,6 +82,62 @@ static inline void kasan_disable_current(void) {} #endif /* CONFIG_KASAN_SOFTWARE */ +#if defined(CONFIG_KASAN_SOFTWARE) && CONFIG_PGTABLE_LEVELS > 4 +static inline bool kasan_p4d_table(pgd_t pgd) +{ + return pgd_page(pgd) == virt_to_page(lm_alias(kasan_early_shadow_p4d)); +} +#else +static inline bool kasan_p4d_table(pgd_t pgd) +{ + return false; +} +#endif +#if defined(CONFIG_KASAN_SOFTWARE) && CONFIG_PGTABLE_LEVELS > 3 +static inline bool kasan_pud_table(p4d_t p4d) +{ + return p4d_page(p4d) == virt_to_page(lm_alias(kasan_early_shadow_pud)); +} +#else +static inline bool kasan_pud_table(p4d_t p4d) +{ + return false; +} +#endif +#if defined(CONFIG_KASAN_SOFTWARE) && CONFIG_PGTABLE_LEVELS > 2 +static inline bool kasan_pmd_table(pud_t pud) +{ + return pud_page(pud) == virt_to_page(lm_alias(kasan_early_shadow_pmd)); +} +#else +static inline bool kasan_pmd_table(pud_t pud) +{ + return false; +} +#endif + +#ifdef CONFIG_KASAN_SOFTWARE +static inline bool kasan_pte_table(pmd_t pmd) +{ + return pmd_page(pmd) == virt_to_page(lm_alias(kasan_early_shadow_pte)); +} + +static inline bool kasan_early_shadow_page_entry(pte_t pte) +{ + return pte_page(pte) == virt_to_page(lm_alias(kasan_early_shadow_page)); +} +#else +static inline bool kasan_pte_table(pmd_t pmd) +{ + return false; +} + +static inline bool kasan_early_shadow_page_entry(pte_t pte) +{ + return false; +} +#endif + #ifdef CONFIG_KASAN_HW_TAGS DECLARE_STATIC_KEY_FALSE(kasan_flag_enabled); diff --git a/include/linux/mm.h b/include/linux/mm.h index e1a84b1e6787..b06ee84b3717 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -31,7 +31,6 @@ #include <linux/sizes.h> #include <linux/sched.h> #include <linux/pgtable.h> -#include <linux/kasan.h> struct mempolicy; struct anon_vma; @@ -121,6 +120,8 @@ extern int mmap_rnd_compat_bits __read_mostly; #define lm_alias(x) __va(__pa_symbol(x)) #endif +#include <linux/kasan.h> + /* * To prevent common memory management code establishing * a zero page mapping on a read fault. diff --git a/mm/kasan/init.c b/mm/kasan/init.c index cc64ed6858c6..e863071a49ef 100644 --- a/mm/kasan/init.c +++ b/mm/kasan/init.c @@ -30,53 +30,16 @@ unsigned char kasan_early_shadow_page[PAGE_SIZE] __page_aligned_bss; #if CONFIG_PGTABLE_LEVELS > 4 p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D] __page_aligned_bss; -static inline bool kasan_p4d_table(pgd_t pgd) -{ - return pgd_page(pgd) == virt_to_page(lm_alias(kasan_early_shadow_p4d)); -} -#else -static inline bool kasan_p4d_table(pgd_t pgd) -{ - return false; -} #endif #if CONFIG_PGTABLE_LEVELS > 3 pud_t kasan_early_shadow_pud[MAX_PTRS_PER_PUD] __page_aligned_bss; -static inline bool kasan_pud_table(p4d_t p4d) -{ - return p4d_page(p4d) == virt_to_page(lm_alias(kasan_early_shadow_pud)); -} -#else -static inline bool kasan_pud_table(p4d_t p4d) -{ - return false; -} #endif #if CONFIG_PGTABLE_LEVELS > 2 pmd_t kasan_early_shadow_pmd[MAX_PTRS_PER_PMD] __page_aligned_bss; -static inline bool kasan_pmd_table(pud_t pud) -{ - return pud_page(pud) == virt_to_page(lm_alias(kasan_early_shadow_pmd)); -} -#else -static inline bool kasan_pmd_table(pud_t pud) -{ - return false; -} #endif pte_t kasan_early_shadow_pte[MAX_PTRS_PER_PTE + PTE_HWTABLE_PTRS] __page_aligned_bss; -static inline bool kasan_pte_table(pmd_t pmd) -{ - return pmd_page(pmd) == virt_to_page(lm_alias(kasan_early_shadow_pte)); -} - -static inline bool kasan_early_shadow_page_entry(pte_t pte) -{ - return pte_page(pte) == virt_to_page(lm_alias(kasan_early_shadow_page)); -} - static __init void *early_alloc(size_t size, int node) { void *ptr = memblock_alloc_try_nid(size, size, __pa(MAX_DMA_ADDRESS), -- 2.33.1