Add set_ro_mostly_after_init_rw/ro pair to modify memory attributes for memory marked as `ro_mostly_after_init`.
I am doubtful that this is the right place where these functions reside and these functions are suitable for all architectures for memory attributes modification. Please comment. Signed-off-by: Hoeun Ryu <hoeun....@gmail.com> --- include/linux/init.h | 6 ++++++ init/main.c | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/linux/init.h b/include/linux/init.h index 79af096..d68e4f7 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -131,6 +131,12 @@ extern bool rodata_enabled; #endif #ifdef CONFIG_STRICT_KERNEL_RWX void mark_rodata_ro(void); + +void set_ro_mostly_after_init_rw(void); +void set_ro_mostly_after_init_ro(void); +#else +static inline void set_ro_mostly_after_init_rw(void) { } +static inline void set_ro_mostly_after_init_ro(void) { } #endif extern void (*late_time_init)(void); diff --git a/init/main.c b/init/main.c index 4719abf..a5d4873 100644 --- a/init/main.c +++ b/init/main.c @@ -941,6 +941,30 @@ static void mark_readonly(void) } else pr_info("Kernel memory protection disabled.\n"); } + +void set_ro_mostly_after_init_rw(void) +{ + unsigned long start = PFN_ALIGN(__start_data_ro_mostly_after_init); + unsigned long end = PFN_ALIGN(&__end_data_ro_mostly_after_init); + unsigned long nr_pages = (end - start) >> PAGE_SHIFT; + + if (!rodata_enabled) + return; + + set_memory_rw(start, nr_pages); +} + +void set_ro_mostly_after_init_ro(void) +{ + unsigned long start = PFN_ALIGN(__start_data_ro_mostly_after_init); + unsigned long end = PFN_ALIGN(&__end_data_ro_mostly_after_init); + unsigned long nr_pages = (end - start) >> PAGE_SHIFT; + + if (!rodata_enabled) + return; + + set_memory_ro(start, nr_pages); +} #else static inline void mark_readonly(void) { -- 2.7.4