Patch "x86/mm: Do not forbid _PAGE_RW before init for __ro_after_init" has been added to the 4.4-stable tree
Subsystems (3)
[email protected]
AppliedThis is a note to let you know that I've just added the patch titled
x86/mm: Do not forbid _PAGE_RW before init for __ro_after_init
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-mm-do-not-forbid-_page_rw-before-init-for-__ro_after_init.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Wed May 2 11:39:22 PDT 2018
From: Dave Hansen <[email protected]>
Date: Fri, 6 Apr 2018 13:55:14 -0700
Subject: x86/mm: Do not forbid _PAGE_RW before init for __ro_after_init
From: Dave Hansen <[email protected]>
[ Upstream commit 639d6aafe437a7464399d2a77d006049053df06f ]
__ro_after_init data gets stuck in the .rodata section. That's normally fine because the kernel itself manages the R/W properties.
But, if we run __change_page_attr() on an area which is __ro_after_init, the .rodata checks will trigger and force the area to be immediately read-only, even if it is early-ish in boot. This caused problems when trying to clear the _PAGE_GLOBAL bit for these area in the PTI code:
it cleared _PAGE_GLOBAL like I asked, but also took it up on itself to clear _PAGE_RW. The kernel then oopses the next time it wrote to a __ro_after_init data structure.
To fix this, add the kernel_set_to_readonly check, just like we have for kernel text, just a few lines below in this function.
--- arch/x86/mm/pageattr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/x86/mm/pageattr.c +4 -2
@@ -273,9 +273,11 @@ static inline pgprot_t static_protection/* * The .rodata section needs to be read-only. Using the pfn -* catches all aliases. +* catches all aliases. This also includes __ro_after_init, +* so do not enforce until kernel_set_to_readonly is true. */ -if (within (pfn,__pa_symbol (__start_rodata) >>PAGE_SHIFT , +if (kernel_set_to_readonly && +within (pfn,__pa_symbol (__start_rodata) >>PAGE_SHIFT ,__pa_symbol (__end_rodata) >>PAGE_SHIFT ))pgprot_val (forbidden) |= _PAGE_RW;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/x86-mm-do-not-forbid-_page_rw-before-init-for-__ro_after_init.patch