x86: cpa: set_memory_notpresent()

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 05bb12d..4757be7 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -559,8 +559,21 @@
 		free_page(addr);
 		totalram_pages++;
 	}
-	if (addr > __START_KERNEL_map)
-		global_flush_tlb();
+#ifdef CONFIG_DEBUG_RODATA
+	/*
+	 * This will make the __init pages not present and
+	 * not executable, so that any attempt to use a
+	 * __init function from now on will fault immediately
+	 * rather than supriously later when memory gets reused.
+	 *
+	 * We only do this for DEBUG_RODATA to not break up the
+	 * 2Mb kernel mapping just for this debug feature.
+	 */
+	if (begin >= __START_KERNEL_map) {
+		set_memory_np(begin, (end - begin)/PAGE_SIZE);
+		set_memory_nx(begin, (end - begin)/PAGE_SIZE);
+	}
+#endif
 }
 
 void free_initmem(void)