linux/arch/x86/mm
Ingo Molnar 07a66d7c53 x86: use the right protections for split-up pagetables
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: Steven Rostedt <rostedt@goodmis.org>
Reported-by: Huang Ying <ying.huang@intel.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2009-02-20 08:35:03 +01:00
..
dump_pagetables.c
extable.c
fault.c prevent kprobes from catching spurious page faults 2009-02-05 17:01:50 -08:00
gup.c
highmem_32.c
hugetlbpage.c
init_32.c x86: fix assumed to be contiguous leaf page tables for kmap_atomic region (take 2) 2009-01-16 13:47:04 +01:00
init_64.c x86: remove kernel_physical_mapping_init() from init section 2009-01-20 00:31:43 +01:00
iomap_32.c x86: work around PAGE_KERNEL_WC not getting WC in iomap_atomic_prot_pfn. 2009-01-26 11:14:27 +01:00
ioremap.c x86, pat: fix warn_on_once() while mapping 0-1MB range with /dev/mem 2009-02-12 08:27:27 +01:00
k8topology_64.c x86: k8 numa register active regions later 2009-01-06 13:21:21 +01:00
kmmio.c
Makefile
memtest.c
mmap.c
mmio-mod.c
numa_32.c trivial: replace last usages of __FUNCTION__ in kernel 2009-01-07 15:48:54 -08:00
numa_64.c mm: clean up for early_pfn_to_nid() 2009-02-18 15:37:55 -08:00
pageattr-test.c
pageattr.c x86: use the right protections for split-up pagetables 2009-02-20 08:35:03 +01:00
pat.c x86, pat: fix warn_on_once() while mapping 0-1MB range with /dev/mem 2009-02-12 08:27:27 +01:00
pf_in.c
pf_in.h
pgtable_32.c
pgtable.c
srat_32.c
srat_64.c x86: prepare for cpumask iterators to only go to nr_cpu_ids 2008-12-16 17:40:58 -08:00
testmmiotrace.c