#ifdef CONFIG_DEBUG_RODATA
 void mark_rodata_ro(void);
 extern const int rodata_test_data;
+extern int kernel_set_to_readonly;
 void set_kernel_text_rw(void);
 void set_kernel_text_ro(void);
 #else
 
 const int rodata_test_data = 0xC3;
 EXPORT_SYMBOL_GPL(rodata_test_data);
 
-static int kernel_set_to_readonly;
+int kernel_set_to_readonly __read_mostly;
 
 void set_kernel_text_rw(void)
 {
 
 const int rodata_test_data = 0xC3;
 EXPORT_SYMBOL_GPL(rodata_test_data);
 
-static int kernel_set_to_readonly;
+int kernel_set_to_readonly;
 
 void set_kernel_text_rw(void)
 {
 
 #if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) && \
        !defined(CONFIG_DYNAMIC_FTRACE)
        /*
-        * Kernel text mappings for the large page aligned .rodata section
-        * will be read-only. For the kernel identity mappings covering
-        * the holes caused by this alignment can be anything.
+        * Once the kernel maps the text as RO (kernel_set_to_readonly is set),
+        * kernel text mappings for the large page aligned text, rodata sections
+        * will be always read-only. For the kernel identity mappings covering
+        * the holes caused by this alignment can be anything that user asks.
         *
         * This will preserve the large page mappings for kernel text/data
         * at no extra cost.
         */
-       if (within(address, (unsigned long)_text,
+       if (kernel_set_to_readonly &&
+           within(address, (unsigned long)_text,
                   (unsigned long)__end_rodata_hpage_align))
                pgprot_val(forbidden) |= _PAGE_RW;
 #endif