diff --git a/include/linux/mm.h b/include/linux/mm.h index abaeac6c7e8e..71cf4d4365f5 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -90,13 +90,13 @@ extern int sysctl_legacy_va_layout; #endif #ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS -extern const int mmap_rnd_bits_min; +extern int mmap_rnd_bits_min __ro_after_init; extern int mmap_rnd_bits_max __ro_after_init; extern int mmap_rnd_bits __read_mostly; #endif #ifdef CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS -extern const int mmap_rnd_compat_bits_min; -extern const int mmap_rnd_compat_bits_max; +extern int mmap_rnd_compat_bits_min __ro_after_init; +extern int mmap_rnd_compat_bits_max __ro_after_init; extern int mmap_rnd_compat_bits __read_mostly; #endif diff --git a/mm/mmap.c b/mm/mmap.c index 48ad2e001ad6..2f8383c61f5b 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -66,13 +66,13 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(vm_unmapped_area); #endif #ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS -const int mmap_rnd_bits_min = CONFIG_ARCH_MMAP_RND_BITS_MIN; +int mmap_rnd_bits_min __ro_after_init = CONFIG_ARCH_MMAP_RND_BITS_MIN; int mmap_rnd_bits_max __ro_after_init = CONFIG_ARCH_MMAP_RND_BITS_MAX; int mmap_rnd_bits __read_mostly = CONFIG_ARCH_MMAP_RND_BITS; #endif #ifdef CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS -const int mmap_rnd_compat_bits_min = CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN; -const int mmap_rnd_compat_bits_max = CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX; +int mmap_rnd_compat_bits_min __ro_after_init = CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN; +int mmap_rnd_compat_bits_max __ro_after_init = CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX; int mmap_rnd_compat_bits __read_mostly = CONFIG_ARCH_MMAP_RND_COMPAT_BITS; #endif diff --git a/mm/page_size_compat.c b/mm/page_size_compat.c index 5cb3e9d3d07b..88708c3f4779 100644 --- a/mm/page_size_compat.c +++ b/mm/page_size_compat.c @@ -9,10 +9,12 @@ #include #include #include +#include #include #define MIN_PAGE_SHIFT_COMPAT (PAGE_SHIFT + 1) #define MAX_PAGE_SHIFT_COMPAT 16 /* Max of 64KB */ +#define __MMAP_RND_BITS(x) (x - (__PAGE_SHIFT - PAGE_SHIFT)) DEFINE_STATIC_KEY_FALSE(page_shift_compat_enabled); @@ -39,3 +41,18 @@ static int __init early_page_shift_compat(char *buf) return 0; } early_param("androidboot.page_shift", early_page_shift_compat); + +static int __init init_mmap_rnd_bits(void) +{ + if (!static_branch_unlikely(&page_shift_compat_enabled)) + return 0; + +#ifdef CONFIG_HAVE_ARCH_MMAP_RND_BITS + mmap_rnd_bits_min = __MMAP_RND_BITS(CONFIG_ARCH_MMAP_RND_BITS_MIN); + mmap_rnd_bits_max = __MMAP_RND_BITS(CONFIG_ARCH_MMAP_RND_BITS_MAX); + mmap_rnd_bits = __MMAP_RND_BITS(CONFIG_ARCH_MMAP_RND_BITS); +#endif + + return 0; +} +core_initcall(init_mmap_rnd_bits);