Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1702476

[v4 10/15] x86/kasan: explicitly zero kasan shadow memory

From Pavel Tatashin <pasha.tatashin@oracle.com>
Newsgroups linux.kernel
Subject [v4 10/15] x86/kasan: explicitly zero kasan shadow memory
Date 2017-08-02 22:50 +0200
Message-ID <ua8KC-6uU-31@gated-at.bofh.it> (permalink)
References <ua8AW-6r3-21@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


To optimize the performance of struct page initialization,
vmemmap_populate() will no longer zero memory.

We must explicitly zero the memory that is allocated by vmemmap_populate()
for kasan, as this memory does not go through struct page initialization
path.

Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>
Reviewed-by: Steven Sistare <steven.sistare@oracle.com>
Reviewed-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Reviewed-by: Bob Picco <bob.picco@oracle.com>
---
 arch/x86/mm/kasan_init_64.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/arch/x86/mm/kasan_init_64.c b/arch/x86/mm/kasan_init_64.c
index 02c9d7553409..7d06cf0b0b6e 100644
--- a/arch/x86/mm/kasan_init_64.c
+++ b/arch/x86/mm/kasan_init_64.c
@@ -84,6 +84,28 @@ static struct notifier_block kasan_die_notifier = {
 };
 #endif
 
+/*
+ * Memory that was allocated by vmemmap_populate is not zeroed, so we must
+ * zero it here explicitly.
+ */
+static void
+zero_vemmap_populated_memory(void)
+{
+	u64 i, start, end;
+
+	for (i = 0; i < E820_MAX_ENTRIES && pfn_mapped[i].end; i++) {
+		void *kaddr_start = pfn_to_kaddr(pfn_mapped[i].start);
+		void *kaddr_end = pfn_to_kaddr(pfn_mapped[i].end);
+
+		start = (u64)kasan_mem_to_shadow(kaddr_start);
+		end = (u64)kasan_mem_to_shadow(kaddr_end);
+		memset((void *)start, 0, end - start);
+	}
+	start = (u64)kasan_mem_to_shadow(_stext);
+	end = (u64)kasan_mem_to_shadow(_end);
+	memset((void *)start, 0, end - start);
+}
+
 void __init kasan_early_init(void)
 {
 	int i;
@@ -156,6 +178,13 @@ void __init kasan_init(void)
 		pte_t pte = __pte(__pa(kasan_zero_page) | __PAGE_KERNEL_RO);
 		set_pte(&kasan_zero_pte[i], pte);
 	}
+
+	/*
+	 * vmemmap_populate does not zero the memory, so we need to zero it
+	 * explicitly
+	 */
+	zero_vemmap_populated_memory();
+
 	/* Flush TLBs again to be sure that write protection applied. */
 	__flush_tlb_all();
 
-- 
2.13.3

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[v4 00/15] complete deferred page initialization Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:40 +0200
  [v4 14/15] mm: optimize early system hash allocations Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:40 +0200
  [v4 03/15] sparc64/mm: setting fields in deferred pages Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 06/15] sparc64: simplify vmemmap_populate Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 01/15] x86/mm: reserve only exiting low pages Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 02/15] x86/mm: setting fields in deferred pages Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 15/15] mm: debug for raw alloctor Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 09/15] sparc64: optimized struct page zeroing Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 12/15] mm: explicitly zero pagetable memory Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 10/15] x86/kasan: explicitly zero kasan shadow memory Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 04/15] mm: discard memblock data later Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 08/15] mm: zero struct pages during initialization Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 11/15] arm64/kasan: explicitly zero kasan shadow memory Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 07/15] mm: defining memblock_virt_alloc_try_nid_raw Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200
  [v4 05/15] mm: don't accessed uninitialized struct pages Pavel Tatashin <pasha.tatashin@oracle.com> - 2017-08-02 22:50 +0200

csiph-web