kasan, page_alloc: merge kasan_alloc_pages into post_alloc_hook
authorAndrey Konovalov <andreyknvl@google.com>
Fri, 25 Mar 2022 01:10:31 +0000 (18:10 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 Mar 2022 02:06:46 +0000 (19:06 -0700)
Currently, the code responsible for initializing and poisoning memory in
post_alloc_hook() is scattered across two locations: kasan_alloc_pages()
hook for HW_TAGS KASAN and post_alloc_hook() itself.  This is confusing.

This and a few following patches combine the code from these two
locations.  Along the way, these patches do a step-by-step restructure the
many performed checks to make them easier to follow.

Replace the only caller of kasan_alloc_pages() with its implementation.

As kasan_has_integrated_init() is only true when CONFIG_KASAN_HW_TAGS is
enabled, moving the code does no functional changes.

Also move init and init_tags variables definitions out of
kasan_has_integrated_init() clause in post_alloc_hook(), as they have the
same values regardless of what the if condition evaluates to.

This patch is not useful by itself but makes the simplifications in the
following patches easier to follow.

Link: https://lkml.kernel.org/r/5ac7e0b30f5cbb177ec363ddd7878a3141289592.1643047180.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Acked-by: Marco Elver <elver@google.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Evgenii Stepanov <eugenis@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Collingbourne <pcc@google.com>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/kasan.h
mm/kasan/common.c
mm/kasan/hw_tags.c
mm/page_alloc.c

index dd2161af84e9faf24fcbb1fcbe31a9f7627661e3..4ed94616c8f0774daa79e89fd81378d181ea6809 100644 (file)
@@ -84,17 +84,8 @@ static inline void kasan_disable_current(void) {}
 
 #ifdef CONFIG_KASAN_HW_TAGS
 
-void kasan_alloc_pages(struct page *page, unsigned int order, gfp_t flags);
-
 #else /* CONFIG_KASAN_HW_TAGS */
 
-static __always_inline void kasan_alloc_pages(struct page *page,
-                                             unsigned int order, gfp_t flags)
-{
-       /* Only available for integrated init. */
-       BUILD_BUG();
-}
-
 #endif /* CONFIG_KASAN_HW_TAGS */
 
 static inline bool kasan_has_integrated_init(void)
index a0082fad48b12e9046165adce259659caf867416..d9079ec11f3131d9ee82a61891edcac3cdf660c0 100644 (file)
@@ -538,7 +538,7 @@ void * __must_check __kasan_kmalloc_large(const void *ptr, size_t size,
                return NULL;
 
        /*
-        * The object has already been unpoisoned by kasan_alloc_pages() for
+        * The object has already been unpoisoned by kasan_unpoison_pages() for
         * alloc_pages() or by kasan_krealloc() for krealloc().
         */
 
index c643740b8599694116905436cf58b4f1dd1259b1..76cf2b6229c799b53142153669edd4aaef5f35db 100644 (file)
@@ -192,28 +192,6 @@ void __init kasan_init_hw_tags(void)
                kasan_stack_collection_enabled() ? "on" : "off");
 }
 
-void kasan_alloc_pages(struct page *page, unsigned int order, gfp_t flags)
-{
-       /*
-        * This condition should match the one in post_alloc_hook() in
-        * page_alloc.c.
-        */
-       bool init = !want_init_on_free() && want_init_on_alloc(flags);
-       bool init_tags = init && (flags & __GFP_ZEROTAGS);
-
-       if (flags & __GFP_SKIP_KASAN_POISON)
-               SetPageSkipKASanPoison(page);
-
-       if (init_tags) {
-               int i;
-
-               for (i = 0; i != 1 << order; ++i)
-                       tag_clear_highpage(page + i);
-       } else {
-               kasan_unpoison_pages(page, order, init);
-       }
-}
-
 #if IS_ENABLED(CONFIG_KASAN_KUNIT_TEST)
 
 void kasan_enable_tagging_sync(void)
index d2d6e48d2d8365437fc17c8b3dfd24297ec55dbc..db82facf14e75ef303ba5566f83e55e1e2205c8e 100644 (file)
@@ -2346,6 +2346,9 @@ static inline bool check_new_pcp(struct page *page, unsigned int order)
 inline void post_alloc_hook(struct page *page, unsigned int order,
                                gfp_t gfp_flags)
 {
+       bool init = !want_init_on_free() && want_init_on_alloc(gfp_flags);
+       bool init_tags = init && (gfp_flags & __GFP_ZEROTAGS);
+
        set_page_private(page, 0);
        set_page_refcounted(page);
 
@@ -2361,15 +2364,22 @@ inline void post_alloc_hook(struct page *page, unsigned int order,
 
        /*
         * As memory initialization might be integrated into KASAN,
-        * kasan_alloc_pages and kernel_init_free_pages must be
+        * KASAN unpoisoning and memory initializion code must be
         * kept together to avoid discrepancies in behavior.
         */
        if (kasan_has_integrated_init()) {
-               kasan_alloc_pages(page, order, gfp_flags);
-       } else {
-               bool init = !want_init_on_free() && want_init_on_alloc(gfp_flags);
-               bool init_tags = init && (gfp_flags & __GFP_ZEROTAGS);
+               if (gfp_flags & __GFP_SKIP_KASAN_POISON)
+                       SetPageSkipKASanPoison(page);
+
+               if (init_tags) {
+                       int i;
 
+                       for (i = 0; i != 1 << order; ++i)
+                               tag_clear_highpage(page + i);
+               } else {
+                       kasan_unpoison_pages(page, order, init);
+               }
+       } else {
                kasan_unpoison_pages(page, order, init);
 
                if (init_tags) {