diff options
Diffstat (limited to 'arch/x86/mm/init_64.c')
-rw-r--r-- | arch/x86/mm/init_64.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 05bb12db0b0..4757be7b5e5 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -559,8 +559,21 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) 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) |