Commit 5b2c0713 authored by Andrey Konovalov's avatar Andrey Konovalov Committed by Linus Torvalds

kasan, page_alloc: move tag_clear_highpage out of kernel_init_free_pages

Currently, kernel_init_free_pages() serves two purposes: it either only
zeroes memory or zeroes both memory and memory tags via a different code
path.  As this function has only two callers, each using only one code
path, this behaviour is confusing.

Pull the code that zeroes both memory and tags out of
kernel_init_free_pages().

As a result of this change, the code in free_pages_prepare() starts to
look complicated, but this is improved in the few following patches.
Those improvements are not integrated into this patch to make diffs easier
to read.

This patch does no functional changes.

Link: https://lkml.kernel.org/r/7719874e68b23902629c7cf19f966c4fd5f57979.1643047180.git.andreyknvl@google.comSigned-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
Reviewed-by: default avatarAlexander Potapenko <glider@google.com>
Acked-by: default avatarMarco Elver <elver@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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 94ae8b83
...@@ -1278,16 +1278,10 @@ static inline bool should_skip_kasan_poison(struct page *page, fpi_t fpi_flags) ...@@ -1278,16 +1278,10 @@ static inline bool should_skip_kasan_poison(struct page *page, fpi_t fpi_flags)
PageSkipKASanPoison(page); PageSkipKASanPoison(page);
} }
static void kernel_init_free_pages(struct page *page, int numpages, bool zero_tags) static void kernel_init_free_pages(struct page *page, int numpages)
{ {
int i; int i;
if (zero_tags) {
for (i = 0; i < numpages; i++)
tag_clear_highpage(page + i);
return;
}
/* s390's use of memset() could override KASAN redzones. */ /* s390's use of memset() could override KASAN redzones. */
kasan_disable_current(); kasan_disable_current();
for (i = 0; i < numpages; i++) { for (i = 0; i < numpages; i++) {
...@@ -1383,7 +1377,7 @@ static __always_inline bool free_pages_prepare(struct page *page, ...@@ -1383,7 +1377,7 @@ static __always_inline bool free_pages_prepare(struct page *page,
bool init = want_init_on_free(); bool init = want_init_on_free();
if (init) if (init)
kernel_init_free_pages(page, 1 << order, false); kernel_init_free_pages(page, 1 << order);
if (!skip_kasan_poison) if (!skip_kasan_poison)
kasan_poison_pages(page, order, init); kasan_poison_pages(page, order, init);
} }
...@@ -2378,9 +2372,17 @@ inline void post_alloc_hook(struct page *page, unsigned int order, ...@@ -2378,9 +2372,17 @@ inline void post_alloc_hook(struct page *page, unsigned int order,
bool init = !want_init_on_free() && want_init_on_alloc(gfp_flags); bool init = !want_init_on_free() && want_init_on_alloc(gfp_flags);
kasan_unpoison_pages(page, order, init); kasan_unpoison_pages(page, order, init);
if (init)
kernel_init_free_pages(page, 1 << order, if (init) {
gfp_flags & __GFP_ZEROTAGS); if (gfp_flags & __GFP_ZEROTAGS) {
int i;
for (i = 0; i < 1 << order; i++)
tag_clear_highpage(page + i);
} else {
kernel_init_free_pages(page, 1 << order);
}
}
} }
set_page_owner(page, order, gfp_flags); set_page_owner(page, order, gfp_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment