linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: andrey.konovalov@linux.dev
To: Marco Elver <elver@google.com>,
	Alexander Potapenko <glider@google.com>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Andrey Konovalov <andreyknvl@gmail.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Andrey Ryabinin <ryabinin.a.a@gmail.com>,
	kasan-dev@googlegroups.com, linux-mm@kvack.org,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	Peter Collingbourne <pcc@google.com>,
	Evgenii Stepanov <eugenis@google.com>,
	linux-kernel@vger.kernel.org,
	Andrey Konovalov <andreyknvl@google.com>
Subject: [PATCH mm v4 01/39] kasan, page_alloc: deduplicate should_skip_kasan_poison
Date: Mon, 20 Dec 2021 22:58:16 +0100	[thread overview]
Message-ID: <157f8aec0be7f54666b9cc433a0c0450416b68b4.1640036051.git.andreyknvl@google.com> (raw)
In-Reply-To: <cover.1640036051.git.andreyknvl@google.com>

From: Andrey Konovalov <andreyknvl@google.com>

Currently, should_skip_kasan_poison() has two definitions: one for when
CONFIG_DEFERRED_STRUCT_PAGE_INIT is enabled, one for when it's not.

Instead of duplicating the checks, add a deferred_pages_enabled()
helper and use it in a single should_skip_kasan_poison() definition.

Also move should_skip_kasan_poison() closer to its caller and clarify
all conditions in the comment.

Signed-off-by: Andrey Konovalov <andreyknvl@google.com>

---

Changes v2->v3:
- Update patch description.
---
 mm/page_alloc.c | 55 +++++++++++++++++++++++++++++--------------------
 1 file changed, 33 insertions(+), 22 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index edfd6c81af82..f0bcecac19cd 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -377,25 +377,9 @@ int page_group_by_mobility_disabled __read_mostly;
  */
 static DEFINE_STATIC_KEY_TRUE(deferred_pages);
 
-/*
- * Calling kasan_poison_pages() only after deferred memory initialization
- * has completed. Poisoning pages during deferred memory init will greatly
- * lengthen the process and cause problem in large memory systems as the
- * deferred pages initialization is done with interrupt disabled.
- *
- * Assuming that there will be no reference to those newly initialized
- * pages before they are ever allocated, this should have no effect on
- * KASAN memory tracking as the poison will be properly inserted at page
- * allocation time. The only corner case is when pages are allocated by
- * on-demand allocation and then freed again before the deferred pages
- * initialization is done, but this is not likely to happen.
- */
-static inline bool should_skip_kasan_poison(struct page *page, fpi_t fpi_flags)
+static inline bool deferred_pages_enabled(void)
 {
-	return static_branch_unlikely(&deferred_pages) ||
-	       (!IS_ENABLED(CONFIG_KASAN_GENERIC) &&
-		(fpi_flags & FPI_SKIP_KASAN_POISON)) ||
-	       PageSkipKASanPoison(page);
+	return static_branch_unlikely(&deferred_pages);
 }
 
 /* Returns true if the struct page for the pfn is uninitialised */
@@ -446,11 +430,9 @@ defer_init(int nid, unsigned long pfn, unsigned long end_pfn)
 	return false;
 }
 #else
-static inline bool should_skip_kasan_poison(struct page *page, fpi_t fpi_flags)
+static inline bool deferred_pages_enabled(void)
 {
-	return (!IS_ENABLED(CONFIG_KASAN_GENERIC) &&
-		(fpi_flags & FPI_SKIP_KASAN_POISON)) ||
-	       PageSkipKASanPoison(page);
+	return false;
 }
 
 static inline bool early_page_uninitialised(unsigned long pfn)
@@ -1270,6 +1252,35 @@ static int free_tail_pages_check(struct page *head_page, struct page *page)
 	return ret;
 }
 
+/*
+ * Skip KASAN memory poisoning when either:
+ *
+ * 1. Deferred memory initialization has not yet completed,
+ *    see the explanation below.
+ * 2. Skipping poisoning is requested via FPI_SKIP_KASAN_POISON,
+ *    see the comment next to it.
+ * 3. Skipping poisoning is requested via __GFP_SKIP_KASAN_POISON,
+ *    see the comment next to it.
+ *
+ * Poisoning pages during deferred memory init will greatly lengthen the
+ * process and cause problem in large memory systems as the deferred pages
+ * initialization is done with interrupt disabled.
+ *
+ * Assuming that there will be no reference to those newly initialized
+ * pages before they are ever allocated, this should have no effect on
+ * KASAN memory tracking as the poison will be properly inserted at page
+ * allocation time. The only corner case is when pages are allocated by
+ * on-demand allocation and then freed again before the deferred pages
+ * initialization is done, but this is not likely to happen.
+ */
+static inline bool should_skip_kasan_poison(struct page *page, fpi_t fpi_flags)
+{
+	return deferred_pages_enabled() ||
+	       (!IS_ENABLED(CONFIG_KASAN_GENERIC) &&
+		(fpi_flags & FPI_SKIP_KASAN_POISON)) ||
+	       PageSkipKASanPoison(page);
+}
+
 static void kernel_init_free_pages(struct page *page, int numpages, bool zero_tags)
 {
 	int i;
-- 
2.25.1


  reply	other threads:[~2021-12-20 21:59 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-20 21:58 [PATCH mm v4 00/39] kasan, vmalloc, arm64: add vmalloc tagging support for SW/HW_TAGS andrey.konovalov
2021-12-20 21:58 ` andrey.konovalov [this message]
2021-12-20 21:58 ` [PATCH mm v4 02/39] kasan, page_alloc: move tag_clear_highpage out of kernel_init_free_pages andrey.konovalov
2021-12-20 21:58 ` [PATCH mm v4 03/39] kasan, page_alloc: merge kasan_free_pages into free_pages_prepare andrey.konovalov
2021-12-20 21:58 ` [PATCH mm v4 04/39] kasan, page_alloc: simplify kasan_poison_pages call site andrey.konovalov
2021-12-20 21:58 ` [PATCH mm v4 05/39] kasan, page_alloc: init memory of skipped pages on free andrey.konovalov
2021-12-20 21:58 ` [PATCH mm v4 06/39] kasan: drop skip_kasan_poison variable in free_pages_prepare andrey.konovalov
2021-12-20 21:58 ` [PATCH mm v4 07/39] mm: clarify __GFP_ZEROTAGS comment andrey.konovalov
2021-12-21  9:16   ` Alexander Potapenko
2021-12-30 19:11     ` Andrey Konovalov
2021-12-20 21:58 ` [PATCH mm v4 08/39] kasan: only apply __GFP_ZEROTAGS when memory is zeroed andrey.konovalov
2021-12-20 21:58 ` [PATCH mm v4 09/39] kasan, page_alloc: refactor init checks in post_alloc_hook andrey.konovalov
2021-12-20 21:58 ` [PATCH mm v4 10/39] kasan, page_alloc: merge kasan_alloc_pages into post_alloc_hook andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 11/39] kasan, page_alloc: combine tag_clear_highpage calls in post_alloc_hook andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 12/39] kasan, page_alloc: move SetPageSkipKASanPoison " andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 13/39] kasan, page_alloc: move kernel_init_free_pages " andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 14/39] kasan, page_alloc: rework kasan_unpoison_pages call site andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 15/39] kasan: clean up metadata byte definitions andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 16/39] kasan: define KASAN_VMALLOC_INVALID for SW_TAGS andrey.konovalov
2021-12-21  9:23   ` Alexander Potapenko
2021-12-20 21:59 ` [PATCH mm v4 17/39] kasan, x86, arm64, s390: rename functions for modules shadow andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 18/39] kasan, vmalloc: drop outdated VM_KASAN comment andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 19/39] kasan: reorder vmalloc hooks andrey.konovalov
2021-12-20 21:59 ` [PATCH mm v4 20/39] kasan: add wrappers for " andrey.konovalov
2021-12-21 14:21   ` Alexander Potapenko
2021-12-20 21:59 ` [PATCH mm v4 21/39] kasan, vmalloc: reset tags in vmalloc functions andrey.konovalov
2021-12-20 22:01 ` [PATCH mm v4 22/39] kasan, fork: reset pointer tags of vmapped stacks andrey.konovalov
2021-12-21 15:11   ` Alexander Potapenko
2021-12-20 22:01 ` [PATCH mm v4 23/39] kasan, arm64: " andrey.konovalov
2021-12-20 22:01 ` [PATCH mm v4 24/39] kasan, vmalloc: add vmalloc tagging for SW_TAGS andrey.konovalov
2021-12-20 22:01 ` [PATCH mm v4 25/39] kasan, vmalloc, arm64: mark vmalloc mappings as pgprot_tagged andrey.konovalov
2021-12-20 22:01 ` [PATCH mm v4 26/39] kasan, vmalloc: unpoison VM_ALLOC pages after mapping andrey.konovalov
2021-12-21 11:50   ` Alexander Potapenko
2021-12-20 22:01 ` [PATCH mm v4 27/39] kasan, mm: only define ___GFP_SKIP_KASAN_POISON with HW_TAGS andrey.konovalov
2021-12-20 22:02 ` [PATCH mm v4 28/39] kasan, page_alloc: allow skipping unpoisoning for HW_TAGS andrey.konovalov
2021-12-21 12:04   ` Marco Elver
2021-12-30 19:11     ` Andrey Konovalov
2021-12-21 12:14   ` Marco Elver
2021-12-21 12:19     ` Marco Elver
2021-12-20 22:02 ` [PATCH mm v4 29/39] kasan, page_alloc: allow skipping memory init " andrey.konovalov
2021-12-21 12:11   ` Marco Elver
2021-12-30 19:11     ` Andrey Konovalov
2021-12-21 12:30   ` Marco Elver
2021-12-30 19:11     ` Andrey Konovalov
2021-12-20 22:02 ` [PATCH mm v4 30/39] kasan, vmalloc: add vmalloc tagging " andrey.konovalov
2021-12-20 22:02 ` [PATCH mm v4 31/39] kasan, vmalloc: only tag normal vmalloc allocations andrey.konovalov
2021-12-20 22:02 ` [PATCH mm v4 32/39] kasan, arm64: don't tag executable " andrey.konovalov
2021-12-20 22:05   ` Andrey Konovalov
2021-12-22 11:11   ` Catalin Marinas
2021-12-20 22:02 ` [PATCH mm v4 33/39] kasan: mark kasan_arg_stacktrace as __initdata andrey.konovalov
2021-12-20 22:02 ` [PATCH mm v4 34/39] kasan: simplify kasan_init_hw_tags andrey.konovalov
2021-12-20 22:02 ` [PATCH mm v4 35/39] kasan: add kasan.vmalloc command line flag andrey.konovalov
2021-12-21 14:43   ` Alexander Potapenko
2021-12-30 19:11     ` Andrey Konovalov
2021-12-20 22:03 ` [PATCH mm v4 36/39] kasan: allow enabling KASAN_VMALLOC and SW/HW_TAGS andrey.konovalov
2021-12-20 22:03 ` [PATCH mm v4 37/39] arm64: select KASAN_VMALLOC for SW/HW_TAGS modes andrey.konovalov
2021-12-20 22:03 ` [PATCH mm v4 38/39] kasan: documentation updates andrey.konovalov
2021-12-20 22:03 ` [PATCH mm v4 39/39] kasan: improve vmalloc tests andrey.konovalov
2021-12-22  7:00 ` [PATCH mm v4 00/39] kasan, vmalloc, arm64: add vmalloc tagging support for SW/HW_TAGS Marco Elver
2021-12-30 19:11   ` Andrey Konovalov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=157f8aec0be7f54666b9cc433a0c0450416b68b4.1640036051.git.andreyknvl@google.com \
    --to=andrey.konovalov@linux.dev \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@gmail.com \
    --cc=andreyknvl@google.com \
    --cc=catalin.marinas@arm.com \
    --cc=dvyukov@google.com \
    --cc=elver@google.com \
    --cc=eugenis@google.com \
    --cc=glider@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mark.rutland@arm.com \
    --cc=pcc@google.com \
    --cc=ryabinin.a.a@gmail.com \
    --cc=vincenzo.frascino@arm.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).