#define __read_mostly __attribute__((__section__(".data..read_mostly")))
 
-/* Read-only memory is marked before mark_rodata_ro() is called. */
-#define __ro_after_init __read_mostly
-
 #endif
 
 #include <asm-generic/sections.h>
 
 extern char _eshared[], _ehead[];
+extern char __start_ro_after_init[], __end_ro_after_init[];
 
 #endif
 
  */
 #define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir)
 
+/* Handle ro_after_init data on our own. */
+#define RO_AFTER_INIT_DATA
+
 #include <asm-generic/vmlinux.lds.h>
 
 OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
        _eshared = .;           /* End of shareable data */
        _sdata = .;             /* Start of data section */
 
-       EXCEPTION_TABLE(16) :data
+       . = ALIGN(PAGE_SIZE);
+       __start_ro_after_init = .;
+       .data..ro_after_init : {
+                *(.data..ro_after_init)
+       }
+       EXCEPTION_TABLE(16)
+       . = ALIGN(PAGE_SIZE);
+       __end_ro_after_init = .;
 
        RW_DATA_SECTION(0x100, PAGE_SIZE, THREAD_SIZE)
 
 
 
 void mark_rodata_ro(void)
 {
-       /* Text and rodata are already protected. Nothing to do here. */
-       pr_info("Write protecting the kernel read-only data: %luk\n",
-               ((unsigned long)&_eshared - (unsigned long)&_stext) >> 10);
+       unsigned long size = __end_ro_after_init - __start_ro_after_init;
+
+       set_memory_ro((unsigned long)__start_ro_after_init, size >> PAGE_SHIFT);
+       pr_info("Write protected read-only-after-init data: %luk\n", size >> 10);
 }
 
 void __init mem_init(void)
 
  */
 void __init vmem_map_init(void)
 {
-       unsigned long ro_start, ro_end;
+       unsigned long size = _eshared - _stext;
        struct memblock_region *reg;
 
        for_each_memblock(memory, reg)
                vmem_add_mem(reg->base, reg->size);
-       ro_start = PFN_ALIGN((unsigned long)&_stext);
-       ro_end = (unsigned long)&_eshared & PAGE_MASK;
-       set_memory_ro(ro_start, (ro_end - ro_start) >> PAGE_SHIFT);
+       set_memory_ro((unsigned long)_stext, size >> PAGE_SHIFT);
+       pr_info("Write protected kernel read-only data: %luk\n", size >> 10);
 }
 
 /*