• Ingo Molnar's avatar
    x86: use the right protections for split-up pagetables · 07a66d7c
    Ingo Molnar authored
    Steven Rostedt found a bug in where in his modified kernel
    ftrace was unable to modify the kernel text, due to the PMD
    itself having been marked read-only as well in
    split_large_page().
    
    The fix, suggested by Linus, is to not try to 'clone' the
    reference protection of a huge-page, but to use the standard
    (and permissive) page protection bits of KERNPG_TABLE.
    
    The 'cloning' makes sense for the ptes but it's a confused and
    incorrect concept at the page table level - because the
    pagetable entry is a set of all ptes and hence cannot
    'clone' any single protection attribute - the ptes can be any
    mixture of protections.
    
    With the permissive KERNPG_TABLE, even if the pte protections
    get changed after this point (due to ftrace doing code-patching
    or other similar activities like kprobes), the resulting combined
    protections will still be correct and the pte's restrictive
    (or permissive) protections will control it.
    
    Also update the comment.
    
    This bug was there for a long time but has not caused visible
    problems before as it needs a rather large read-only area to
    trigger. Steve possibly hacked his kernel with some really
    large arrays or so. Anyway, the bug is definitely worth fixing.
    
    [ Huang Ying also experienced problems in this area when writing
      the EFI code, but the real bug in split_large_page() was not
      realized back then. ]
    Reported-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Reported-by: default avatarHuang Ying <ying.huang@intel.com>
    Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    07a66d7c
pageattr.c 27.7 KB